长短信格式(cmpp)

 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位协议头短信的标识字段是1byte,而7位协议头短信的标志字段为2byte大多手机采用6位的协议头,也就是05 00 03 XX MM NN

       短信网关允许的最大长度MAXSMS_LENGTH一般为140,所以组装休息的时候每一台短信的内容体长度为(MAXSMS_LENGTH-6)或(MAXSMS_LENGTH-7)。

       长短信的内容要使用ucs2来编码。Ex: pythonmsg= 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'

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值