TOC

SMPP 短信协议

https://en.wikipedia.org/wiki/Short_Message_Peer-to-Peer
https://smpp.org/

Short Message Peer-to-Peer (SMPP) 是一种开放的短信协议。虽然名字中带有 P2P 的字样,但 SMPP 实际上是一种 C/S 协议。
移动 CMPP 协议,联通 SGIP 协议,电信 SMGP 协议,据说他们之间交换信息都是走 SMPP 协议。

常用版本:

根据维基百科的资料,SMPP 之前由 SMS 论坛开发,但是 2007 年,SMS 论坛已经解散了。

数据格式

数据包(PDU (protocol data units, or packets))格式:

  • header (必需)
  • command_length 4B
  • command_id 4B
  • command_status 4B
  • sequence_number 4B
  • body (可选)
'command_length',             (60) ... 00 00 00 3C
'command_id',                  (4) ... 00 00 00 04
'command_status',              (0) ... 00 00 00 00
'sequence_number',             (5) ... 00 00 00 05

'service_type',                 () ... 00
'source_addr_ton',             (2) ... 02
'source_addr_npi',             (8) ... 08
'source_addr',               (555) ... 35 35 35 00
'dest_addr_ton',               (1) ... 01
'dest_addr_npi',               (1) ... 01
'dest_addr',           (555555555) ... 35 35 35 35 35 35 35 35 35 00
'esm_class',                   (0) ... 00
'protocol_id',                 (0) ... 00
'priority_flag',               (0) ... 00
'schedule_delivery_time',      (0) ... 00
'validity_period',             (0) ... 00
'registered_delivery',         (0) ... 00
'replace_if_present_flag',     (0) ... 00
'data_coding',                 (3) ... 03
'sm_default_msg_id',           (0) ... 00
'sm_length',                  (15) ... 0F
'short_message', (Hello Wikipedia) ... 48 65 6C 6C 6F 20 57 69 6B 69 70 65 64 69 61

名词

  • SMSC:short message service center,服务器端
    或者叫 Messaging Center,简写作 MC
  • ESME:extended short message entity,客户端

命令

Command ID Value
generic_nack 0x80000000
bind_receiver 0x00000001
bind_receiver_resp 0x80000001
bind_transmitter 0x00000002
bind_transmitter_resp 0x80000002
query_sm 0x00000003
query_sm_resp 0x80000003
submit_sm 0x00000004
submit_sm_resp 0x80000004
deliver_sm 0x00000005
deliver_sm_resp 0x80000005
unbind 0x00000006
unbind_resp 0x80000006
replace_sm 0x00000007
replace_sm_resp 0x80000007
cancel_sm 0x00000008
cancel_sm_resp 0x80000008
bind_transceiver 0x00000009
bind_transceiver_resp 0x80000009
Reserved 0x0000000A / 0x8000000A
outbind 0x0000000B
Reserved 0x0000000C - 0x00000014 / 0x8000000B - 0x80000014
enquire_link 0x00000015
enquire_link_resp 0x80000015
Reserved 0x00000016 - 0x00000020 / 0x80000016 - 0x80000020
submit_multi 0x00000021
submit_multi_resp 0x80000021
Reserved 0x00000022 - 0x000000FF / 0x80000022 - 0x800000FF
Reserved 0x00000100
Reserved 0x80000100
Reserved 0x00000101 / 0x80000101
alert_notification 0x00000102
Reserved 0x80000102
data_sm 0x00000103
data_sm_resp 0x80000103
Reserved for SMPP extension 0x00000104 - 0x0000FFFF / 0x80000104 - 0x8000FFFF
Reserved 0x00010000 - 0x000101FF / 0x80010000 - 0x800101FF
Reserved for SMSC Vendor 0x00010200 - 0x000102FF / 0x80010200 - 0x800102FF
Reserved 0x00010300 - 0xFFFFFFFF

总结:

RequestCommandID ComandValue 十进制 说明
bind_receiver 0x00000001 1 建立接收会话(接收上行)
bind_transmitter 0x00000002 2 建立发送会话(提交下行)
query_sm 0x00000003 3 查询
submit_sm 0x00000004 4 提交
deliver_sm 0x00000005 5 下发(状态报告或上行)
unbind 0x00000006 6 中断连接
replace_sm 0x00000007 7 替换已提交消息
cancel_sm 0x00000008 8 取消
bind_transceiver 0x00000009 9 建立会话(发送 + 接收)
outbind 0x0000000B 11 通知客户端建立连接(bind_receiver )
enquire_link 0x00000015 21 心跳
submit_multi 0x00000021 33 批量提交(多个收件人)
alert_notification 0x00000102 258 -
data_sm 0x00000103 259 submit/deliver 的替代方案
  • 响应:对应请求 + 0x80000000
  • outbindalert_notification 没有对应响应
  • 此外,还有 generic_nack 是通用拒绝响应(0x80000000
  • outbind 的场景是服务器端需要推送信息或状态给客户端