1、背景
通过CMPP协议和移动网关连接,通过sumbit包进行提交短信(SP->ISMG),Submit包的对消息内容长度(Msg_Length)的规定为一个字节,当消息格式(Msg_FMT)为0时,<=160 ,其它时为<=140,发送包含汉字的短信基本上就是超过140字节(甚至更少)就切分,然后分几条发给客户,而且也不能保证顺序,用户体验不好,于是长短信的支持就成为必须的事情了。
2、原理
2.1、长短信的协议和普通短信的协议稍有不同
2.1.1 TP_udhi=1
在Msg_content中加入6个字节或者7个字节的udhi头做为前缀,当6字节时,每条短信最多67字,7时为66字。
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 78 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 78 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 78 03 03 00 43 00 43 00 43
注意TP_udhi 的协议头中的XX XX 在这里为 00 78 是我随机产生的。
4)结论
- 必须设置TP_udhi为1
- 必须在Msg_contetnt前加入TP_udhi协议头
- Pk_total,Pk_number和TP_udhi协议头中的MM NN 一致
- Msg_Fmt一定不能选择15即gbk,我目前选的是8(UCS2),其他的行不行,你可以试下
- 6字节的好处是多发一个汉字
- 7字节的好处,特别是用了两个字节XX XX 来标示一批短信,如果这两个字节随机产生(如果不随机产生,实现成本要大很多),这使得在大并发的情况下,冲突(某时刻某个手机接到的两批短信批次相同会导致手机合并短信出问题)的可能性下降了很多。
- 最好能有个模拟网关测试下,虽然模拟仅模拟行业网关,但至少能避免我第二阶段发生的愚蠢的错误,最好还能有个tcpdump工具,来检测发送的字节是否正确。
相关推荐
CMPP协议定义了短信网关与SP(Service Provider,服务提供商)系统之间的接口,支持点对点、群发等多种短信服务类型,涵盖了短信提交、短信查询、短信退订等业务功能。 2. **引用标准** 该协议可能参照了电信行业...
一、CMPP协议概述 CMPP全称为“中国移动点对点短消息网关协议”,是一种基于TCP/IP的通信协议,用于连接SP(Service Provider)与SCP(Service Control Point)之间的数据交换,主要处理短信的发送、接收、状态查询...
JAVA源码中国移动短信协议CMPP封装hicmpp
中国移动短信网关CMPP(China Mobile Packet Protocol)3.0是一种专用于移动通信领域的协议,主要用于短信服务,包括发送、接收、查询等操作。华为作为知名的电信设备供应商,提供了对应的Java API来帮助开发者便捷...
4. 支持日志记录,便于分析和调试应用在处理CMPP协议时的行为。 在使用"cmpp2smg"这个压缩包文件时,开发者可以期待找到以下内容: 1. 模拟器软件:可能包含一个可执行文件或一组脚本,用于启动和配置模拟器。 2. ...
中国移动短信CMPP 2.0协议API是一种专用于短信服务的通信协议,广泛应用于移动通信领域,特别是企业级应用,如验证码发送、信息推送等。该协议基于TCP/IP,为服务提供商提供了高效、稳定且安全的短信发送和接收功能...
Java实现CMPP协议开发代码主要涉及的是中国移动通信的CMPP(China Mobile Packet Protocol)协议,该协议主要用于短信中心(SMSC)与短信网关(SP)之间的数据传输,包括发送短消息、接收短消息以及相关的控制功能。...
CMPP协议主要用于短信中心(SMSC)与短信网关之间的通信,支持大量并发的短信发送和接收操作,是移动运营商内部的重要通信协议。本文将详细介绍Java实现CMPP协议的相关知识点。 首先,CMPP协议主要由一系列的命令...
2. **连接管理**:CMPP协议基于TCP/IP,需要建立并维护与移动网关的长连接。在连接过程中,可能会遇到网络中断,因此需要实现断线重连机制,确保服务的稳定性和可靠性。 3. **消息编码与解码**:CMPP协议的数据交换...
基于java的开发源码-中国移动短信协议CMPP封装 hicmpp.zip 基于java的开发源码-中国移动短信协议CMPP封装 hicmpp.zip 基于java的开发源码-中国移动短信协议CMPP封装 hicmpp.zip 基于java的开发源码-中国移动短信协议...
利用 CMPP/SGIP 协议发送长短信发送格式说明 本资源摘要信息旨在详细解释利用 CMPP/SGIP 协议发送长短信的格式说明。长短信是一种特殊的短信格式,它允许发送超过 70 个汉字的信息内容,但需要将其拆分成多条短信,...
中国移动短信接口CMPP3.0SP客户端源码是用于SP(Service Provider)业务提供商与ISMG(Internet Short Message Gateway,互联网短信网关)之间通信的一种关键技术。此接口协议允许SP向中国移动的用户发送和接收短信...
这个测试工具简化了对CMPP协议的调试和验证过程,确保服务提供商能够正确、高效地与移动网络进行交互。 CMPP协议分为三个主要部分:CMPP_CONNECT、CMPP_SUBMIT和CMPP_DELIVER。CMPP_CONNECT是建立连接的命令,用于...
CMPP(China Mobile Short Message Peer-to-Peer)是中国移动推出的一种用于SP(Service Provider)与移动短信中心(SMSC)之间进行短信传输的协议。它主要用于实现SP与运营商网络之间的高效、稳定、实时的通信,...
3. **协议栈**:CMPP协议栈包含多层协议,从物理层到应用层,确保数据在不同网络环境下的正确传输。 4. **通信方式**:协议支持两种连接方式——长连接和短连接。长连接用于保持持续的通信,减少连接建立的开销;短...
本人亲测可用采用华为包开发的JAVA移动短信CMPP2.0/CMPP3.0程序,希望能够帮到你
4. **事务管理**:CMPP协议支持事务处理,保证消息的可靠传输。Java中可以使用同步锁、Future或其他并发工具来管理事务状态。 5. **错误处理与重试策略**:当网络问题或服务器错误发生时,Java程序应能优雅地处理...
总之,CMPP协议作为SP与移动运营商之间的重要桥梁,不仅简化了短信服务的开发,还提升了服务质量,满足了商业场景下大规模短信发送的需求。理解并熟练应用CMPP协议,对于从事短信服务相关开发的IT专业人员来说至关...
CMPP3.0协议是中国移动为了解决短信业务的高并发需求而设计的,主要应用于SP(Service Provider)与SP Gateway之间的数据交互。协议基于TCP/IP通信模型,采用了面向连接的方式,确保了数据传输的可靠性。CMPP3.0相比...
2. **中国移动CMPP协议**:CMPP是专为中国移动设计的短信协议,它采用了基于TCP/IP的点对点通信模式。CMPP协议有多个版本,其中CMPP2.0是最常见的,它支持在线连接、断线重连、多通道并发处理,具有高吞吐量和低延迟...