`
reallyafei
  • 浏览: 98788 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
 
阅读更多

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工具,来检测发送的字节是否正确。

分享到:
评论
2 楼 dengkanghua 2013-02-06  
楼主,按你说的这样,成功了,一开始我这里报8流量控制错是因为没有钱了。
1 楼 dengkanghua 2013-02-05  
能给一点这个代码吗?我也遇到这个错误了。谢谢

相关推荐

    中国移动CMPP2.0短信接口开发

    总的来说,CMPP2.0短信接口开发涉及到网络编程、协议解析等多个技术领域,C#作为一种强大的.NET开发语言,提供了丰富的类库支持,使得开发者能够方便地实现与移动运营商的接口对接,实现高效、稳定的短信服务。

    中国移动通信CMPP2.0模拟网关

    4. **消息分片**:对于较长的短信,CMPP2.0支持消息分片,将一个长短信拆分为多个较短的短信片段,然后在接收端重新组合成原始消息。 5. **服务质量**:CMPP2.0提供了不同优先级的服务,如普通、加急和超急,以满足...

    使用mina框架实现cmpp2.0服务端

    **使用mina实现CMPP2.0服务端的关键点** 1. **连接管理**:使用Mina的Acceptor来监听特定端口,接受来自移动网关的连接请求。每个连接通常对应一个独立的工作线程,处理来自客户端的CMPP请求。 2. **会话建立**:...

    CMPP2.0协议

    《中国移动CMPP2.0协议详解》 中国移动通信互联短信网关接口协议,简称CMPP2.0,是中国移动为了实现高效、稳定、安全的短信服务而制定的一种通信协议。该协议是CMPP系列协议的一个重要版本,主要针对互联网与短信...

    CMPP2.0实现.zip

    4. **长短信处理**:对于超过70个字符的短信,CMPP2.0支持将一条长短信拆分成多条短消息进行发送,并在接收端进行重组。这涉及到短信段的计算和消息ID的管理。 5. **消息分发与路由**:CMPP2.0协议具备智能路由功能...

    cmpp 2.0短信

    CMPP(China Mobile Short Message Peer-to-Peer)2.0是中国移动推出的一种基于TCP/IP协议的短信传输协议,主要用于SP(Service Provider)与SMSC(Short Message Service Center)之间的通信,实现了SP向移动用户...

    cmpp2.0模拟软件,全功能.

    CMPP2.0是中国移动通信集团为实现大规模短信服务而制定的一种协议标准,它全称为China Mobile Peer-to-Peer Protocol Version 2.0。这个协议主要用于短信中心(SMSC)与SP(Service Provider)之间的数据交换,支持...

    移动短信直连发_CMPP2.0

    3. **消息分片**:对于长短信,CMPP2.0支持将一条长短信拆分成多个短信分片进行发送,确保短信内容完整无遗漏。 4. **高效批量处理**:支持一次提交多条短信,适合大规模的短信发送任务,提高了处理效率。 5. **...

    cmpp2.0客户端

    CMPP2.0客户端是基于中国移动通信协议CMPP(China Mobile Short Message Peer-to-Peer)2.0版本实现的一种短信发送工具。这个Java项目专注于客户端的功能实现,允许开发者通过长连接向服务端发送短信,同时支持长...

    中国电信SMGP,中国移动CMPP,中国联通SGIP短信协议

    在中国的电信行业中,短信服务是不可或缺的一部分,而中国电信SMGP(Short Message Gateway Protocol)、中国移动CMPP(China Mobile Peer to Peer)以及中国联通SGIP(Short Message Service Gateway Protocol)是...

    中国移动短信网关cmpp 3.0 华为java api

    中国移动短信网关CMPP(China Mobile Packet Protocol)3.0是一种专用于移动...通过理解以上知识点,开发者可以利用华为的中国移动短信网关CMPP 3.0 Java API,构建起与短信网关的桥梁,实现高效、稳定的短信服务应用。

    CMPP3.0 短信发送

    CMPP3.0相对于之前的版本,如CMPP2.0,在功能、性能和安全性上都有所增强,更加适应大规模、高并发的短信业务需求。 CMPP3.0协议主要包括以下几个核心概念和流程: 1. **连接建立**:SP通过TCP连接到MC,建立长...

    中国移动CMPP3.0协议

    CMPP3.0在CMPP2.0的基础上进行了优化和增强,提高了系统的处理能力和安全性。 CMPP3.0协议的核心组成部分包括连接建立、消息传输、状态报告以及断开连接等环节。在连接建立阶段,SP通过TCP连接到SP Gateway,并进行...

    CMPP协议客户端测试工具

    长短信是指内容超过普通短信160个字符限制的短信,需要通过特殊编码技术将其分割成多个短消息进行发送,并在接收端重新组合。 "cmpptest.exe"可能是这个测试工具的主执行文件,它是应用程序的核心部分,负责处理...

    长短信拆分技术规范书

    在移动通信领域,尤其是基于CMPP协议的系统中,短信作为基础的通讯手段之一,其发送机制必须遵循一定的规范以确保信息的完整性和准确性。此规范书详细介绍了长短信的拆分规则,确保了即便在信息量较大时,也能通过多...

    短信网关通信协议库源码(C++实现)——支持CMPP、EMPP及SMGP的众多版本

    CMPP2.0主要处理单条短信提交、查询、接收等功能,而CMPP3.0在2.0的基础上增加了群发、长短信拆分与合并、上行短信处理等特性,提升了系统的并发处理能力。该库实现了这两个版本,能够适应不同的业务需求。 EMPP则...

    CMPP SMGP SGIP短信应用平台 v2.0

    尽管此平台目前仅支持普通短信,但开发者可以根据需求自行修改源码来实现长短信功能。 SMGP协议则是中国联通和中国电信常用的短信网关协议,它主要用于短信网关与短信中心之间的数据交换。与CMPP类似,SMGP也支持...

    CMPP3.0服务器

    SP通过TCP/IP连接到中国移动的CMPP服务器,然后通过CMPP2.0协议发送和接收短信。该协议支持上行(用户到SP)和下行(SP到用户)的消息,并提供了消息分组发送、长短信拆分与合并等功能,以适应不同场景的需求。 ...

    长短信拆分技术规范书.pdf

    总结来说,长短信拆分技术是一种用于处理超长短信的方法,它遵循CMPP协议,通过在每个子消息中添加特定头部信息,确保接收端可以正确拼接和理解这些短消息,从而恢复出原始的长文本内容。这项技术在现代移动通信中起...

    java实现CMPP3.0源代码

    CMPP3.0是该协议的最新版本,它在CMPP2.0的基础上增加了更多的功能和优化。 CMPP协议主要包括以下几部分: 1. **连接管理**:CMPP连接通常基于TCP/IP协议,通过建立长连接来保持SP与MC之间的通信。连接建立后,SP...

Global site tag (gtag.js) - Google Analytics