| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,8 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | 31 | from smpplib import consts, exceptions, smpp | |
| 32 | 32 | ||
| 33 | - logger = logging.getLogger('smpplib.client') | ||
| 34 | - | ||
| 33 | + logger = logging.getLogger(__name__) | ||
| 35 | 34 | ||
| 36 | 35 | class SimpleSequenceGenerator(object): | |
| 37 | 36 | ||
@@ -98,15 +97,16 @@ def sequence(self): | |||
| 98 | 97 | def next_sequence(self): | |
| 99 | 98 | return self.sequence_generator.next_sequence() | |
| 100 | 99 | ||
| 101 | - def connect(self): | ||
| 100 | + def connect(self, timeout=5): | ||
| 102 | 101 | """Connect to SMSC""" | |
| 103 | 102 | ||
| 104 | 103 | logger.info('Connecting to %s:%s...', self.host, self.port) | |
| 105 | 104 | ||
| 106 | 105 | try: | |
| 107 | 106 | if self._socket is None: | |
| 108 | 107 | self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| 109 | - self._socket.connect((self.host, self.port)) | ||
| 108 | + self._socket.settimeout(timeout) | ||
| 109 | + self._socket.connect((self.host, self.port)) | ||
| 110 | 110 | self.state = consts.SMPP_CLIENT_STATE_OPEN | |
| 111 | 111 | except socket.error: | |
| 112 | 112 | raise exceptions.ConnectionError("Connection refused") | |
@@ -264,7 +264,11 @@ def set_message_received_handler(self, func): | |||
| 264 | 264 | def set_message_sent_handler(self, func): | |
| 265 | 265 | """Set new function to handle message sent event""" | |
| 266 | 266 | self.message_sent_handler = func | |
| 267 | - | ||
| 267 | + | ||
| 268 | + def set_unbind_handler(self, func): | ||
| 269 | + """Set new function to handle message sent event""" | ||
| 270 | + self.unbind_handler = func | ||
| 271 | + | ||
| 268 | 272 | @staticmethod | |
| 269 | 273 | def message_received_handler(pdu, **kwargs): | |
| 270 | 274 | """Custom handler to process received message. May be overridden""" | |
@@ -279,6 +283,11 @@ def message_sent_handler(pdu, **kwargs): | |||
| 279 | 283 | """ | |
| 280 | 284 | logger.warning('Message sent handler (Override me)') | |
| 281 | 285 | ||
| 286 | + @staticmethod | ||
| 287 | + def unbind_handler(pdu, **kwargs): | ||
| 288 | + """Custom handler to process unbind. May be overridden""" | ||
| 289 | + logger.warning('unbind received handler (Override me)') | ||
| 290 | + | ||
| 282 | 291 | def read_once(self, ignore_error_codes=None): | |
| 283 | 292 | """Read a PDU and act""" | |
| 284 | 293 | try: | |
@@ -299,8 +308,9 @@ def read_once(self, ignore_error_codes=None): | |||
| 299 | 308 | ) | |
| 300 | 309 | ||
| 301 | 310 | if pdu.command == 'unbind': # unbind_res | |
| 302 | - logger.info('Unbind command received') | ||
| 303 | - return | ||
| 311 | + logger.warning('Unbind command received') | ||
| 312 | + self.state = consts.SMPP_CLIENT_STATE_OPEN | ||
| 313 | + self.unbind_handler(pdu) | ||
| 304 | 314 | elif pdu.command == 'submit_sm_resp': | |
| 305 | 315 | self.message_sent_handler(pdu=pdu) | |
| 306 | 316 | elif pdu.command == 'deliver_sm': | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -90,7 +90,9 @@ class Command(pdu.PDU): | |||
| 90 | 90 | """SMPP PDU Command class""" | |
| 91 | 91 | ||
| 92 | 92 | params = {} | |
| 93 | - | ||
| 93 | + #UDHI params(Message identifier/Message parts/Message part number) | ||
| 94 | + params_udhi_order = ('sar_msg_ref_num', 'sar_total_segments', 'sar_segment_seqnum') | ||
| 95 | + | ||
| 94 | 96 | def __init__(self, command, need_sequence=True, **kwargs): | |
| 95 | 97 | super(Command, self).__init__(**kwargs) | |
| 96 | 98 | ||
@@ -271,6 +273,30 @@ def _parse_string(self, field, data, pos, length=None): | |||
| 271 | 273 | ||
| 272 | 274 | return data, pos | |
| 273 | 275 | ||
| 276 | + def _parse_udhi(self, field, data, pos, length): | ||
| 277 | + """Parse long message param (GSM UDHI) | ||
| 278 | + Return (pos, length) tuple.""" | ||
| 279 | + | ||
| 280 | + udhi_field = self.params[field].udhi_field | ||
| 281 | + udhi_flag = int(getattr(self, udhi_field)) | ||
| 282 | + | ||
| 283 | + #01xxxxxx UDHI, only for MT message | ||
| 284 | + if udhi_flag & consts.UDHI_INDICATOR_SET: | ||
| 285 | + udhi_data = struct.unpack(">" + "b", data[pos:pos + 1]) | ||
| 286 | + udhi_len = int(udhi_data[0]) | ||
| 287 | + length = length - udhi_len - 1 | ||
| 288 | + pos += 3 | ||
| 289 | + | ||
| 290 | + for field_udhi in self.params_udhi_order: | ||
| 291 | + size = self.params[field_udhi].size | ||
| 292 | + fmt = self._int_pack_format(field_udhi) | ||
| 293 | + unpacked_data = struct.unpack(">" + fmt, data[pos:pos + size]) | ||
| 294 | + field_value = ''.join(map(str, unpacked_data)) | ||
| 295 | + setattr(self, field_udhi, field_value) | ||
| 296 | + pos += size | ||
| 297 | + | ||
| 298 | + return pos, length | ||
| 299 | + | ||
| 274 | 300 | def _parse_ostring(self, field, data, pos, length=None): | |
| 275 | 301 | """ | |
| 276 | 302 | Parse an octet string from a PDU. | |
@@ -279,7 +305,8 @@ def _parse_ostring(self, field, data, pos, length=None): | |||
| 279 | 305 | ||
| 280 | 306 | if length is None: | |
| 281 | 307 | length_field = self.params[field].len_field | |
| 282 | - length = int(getattr(self, length_field)) | ||
| 308 | + length = int(getattr(self, length_field)) | ||
| 309 | + pos, length = self._parse_udhi(field, data, pos, length) | ||
| 283 | 310 | ||
| 284 | 311 | setattr(self, field, data[pos:pos + length]) | |
| 285 | 312 | pos += length | |
@@ -472,7 +499,7 @@ class DataSM(Command): | |||
| 472 | 499 | 'dest_network_type': Param(type=int, size=1), | |
| 473 | 500 | 'dest_bearer_type': Param(type=int, size=1), | |
| 474 | 501 | 'dest_telematics_id': Param(type=int, size=2), | |
| 475 | - 'sar_msg_ref_num': Param(type=int, size=2), | ||
| 502 | + 'sar_msg_ref_num': Param(type=int, size=1), | ||
| 476 | 503 | 'sar_total_segments': Param(type=int, size=1), | |
| 477 | 504 | 'sar_segment_seqnum': Param(type=int, size=1), | |
| 478 | 505 | 'more_messages_to_send': Param(type=int, size=1), | |
@@ -620,6 +647,11 @@ class SubmitSM(Command): | |||
| 620 | 647 | ||
| 621 | 648 | # Up to 254 octets of short message user data | |
| 622 | 649 | short_message = None | |
| 650 | + | ||
| 651 | + #UDHI params(Message identifier/Message parts/Message part number) | ||
| 652 | + sar_msg_ref_num = 0 | ||
| 653 | + sar_total_segments = 0 | ||
| 654 | + sar_segment_seqnum = 0 | ||
| 623 | 655 | ||
| 624 | 656 | # Optional are taken from params list and are set dynamically when | |
| 625 | 657 | # __init__ is called. | |
@@ -641,15 +673,16 @@ class SubmitSM(Command): | |||
| 641 | 673 | 'data_coding': Param(type=int, size=1), | |
| 642 | 674 | 'sm_default_msg_id': Param(type=int, size=1), | |
| 643 | 675 | 'sm_length': Param(type=int, size=1), | |
| 644 | - 'short_message': Param(type=ostr, max=254, len_field='sm_length'), | ||
| 645 | - | ||
| 676 | + 'short_message': Param(type=ostr, max=254, | ||
| 677 | + len_field='sm_length', | ||
| 678 | + udhi_field='esm_class'), | ||
| 646 | 679 | # Optional params | |
| 647 | 680 | 'user_message_reference': Param(type=int, size=2), | |
| 648 | 681 | 'source_port': Param(type=int, size=2), | |
| 649 | 682 | 'source_addr_subunit': Param(type=int, size=2), | |
| 650 | 683 | 'destination_port': Param(type=int, size=2), | |
| 651 | 684 | 'dest_addr_subunit': Param(type=int, size=1), | |
| 652 | - 'sar_msg_ref_num': Param(type=int, size=2), | ||
| 685 | + 'sar_msg_ref_num': Param(type=int, size=1), | ||
| 653 | 686 | 'sar_total_segments': Param(type=int, size=1), | |
| 654 | 687 | 'sar_segment_seqnum': Param(type=int, size=1), | |
| 655 | 688 | 'more_messages_to_send': Param(type=int, size=1), | |
@@ -745,13 +778,15 @@ class DeliverSM(SubmitSM): | |||
| 745 | 778 | 'data_coding': Param(type=int, size=1), | |
| 746 | 779 | 'sm_default_msg_id': Param(type=int, size=1), | |
| 747 | 780 | 'sm_length': Param(type=int, size=1), | |
| 748 | - 'short_message': Param(type=ostr, max=254, len_field='sm_length'), | ||
| 781 | + 'short_message': Param(type=ostr, max=254, | ||
| 782 | + len_field='sm_length', | ||
| 783 | + udhi_field='esm_class'), | ||
| 749 | 784 | ||
| 750 | 785 | # Optional params | |
| 751 | 786 | 'user_message_reference': Param(type=int, size=2), | |
| 752 | 787 | 'source_port': Param(type=int, size=2), | |
| 753 | 788 | 'destination_port': Param(type=int, size=2), | |
| 754 | - 'sar_msg_ref_num': Param(type=int, size=2), | ||
| 789 | + 'sar_msg_ref_num': Param(type=int, size=1), | ||
| 755 | 790 | 'sar_total_segments': Param(type=int, size=1), | |
| 756 | 791 | 'sar_segment_seqnum': Param(type=int, size=1), | |
| 757 | 792 | 'user_response_code': Param(type=int, size=1), | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -382,3 +382,8 @@ | |||
| 382 | 382 | 2: 'H', | |
| 383 | 383 | 4: 'L', | |
| 384 | 384 | } | |
| 385 | + | ||
| 386 | + #UDHI indicator in esm_class(01xxxxxx) | ||
| 387 | + UDHI_INDICATOR_SET = 0x40 | ||
| 388 | + #Set the reply path esm_class(10xxxxxx) | ||
| 389 | + SET_REPLY_PATH = 0x80 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments