CMPP(China Mobile Peer to Peer)中国移动通信互联网短信网关接口协议。移动的短信发送协议,相较于前文聊到的 SIP 协议,CMPP 可能更为“冷门”,非从业人员大多都没接触过,以下内容依据官方文档 CMPP 2.0版本,由于本人水平有限,难免出错,建议看官网文档,参见文末。
CMPP 协议
CMPP 协议是应用层协议,依靠TCP做数据承载(保证数据的可靠性)可以简单将其理解为自定义消息内容的socket,支持双向通讯。
消息结构分消息头和消息体。
消息头
- Total_Length 消息总长度(含消息头及消息体)
- Command_Id 命令或响应类型
- Sequence_Id 消息流水号,顺序累加,步长为 1,循环使用(一对请求和应答消息的流水号必须相同)
均为无符号int32
消息体
根据具体的指令,消息内容有所不同,这里不展开讲,文档有详细介绍。
请求流程
- SP 服务器提供商
- ISMG 短信网关,短信通道商
假设我们向199xxxx发送短信,短信内容为:【测试】你好,收到请回123。
流程如下图:
F1:SP 发起连接请求,携带用户名,密码登信息,网关做认证。
F2:网关响应连接请求。
F3:SP 发起提交请求,对应向199xxxx发送短信。
F4:网关响应提交(可能成功或失败)。
F5:网关推送回执报告,此状态为客户是否收到短信,短信计费是以到达成功条数计费。
F6:SP 响应状态报告。
F7:网关推送上行回复,客户收到短信并回复“123”,运营商->网关->SP。
F8:SP 响应网关上行内容。
未列出的指令
- 请求拆除连接(CMPP_TERMINATE)
- 链路检测(CMPP_ACTIVE_TEST)
为了验证流程和我们设想的是否一致,按照惯例,抓个包
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
- 长度 00 00 00 27 = 39
- 命令 00 00 00 01 对应 CMPP_CONNECT 0x00000001
- 序号 3b 2f b8 6c = 992983148
- Source_Addr 48 36 65 77 43 62 = ASCII 字符串 H6ewCb
- AuthenticatorSource 67 ~ 33 16个字节涉及隐私不处理
- 版本:20 = 00100000 即0010=2 0000=0 (高位 4bit 表示主版本号,低位4bit 表示次版本号)
- Timestamp:3d 65 fc 06 = 1030093830
手动解包有点繁琐,剩余的其实类似的,按照文档字节约定处理即可。
开发
如果是 Java 技术栈可以使用 SMSGate SDK,用起来还是比较顺手的。