1.定义:短信内容超过70个汉字,提交给网关时候需要分成多条,但是用户手机接收时候是一条(自动组装成一条)。
2. 发送长短信的过程:
& 消息的组装
& 消息发送时携带的参数
消息的组装:
超长短信的协议头有两种,分别是长度为6和长度为7的协议头,下面给出这两种协议头格式的参考资料。
6位协议头格式:05 00 03 XX MM NN
byte 1 : 05, 表示剩余协议头的长度
byte 2 : 00, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为1(格式中的XX值)。
byte 3 : 03, 这个值表示剩下短信标识的长度
byte 4 : XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
byte 5 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
byte 6 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
例如:05 00 03 39 02 01
7位的协议头格式:06 08 04 XX XX MM NN
byte 1 : 06, 表示剩余协议头的长度
byte 2 : 08, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2(格式中的XX值)。
byte 3 : 04, 这个值表示剩下短信标识的长度
byte 4-5 : XX XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
byte 6 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
byte 7 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
例如:06 08 04 00 39 02 01
7位协议头和6位协议头的区别是,6位协议头短信的标识字段是1个byte,而7位协议头短信的标志字段为2个byte。大多手机采用6位的协议头,也就是05 00 03 XX MM NN。
短信网关允许的最大长度MAXSMS_LENGTH一般为140,所以组装休息的时候每一台短信的内容体长度为(MAXSMS_LENGTH-6)或(MAXSMS_LENGTH-7)。
长短信的内容要使用ucs2来编码。Ex: 在python中msg= msg.decode(‘mbcs’).encode(‘utf-16-be’)。
一个例子:
MAXSMS_LENGTH=140
"""this class is useful in packaging a sms message into a longsms message"""
class LongSms:
_headLength = 6 #协议头长度为6 '/x05/x00/x03'+msg_id+chr(count)+chr(i+1)
_bodyLength = MAXSMS_LENGTH - _headLength
_msg_id = 0
def __init__(self,msg):
self._msg = msg
LongSms._msg_id +=1
LongSms._msg_id = LongSms._msg_id&0xff
def getMsgid(self):
return LongSms._msg_id
def getMsg(self):
smsList=[]
msg = self._msg.decode('mbcs').encode('utf-16-be')
restLen = len(msg)
count = (restLen +(LongSms._bodyLength-1))/LongSms. _bodyLength
msg_id = chr(self.getMsgid())
for i in range(count):
length = min(restLen,LongSms._bodyLength)
sms = '/x05/x00/x03'+msg_id+chr(count)+chr(i+1)
sms += msg[i*LongSms._bodyLength:i*LongSms._bodyLength+length]
restLen -=LongSms._bodyLength
smsList.append(sms)
return smsList
消息发送时携带的参数:
在cmpp协议里,CMPP-_SUBMIT消息定义中有相应的参数配置:
TP_udhi :0代表内容体里不含有协议头信息 1代表内容含有协议头信息。
TP_msgFmt: 8 表示ucs2 ,15表示gbk,4表示二进制。
由于本例中使用了ucs2编码,并且包含协议头,所以参数设置为Msg_Fmt=8/r/nTP_udhi=1/r/n'