Skip to content

也聊 CMPP 协议

Published: at 06:05 AM

CMPP(China Mobile Peer to Peer)中国移动通信互联网短信网关接口协议。移动的短信发送协议,相较于前文聊到的 SIP 协议,CMPP 可能更为“冷门”,非从业人员大多都没接触过,以下内容依据官方文档 CMPP 2.0版本,由于本人水平有限,难免出错,建议看官网文档,参见文末。

CMPP 协议

CMPP 协议是应用层协议,依靠TCP做数据承载(保证数据的可靠性)可以简单将其理解为自定义消息内容的socket,支持双向通讯。

消息结构分消息头和消息体。

消息头

均为无符号int32

消息体

根据具体的指令,消息内容有所不同,这里不展开讲,文档有详细介绍。

请求流程

假设我们向199xxxx发送短信,短信内容为:【测试】你好,收到请回123。

流程如下图:

CMPP流程

F1:SP 发起连接请求,携带用户名,密码登信息,网关做认证。

F2:网关响应连接请求。

F3:SP 发起提交请求,对应向199xxxx发送短信。

F4:网关响应提交(可能成功或失败)。

F5:网关推送回执报告,此状态为客户是否收到短信,短信计费是以到达成功条数计费。

F6:SP 响应状态报告。

F7:网关推送上行回复,客户收到短信并回复“123”,运营商->网关->SP。

F8:SP 响应网关上行内容。

未列出的指令

为了验证流程和我们设想的是否一致,按照惯例,抓个包

CMPP抓包

Wireshark 会将其识别为 SMPP(Short Message Peer-to-Peer Protocol 短消息点对点协议,主要应用于国际短信)。但消息解析有点问题,看起来不是很直观。所以我们要麻烦一点,按文档字节的定义,将其内容还原。

以下为 SP->ISMG CONNECT 报文:

00 00 00 27 00 00 00 01 3b 2f b8 6c 48 36 65 77
43 62 67 a0 00 4e 59 25 0a ab af 8b 7e f5 51 fd
12 33 20 3d 65 fc 06

手动解包有点繁琐,剩余的其实类似的,按照文档字节约定处理即可。

开发

如果是 Java 技术栈可以使用 SMSGate SDK,用起来还是比较顺手的。

参考