FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

long SMS decode and unbind handle · python-smpplib/python-smpplib@a82e6be · GitHub

Commit a82e6be

Browse files
authored
long SMS decode and unbind handle
1. long SMS decode, deal UDHI indicator in esm_class(01xxxxxx) 2. add unbind handle when unbind recv
1 parent 46f9784 commit a82e6be

3 files changed

Lines changed: 65 additions & 15 deletions

File tree

‎smpplib/client.py‎

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030

3131
from smpplib import consts, exceptions, smpp
3232

33-
logger = logging.getLogger('smpplib.client')
34-
33+
logger = logging.getLogger(__name__)
3534

3635
class SimpleSequenceGenerator(object):
3736

@@ -98,15 +97,16 @@ def sequence(self):
9897
def next_sequence(self):
9998
return self.sequence_generator.next_sequence()
10099

101-
def connect(self):
100+
def connect(self, timeout=5):
102101
"""Connect to SMSC"""
103102

104103
logger.info('Connecting to %s:%s...', self.host, self.port)
105104

106105
try:
107106
if self._socket is None:
108107
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))
110110
self.state = consts.SMPP_CLIENT_STATE_OPEN
111111
except socket.error:
112112
raise exceptions.ConnectionError("Connection refused")
@@ -264,7 +264,11 @@ def set_message_received_handler(self, func):
264264
def set_message_sent_handler(self, func):
265265
"""Set new function to handle message sent event"""
266266
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+
268272
@staticmethod
269273
def message_received_handler(pdu, **kwargs):
270274
"""Custom handler to process received message. May be overridden"""
@@ -279,6 +283,11 @@ def message_sent_handler(pdu, **kwargs):
279283
"""
280284
logger.warning('Message sent handler (Override me)')
281285

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+
282291
def read_once(self, ignore_error_codes=None):
283292
"""Read a PDU and act"""
284293
try:
@@ -299,8 +308,9 @@ def read_once(self, ignore_error_codes=None):
299308
)
300309

301310
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)
304314
elif pdu.command == 'submit_sm_resp':
305315
self.message_sent_handler(pdu=pdu)
306316
elif pdu.command == 'deliver_sm':

‎smpplib/command.py‎

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ class Command(pdu.PDU):
9090
"""SMPP PDU Command class"""
9191

9292
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+
9496
def __init__(self, command, need_sequence=True, **kwargs):
9597
super(Command, self).__init__(**kwargs)
9698

@@ -271,6 +273,30 @@ def _parse_string(self, field, data, pos, length=None):
271273

272274
return data, pos
273275

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+
274300
def _parse_ostring(self, field, data, pos, length=None):
275301
"""
276302
Parse an octet string from a PDU.
@@ -279,7 +305,8 @@ def _parse_ostring(self, field, data, pos, length=None):
279305

280306
if length is None:
281307
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)
283310

284311
setattr(self, field, data[pos:pos + length])
285312
pos += length
@@ -472,7 +499,7 @@ class DataSM(Command):
472499
'dest_network_type': Param(type=int, size=1),
473500
'dest_bearer_type': Param(type=int, size=1),
474501
'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),
476503
'sar_total_segments': Param(type=int, size=1),
477504
'sar_segment_seqnum': Param(type=int, size=1),
478505
'more_messages_to_send': Param(type=int, size=1),
@@ -620,6 +647,11 @@ class SubmitSM(Command):
620647

621648
# Up to 254 octets of short message user data
622649
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
623655

624656
# Optional are taken from params list and are set dynamically when
625657
# __init__ is called.
@@ -641,15 +673,16 @@ class SubmitSM(Command):
641673
'data_coding': Param(type=int, size=1),
642674
'sm_default_msg_id': Param(type=int, size=1),
643675
'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'),
646679
# Optional params
647680
'user_message_reference': Param(type=int, size=2),
648681
'source_port': Param(type=int, size=2),
649682
'source_addr_subunit': Param(type=int, size=2),
650683
'destination_port': Param(type=int, size=2),
651684
'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),
653686
'sar_total_segments': Param(type=int, size=1),
654687
'sar_segment_seqnum': Param(type=int, size=1),
655688
'more_messages_to_send': Param(type=int, size=1),
@@ -745,13 +778,15 @@ class DeliverSM(SubmitSM):
745778
'data_coding': Param(type=int, size=1),
746779
'sm_default_msg_id': Param(type=int, size=1),
747780
'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'),
749784

750785
# Optional params
751786
'user_message_reference': Param(type=int, size=2),
752787
'source_port': Param(type=int, size=2),
753788
'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),
755790
'sar_total_segments': Param(type=int, size=1),
756791
'sar_segment_seqnum': Param(type=int, size=1),
757792
'user_response_code': Param(type=int, size=1),

‎smpplib/consts.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,3 +382,8 @@
382382
2: 'H',
383383
4: 'L',
384384
}
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

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL