长短信实现系列之移动CMPP2.0

1)背景 

目前我们的短信发送基本上就是超过140字节(甚至更少)就切分(移动普通短信超过140个字节甚至都发送不了,联通倒是可以),然后分几条发给客户,而且也不能保证顺序,用户体验不好,

运营这边抱怨说精简再精简还是超过了字数,于是长短信的支持就成为必须的事情了。

 

2)原理

 

 

2.1)长短信的协议和普通短信的协议稍有不同

 

 

2.1.1) TP_udhi=1 

在Msg_content中加入6个字节或者7个字节的udhi头做为前缀

 

2.1.2)6个字节的TP_udhi协议头 

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 

 

2.1.3)7个字节的TP_udhi协议头 

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

 

2.2)实现方式 

我们的短信网关还是要按140个字节切分短信,只是短信的字节和以前稍有不同(见2.1的说明),短信中心通过把切分的短信发送到手机终端,

手机终端根据udhi协议头再把这几条短信组合成一条完整的短信显示在手机屏幕

 

3)action

 

 

3.0)简略的下行流程 

我们的网关程序(SP)<-------CMPP2.0协议----->互联网短信网关(ISMG)<-----SMPP协议--------->短消息中心(SMC)<-----无线协议---->手机终端

 

 

3.1)第一阶段 

条件:(6字节协议头,TP_udhi=1, Pk_total Pk_number均为1或者0或者和TP_udhi头一致,Msg_Fmt为Gbk)

终端无法收到,从短信中心获得错误码 MA:0054,意思是短信中心不返回行业网关响应消息

 

条件:(7字节协议头,TP_udhi=1, Pk_total Pk_number均为1或者0或者和TP_udhi头一致,Msg_Fmt为Gbk)

终端无法收到,从短信中心获得错误码MB : 1057,意思是短信中心返回行业网关错误响应消息

 

具体错误原因,如何改正,我问过移动技术人员,没有结果

 

3.2)第二阶段 

突发奇想,把Msg_Fmt改为ucs2,即设为8而不是15,情况发生了变化

条件:(6字节协议头,TP_udhi=1, Pk_total Pk_number均为1或者0或者和TP_udhi头一致,Msg_Fmt为ucs2)

能收到一条

另外一条行业网关就出问题,返回错误代码为8,表示流量过大

 

条件:(7字节协议头,TP_udhi=1, Pk_total Pk_number均为1或者0或者和TP_udhi头一致,Msg_Fmt为ucs2)

能收到一条

另外一条行业网关就出问题,返回错误代码为8,表示流量过大

 

后来才发现这个错误是自己造成的,我设了msg fmt,但Msg_content中的字节确还是原来的gbk的

 

3.3)第三阶段 

改正了上面的错误之后,居然ok了

此时的情况是:

(7字节,TP_udhi=1, Pk_total Pk_number和udhi头一致,msg fmt为ucs2)

 

3.4) 举个例子 

我要发送AAABBBCCC,我拆成3条:AAA, BBB, CCC

3条分别如下

AAA :

Pk_total: 03

Pk_number: 01

TP_udhi: 01

Msg_Fmt: 08

Msg_Content: 06 08 04 00 39 03 01 00 41 00 41 00 41

 

BBB :

Pk_total: 03

Pk_number: 02

TP_udhi: 01

Msg_Fmt: 08

Msg_Content: 06 08 04 00 39 03 02 00 42 00 42 00 42

 

CCC :

Pk_total: 03

Pk_number: 03

TP_udhi: 01

Msg_Fmt: 08

Msg_Content: 06 08 04 00 39 03 03 00 43 00 43 00 43

 

注意TP_udhi 的协议头中的XX XX 在这里为 00 39  是我随机产生的。

 

 

4)结论

 

必须设置TP_udhi为1

必须在Msg_contetnt前加入TP_udhi协议头,协议头我目前使用的是7字节的,我认为6字节应该也可以,你可以试下

Pk_total,Pk_number是否一定设置的和TP_udhi协议头中的MM NN 一致,我目前是一致,但我觉得不一致也可以,就像普通短信中这个字段都为1,你可以试下

Msg_Fmt一定不能选择15即gbk,我目前选的是8(UCS2),其他的行不行,你可以试下

感觉到7字节还是有好处的,特别是用了两个字节XX XX 来标示一批短信,如果这两个字节随机产生(如果不随机产生,实现成本要大很多),这使得在大并发的情况下,冲突(某时刻某个手机接到的两批短信批次相同会导致手机合并短信出问题)的可能性下降了很多。

最好能有个模拟网关测试下,虽然模拟仅模拟行业网关,但至少能避免我第二阶段发生的愚蠢的错误,最好还能有个tcpdump工具,来检测发送的字节是否正确。

转载于:https://my.oschina.net/u/661273/blog/359890

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《中国移动通信CMPP2.0短消息网关开发接口库》 本接口是用VC6.0遵循中国移动通信标准CMPP2.0协议开发的短消息网关接口,目的是简化SP接入移动短消息网关的复杂度。 本接口对网络通信和CMPP2.0协议进行了高度封,连接过所有类型的移动网关,暂时不支持CMPPE(东软格式,但东软也支持标准CMPP). 本接口还提供了网关的部分功能接口,可以很方便地用来开发模拟网关),接口库就提供了一个功能完整的模拟网关源码!接口包含两个示例工程,一个是客户端,通过CMPP2.0连接网关,演示了登录、MT、MO的全过程;一个就是模拟网关,可以接收用户的登录,接收MT请求,同时还可以主动批量下发MO消息。 更新历史: 2003-08-08 V1.3 1. 增加了对cmpp_recv函数的返回值CMPP_RECVTIMEOUT的说明。 2. 修改了cmpp_login_value_set()函数,去掉了一个参数。 2003-07-23 V1.22 1.增加了两个函数(cmpp_submit_sm_set_msgsrc和cmpp_submit_sm_set_srctermid),可以分别用来设置Src_Id和Msg_src。 根据移动的要求(升级后的网关),sp下发消息时,Src_Term_Id和Msg_src必须为该连接的对端的SP的服务代码和企业代码 (见《关于SP下发数据格式的规范》). 2003-07-08 V1.2 1.修正了cmpp_login_value_set函数的一个bug。 2003-06-07 V1.1 1.增加了网关接收部分的接口,同时新增了详细使用手册和模拟网关的源码,并且在真实环境中测试通过! 2003-04-25 V1.0 1.0发布。 作者: princetoad Email:princetoad@tom.com Homepage:http://gmm.nease.net 1.3版下载地址:http://gmm.nease.net/CMPP.rar 1.22版下载地址:http://skybird.9s9s.com/upload/upfile/2003723956540.rar 1.21版下载地址:http://www.csdn.net/cnshare/soft/17/17025.shtm 1.2版下载地址:http://skybird.9s9s.com/upload/upfile/2003781329230.rar 1.1版下载地址:http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=917 本接口库有偿提供源码,请到中国共享软件注册中心注册或联系作者,princetoad@tom.com。 注册地址:http://www.softreg.com.cn/shareware.asp?id=11530 同时提供中国联通SGIP1.2接口库,更多详情请访问作者主页! 下载:http://gmm.nease.net/SGIP.rar 注册地址:http://www.softreg.com.cn/shareware.asp?id=11517
功能特点: 1.遵照CMPP2.0协议实现,模拟了短信网关,支持CONNECT,SUBMIT,DELIVER,QUERY,CANCEL,TERMINATE消息。 2.支持多个客户端登录,支持单连接和双连接类型,支持标准CMPP和亚信API. 3.服务端自动生成Msgid,支持状态报告. 4.支持对客户端进行鉴权,用户可以自行配置有效的客户端ICPID,SPID,PWD,和有效的IP地址。 5.以二进制形式显示消息流内容,并且能够把消息包的每个字段都打印出来,当然这会影响一些效率。 6.模拟网关不对submit各字段的合法性进行判断(如msgsrc必须是企业代码icpid,srcid必须是接入号 发送错误代码介绍:0 = TRS_SUCCESS : 正确 1 = TRS_PACKET_ERR : 消息结构错 2 = TRS_CMD_ERR : 命令字错 3 = TRS_SEQ_DUPLICATE : 消息序号重复 4 = TRS_PACKET_LEN_ERR : 消息长度错 5 = TRS_FEE_ERR : 资费错 6 = TRS_MSG_LEN_ERR : 超过最大信息 7 = TRS_SRV_CODE_ERR : 业务代码错 8 = TRS_FLUX_ERR : 流量控制错 9 = TRS_NOT_SRV_USER : 本网关不负责服务此计费号码,前转判断错(此SP不应发往本ISMG) 10 = TRS_SRC_ID_ERR : Src_Id错误 11 = TRS_MSG_SRC_ERR : Msg_src错误 12 = TRS_FEE_TERMINAL_ERR : Fee_terminal_Id错误 13 = TRS_DEST_TERMINAL_ERR : Dest_terminal_Id错误 160 = IP_ADDRESS_ERR : ZTE_EXTENED 帐号源IP地址错误 161 = LINK_FULL : ZTE_EXTENED 帐号已经建立了15条链路 162 = LOCK_MUTEX_ERR : ZTE_EXTENED 建链时锁错误 163 = RGSTRDDLVRY_ERR : ZTE_EXTENED Registered_Delivery取值错误 164 = FEEUSERTYPE_ERR : ZTE_EXTENED FeeUserType取值错误 165 = TERMINALTYPE_ERR : ZTE_EXTENED TerminalType取值错误 166 = MSGFMT_ERR : ZTE_EXTENED MsgFmt取值错误 167 = MSGFWDTYPE_ERR : ZTE_EXTENED msgFwdType取值错误 168 = USERTYPE_ERR : ZTE_EXTENED UserType取值错误 169 = ROUTE_ERR : ZTE_EXTENED 路由失败 170 = SMMC_ERR : ZTE_EXTENED 信息过滤失败 171 = IAGWM_LINK_DOWN : ZTE_EXTENED 与IAGW M模块断链 172 = SEND_AUTH_ERR : ZTE_EXTENED 给IAGW M模块发消息失败,非断链 173 = AUTH_ERR : ZTE_EXTENED IAGW M认证失败 174 = LICENSE_FAILED : ZTE_EXTENED 超过系统license限制 175 = TRANS_ERR : ZTE_EXTENED 消息转发错误 176 = RESP_TIME_OUT : ZTE_EXTENED 等resp超时 177 = FATAL_ERR : ZTE_EXTENED 当错误码为-1时转换为此值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值