SMPP是一种通用的短信接口协议,本文摘录了能实现短信基本功能的内容。
前言
短消息中心(SMSC)可以与各种扩展短消息实体(ESME)配合工作,从而为移动用户提供丰富多采的功能。
符号和缩略语
ESME Agent
External Short Message Entity Agent 扩展短消息实体代理
ESME
External Short Message Entity 扩展短消息实体
PLMN
Public Land Mobile Network 公共陆地移动网
SMSC
Short Message Service Center 短消息中心
SMPP
Short Message Peer to Peer 短消息点对点协议
SS
Secretary System 秘书台
AS
Auto System 自动台
SMSC指短消息中心。
ESME在本规范中指的是通过本规范规定的协议与SMSC通信,请求特定的短消息服务的功能实体。
SS指人工话务接入并受理短消息服务请求的系统。
AS指利用交互式语音技术受理短消息服务请求的系统。
SS(秘书台)和AS(自动台)是典型的ESME。
SMSC和ESME之间的传输网络可以是基于X.25, 或TCP/IP。
ESME到SMSC的消息
ESME到SMSC的消息,如:提交、查询、删除短消息等请求,ESME必须以TRANSMITTER类型连接到SMSC。
图4描述了一个典型的TRANSMITTER类型的请求应答的示例。TRANSMITTER类型的ESME是以BIND_TRANCESMITTER连接到SMSC的ESME,此类型的ESME向SMSC发起提交短消息,查询短消息状态,删除短消息等请求,SMSC返回请求的应答。
ESME和SMSC之间的请求应答消息可以是阻塞方式也可以是异步方式的。所以ESME可能在SMSC没有应答的情况下,发起多个请求到SMSC。
SMSC应该按照收到的请求顺序,给EMSE回响应。但是ESME必须能够处理没有按顺序的响应。
SMSC到ESME的消息
SMSC到ESME的消息,如:SMSC转发短消息到ESME,ESME必须以RECEIVER类型连接到SMSC。
图5描述了一个典型的RECEIVER类型的ESME和SMSC之间的消息序列的示例。RECEIVER类型的ESME是以BIND_RECEIVER连接到SMSC的ESME,SMSC向此类ESME转发短消息,ESME向SMSC回应答。
ESME和SMSC之间的请求应答消息可以是阻塞方式也可以是异步方式的。所以SMSC可能在ESME没有回应答的情况下,发送发起多个deliver_sm请求到ESME。
ESME应该按照收到的请求顺序,给SMSC返回响应。但是SMSC必须能够处理没有按顺序回的响应。
消息流
本规范中规定的所有协议,不管是从ESME到SMSC,还是从SMSC到ESME的消息,接收到请求的一方,都必须给请求方回一个应答消息(acknowledge)。
消息语法
在以下语法说明中,遵从以下规则:
A.未使用的字段,依据类型必须设置为0或NULL。
B.消息由消息头和消息体组成。
C.状态(Command_status)的定义如表3所示。
状态定义
错误代码
描述
E_SUCCESS(0X00000000)
成功
E_OTHERERR(0X00000001)
其他错误
0X00000002 – 0X0000000F
保留给SMSC厂商定义错误
E_MSGLENERR(0X00000010)
消息长度错误
E_CMDLENERR(0X00000011)
命令长度错误
E_INVLDCMDID(0X00000012)
消息ID无效
E_NORIGHT(0X00000013)
没有执行此命令的权限
0X00000014 – 0X0000001F
保留
E_INVLDSYSTEMID(0X00000020)
无效的SYSTEMID
E_INVLDPASSWORD(0X00000021)
无效的密码
E_INVLDSYSTEMTYPE(0X00000022)
无效的SYSTEMTYPE
0X00000023 – 0X0000003F
保留
E_ADDRERR(0X00000040)
地址错误
E_MOEXCEED(0X00000041)
超过最大提交数
E_MTEXCEED(0X00000042)
超过最大下发数
E_INVLDUSER(0X00000043)
无效的用户
E_INVLDDATAFMT(0X00000044)
无效的数据格式
E_CREATEMSGFAILURE(0X00000045)
创建消息失败
E_INVLDMSGID(0X00000046)
无效的短消息ID
E_DATABASEFAILURE(0X00000047)
数据库失败
E_CANCELMSGFAILURE(0X00000048)
取消消息失败
E_MSGSTATEERR(0X00000049)
短消息状态错误
E_REPLACEMSGFAILURE(0X0000004A)
替换消息失败
E_INVLDRPLADDR(0X0000004B)
替换消息源地址错误
0X0000004C – 0X0000005F
保留
E_INVLDORGTON(0X00000060)
无效的源地址TON
E_INVLDORGNPI(0X00000061)
无效的源地址NPI
E_ORGADDRERR(0X00000062)
源地址错误
E_INVLDDESTTON(0X00000063)
无效的目的地址TON
E_INVLDDESTNPI(0X00000064)
无效的目的地址NPI
E_DESTADDRERR(0X00000065)
目的地址错误
E_INVLDSCHEDULE(0X00000066)
无效的定时时间
E_INVLDEXPIRE(0X00000067)
无效的超时时间
E_INVLDESM(0X00000068)
无效的ESM_CALSS
E_INVLDUDLEN(0X00000069)
无效的UDLEN
E_INVLDPRI(0X0000006A)
无效的PRI
E_INVLDRDF(0X0000006B)
无效的Registered_delivery_flag
E_INVLDRPF(0X0000006C)
无效的Replace_if_present_flag
0X0000006D – 0X0000007F
保留
用户管理部分(可选)
E_USERALREADYEXIST(0X00000080)
指定用户已经存在
E_CREATEUSERERR(0X00000081)
创建用户失败
E_USERIDERR(0X00000082)
用户ID错误
E_USERNOTEXIST(0X00000083)
指定用户不存在
0X00000084 – 0X0000008F
保留
0X00000090 – 0X00000FFF
保留给SMSC厂商定义错误
其他
保留
类型定义
(1)integer:一定字节数所组成的整数,高位在前,低位在后。例 如:1字节(BYTE),2字节(WORD ) , 4字节 (DWORD) ,6字节等等。
(2)C_String:以NULL结束的ASCII字符串。
(3)C_DecString:以NULL结束的ASCII字符串,它由一系列的10进制字符 组成(‘0’---‘9’)。
(4)C_OctetString:由任意8位字节组成数据流串。
(5)C_HexString:以NULL结束的ASCII字符串,它由一系列的16进制字符组 成(‘0’---‘9’,‘A’(‘a’)---‘F’(‘f’))。
(6)C_UnicodeString:以NULL结束的Unicode编码的字符串。
(7)C_StringTime:表示时间的字符串,它为以下格式。“YYMMDDhhmmsstnnp" , 长度定为17个字节或1个字节,最后一个字节值必须为NULL,1个字节表示 使用缺省的时间定义(由短消息中心实现时具体设置),17个字节的具体格式 如下:
YY'
年份的最后2位 (00-99)
MM
月份(01-12)
DD
日 (01-31)
Hh
小时 (00-23)
Mm
分 (00-59)
Ss
秒 (00-59)
T
十分之一秒 (0-9)
Nn
与UTC (Universal Time Constant) 时间超前或落后 的差距(00-48).
‘+’(p)
时间超前于UTC time.
‘-’(p)
时间落后于 UTC time.
对于千年问题,采用时间窗口的方法来解决,具体方法为YY>90解释为19YY;否则解释为20YY。
消息头语法
表4:短消息头语法
字段
长度(字节)
类型
描述
Command_Length
4
integer
消息包的长度,包括此字段
Command_ID
4
integer
这个字段表明此条短消息的类型,例如ESME_SUB_SM表示此消息为ESME向SMSC提交短消息。具体数值定义见附录A。
Command_status
4
integer
此字段表示一个命令的成功与失败,如失败,指示引起失败的错误类型等信息,它在请求中必须设为0。
Sequence_No
4
integer
此字段表示消息的序列号,它由ESME产生,它是消息和它的应答之间的对应标志,它的数值在0到0XFFFFFFFF间必须保证严格单调的递增,当达到0XFFFFFFFF时,从0开始下一循环。
Optional Message Body
可变
混合
此字段表示短消息的消息体部分,具体定义见6.5.2
消息体语法
以下几条命令实现后,就可以实现短消息的收发。
BIND_RECEIVER命令
此命令在扩展短消息实体和短消息中心之间产生虚连接,该连接支持所有的协议命令。
BIND_RECEIVER语法
消息头中的Command_ID是“bind_receiver"
表5:BIND_RECEIVER语法
字段
长度(字节)
类型
描述
system_id
最大 16
C_String
接口ID
password
最大 9
C_String
密码
system_type
最大 13
C_String
接口类型
Interface_version
1
integer
接口版本号
Ton
1
integer
保留,应设置为0
npi
1
integer
保留,应设置为0
address_range
最大 41
C_DecString
保留,应设置为NULL
BIND_RECEIVER_RESP语法
消息头中的Command_ID 是“bind_receiver_resp"。
表6:BIND_RECEIVER_RESP语法
字段
大小(字节)
类型
描述
System_id
最大 16
C_String
接口ID
状态取值范围:
E_SUCCESS
E_OTHERERR
E_CMDLENERR
E_NORIGHT
E_INVLDSYSTEMID
E_INVLDPASSWORD
E_INVLDSYSTEMTYPE
E_INVLDIFVER
UNBIND命令
此命令用于断开ESME和SMSC之间的连接。
UNBIND语法
此消息只有消息头,没有消息体,消息头中的Command_ID是“unbind"。
UNBIND_RESP语法
此消息只有消息头,没有消息体,消息头中的Command_ID是“unbind_resp"。
状态取值范围:
E_SUCCESS
E_OTHERERR
E_CMDLENERR
E_NORIGHT
6.5.2.4 SUBMIT_SM命令
此命令用于ESME提交短消息到SMSC,以便SMSC把此短消息发给特定的移动台。
SUBMIT_SM语法
消息头中的Command_ID是"submit_sm"
表7:SUBMIT_SM语法
字段
长度(字节)
类型
描述
service_type
最大6
C_OctetString
保留,必须设为0
source_address_ton
1
integer
源地址编码类型
source_address_npi
1
integer
源地址编码方案
source_address
最大21
C_DecString
源地址
dest_address_ton
1
integer
目的地址编码类型
dest_address_npi
1
integer
目的地址编码方案
destination_address
最大21
C_DecString
目的地址
esm_class
1
integer
短消息类型
protocol_ID
1
integer
GSM协议类型
priority_flag
1
integer
优先级
schedule_delivery_time
最大17
C_StringTime
计划下发短消息的时间
validity_period
最大17
C_StringTime
短消息的最后有效期限
registered_delivery_flag
1
integer
注册短消息标志
replace_if_present_flag
1
integer
替换短消息标志。
data_coding
1
integer
数据编码方案
sm_default_msg_id
1
integer
预定义短消息ID
sm_length
1
integer
短消息的长度
short_message_text
最大161
可变
短消息数据内容
SUBMIT_SM_RESP语法
消息头中的Command_ID是"submit_sm_resp"
表8:SUBMIT_SM_RESP语法
字段
长度(字节)
类型
描述
Message_id
最大9
C_HexString
短消息ID
状态取值范围:
E_SUCCESS
E_OTHERERR
E_CMDLENERR
E_NORIGHT
E_ADDRERR
E_MOEXCEED
E_MTEXCEED
E_INVLDUSER
E_INVLDDATAFMT
E_CREATEMSGFAILURE
E_INVLDORGTON
E_INVLDORGNPI
E_ORGADDRERR
E_INVLDDESTTON
E_INVLDDESTNPI
E_DESTADDRERR
E_INVLDSCHEDULE
E_INVLDEXPIRE
E_INVLDESM
E_INVLDUDLEN
E_INVLDPRI
E_INVLDRDF
E_INVLDRPF
DELIVER_SM命令
此命令由SMSC产生,SMSC通过此命令发送短消息到目的ESME,它也可用于发送转发状态报告(DELIVERY RECEIPT)消息。
DELIVER_SM语法
它的语法和SUBMIT_SM的语法消息体是相同的,只是在消息头中的Command_ID是“deliver_sm"。
DELIVER_SM_RESP语法
它的语法和SUBMIT_SM_RESP的语法消息体是一样的,只是在消息头中的Command_ID是“deliver_sm_resp"。
附:消息体参数说明
address:
地址号码
address_range
地址范围
data_coding:
数据编码方案, ( 详见GSM 03.40 [1] 9.2.3.10)
dest_address_npi:
目的地址编码方案,同npi
dest_address_ton:
目的地址编码类型,同ton
destination_address:
目的地址,同address
esm_class:
短消息类型
Bit:
7
6
5
4
3
2
1
0
Flag:
Reserved
UDHI
Reserved
Delivery
RCPT
Reserved
其中UDHI为1表示短消息内容中有头结构,为0表示没有头结构。
Delivery RCPT为1表示是此条短消息是状态报告,0表示为正常的下发短消息。此位只对DELIVER_SM有效。
其他为保留。
如果有头结构,short_message_text为以下格式:
{
BYTE UDHL; //信息元素的结构集合所用的字节数
Information?Element-struct Information?Element;
//若干信息元素的结构集合, 其占用的字节数目由UDHL指示
...
SM; 短消息内容
}
其中Information?Element-struct的结构如下:
{
BYTE Information?Element?Identifier // 信息元素的标志
BYTE Length of Information?Element //信息元素数据所用的字节数
Information?Element Data
//信息元素数据,其占用的字节数目由Length of Information?Element指示
}
定义详见GSM 03.40 (7.2.0) 9.2.3.24
final_date:
短消息的生命期终止的实际时间,如果此短消息已从SMSC的等待发送队列中删除,即为删除时间,否则为SMSC当前的时间
GSM_code:
GSM错误码,见下表
错误码
值
描述
ERROR_NONE
0
无错误
P_UNKNOWN
1
不知道的用户
P_PROVISION
2
不提供此功能
T_BARRED
3
呼叫废弃
T_SUPPORT
4
此机制不支持
T_ABSENT
5
用户不能通讯
T_MSSUPPORT
6
移动台不支持短消息
T_MSERROR
7
移动台接收短消息出现错误
P_ILLEGAL_SUB
8
不合法的用户
P_ILLEGAL_EQUIP
9
不合法的设备
T_SYSTEM
10
系统失败
T_MEMCAP
11
内存不足
interface_version:
用来描述本协议的版本号
在ESME连接SMSC时,如果ESME提出的版本号高于SMSC的版本号,则SMSC给出否定响应,响应中的status表示SMSC的版本号;ESME提出的版本号低于或等于SMSC的版本号,则SMSC给出肯定响应,在连接成功后的会话过程中,双方将以ESME提出的版本号作为通信的依据。interface_version的值从1开始,0保留。
现约定,对于interface_version>=1,必须支持除REPLACE_SM_EX命令和用户管理命令以外的所有协议命令, 对于interface_version>=2, 必须支持所有本文中提到的协议命令。
message_id:
短消息ID,它由SMSC设置。用于查询以及替换短消息等操作时使用。
message_status:
短消息当前的状态:
0:转发状态
1:发送成功(不在尝试转发)
2:发送失败(不在尝试转发)
3:因下发失败而等待(继续尝试转发)
4:因定时消息而等待(继续尝试转发)
5:短消息被删除(不在尝试转发)
6:短消息超时删除(不在尝试转发)
7:无效状态(不在尝试转发)
8:EN_ROUTE,为兼容SMPP协议保留
9:DELIVERED,为兼容SMPP协议保留
10:EXPIRED,为兼容SMPP协议保留
11:DELETED,为兼容SMPP协议保留
12:UNDELIVERABLE,为兼容SMPP协议保留
13:ACCEPTED,为兼容SMPP协议保留
14:INVALID,为兼容SMPP协议保留
其他:保留
MS_type:
手机类型
0:中文手机
1:英文手机
>1:保留
npi:
地址编码方案,(定义详见GSM03.40[1] 9.1.2.5)
0:未知
1:ISDN电话编码方案
3:数据编码方案(X.121)
4:电报编码方案
8:国家编码方案
9:专用编码方案
10:ERMES 编码方案(ETSI DE/PS 3 01?3)
15:扩充保留
从0到15的其他值保留
OCOS:
最大提交短消息,某移动台提交到SMSC的等待下发的短消息的最大数目
password:
用来登录的密码
priority_flag:
优先级
1:高优先级
0:普通优先级
>1:保留
protocol_ID:
GSM协议类型(定义详见GSM03.40[1] 9.2.3.9)
registered_delivery_flag:
注册短消息标志,它表示当此短消息到达最后的目的地后,是否需要 转发状态报告(DELIVERY RECEIPT)。
0:不需要
1:需要
>1:保留
replace_if_present_flag:
替换标志,当SUBMIT命令中指示的源地址和目的地址与等待下发的短消息的源地址和目的地址都相同时,是否替换这些等待下发的短消息。在DELIVERY命令中该参数无效,需置为0。
0:不替换
1:替换
>1:保留
schedule_delivery_time:
对于SUBMIT命令,该参数指计划下发短消息的时间,对于DELIVERY命令,该参数指SMSC收到要下发到ESME的短消息的时间。
service_type:
保留,必须设为NULL,原该参数指明短消息服务的类别
short_message_text:
短消息数据内容,当编码类型为7位码,类型为C_String,最大长度为160个字符。8位码时,类型为C_String,最大长度为140个字节。当为Unicode时,类型为C_UnicodeString,最大长度为70个字符。
SM_allowed:
是否提供短消息业务
0:不提供
1:提供
其余值保留
sm_default_msg_id:
预定义短消息ID,不是预定义短消息时应设为0。预定义短消息ID值从0x01到 0x64,其值的具体含义由特定的ESME和SMSC约定。其余值保留。
sm_length:
短消息的数据长度,以字节计算。
source_address:
源地址编号,同address。
source_address_npi:
源地址编码方案,同npi。
source_address_ton:
源地址编码类型,同 ton。
sub_address:
用户通信地址。
sub_ID:
用户ID,同address。
sub_name:
用户名。
reg_datetime:
用户注册登记时间 。
system_id:
接口ID,用来描述虚拟连接的用户名,即ESME登录SMSC使用的帐号。
system_type:
用来描述用户的类型。
TCOS:
最大下发数,指等待下发到某移动台的最大短消息数目。
ton:
地址编码类型,(定义详见GSM03.40[1] 9.1.2.5)
0 未知号码
1 国际号码,例如8613901234567
2 国内号码,例如13901234567
3 网络专用号码
4 用户号码
5 字母号码(按照 GSM?TS03.38 7-bit 缺省字母表编码)
6 缩写号码
7 保留
validity_peroid:
短消息的最后生存期限。
附录A:命令标志数值定义
命令码宏定义
数值
描述
ESME_BNDRCV
0X00000001
ESME要求连接到SMSC
ESME_BNDRCV
0X80000001
连接SMSC的响应
ESME_BNDTRN
0X00000002
ESME要求连接到SMSC
ESME_BNDTRN_RESP
0X80000002
连接SMSC的响应
ESME_UBD
0X00000006
ESME要求断开连接到SMSC
ESME_UBD_RESP
0X80000006
断开连接的响应
ESME_SUB_SM
0X00000004
ESME提交短消息到SMSC,以便SMSC下发此短消息到特定的用户。
ESME_SUB_SM_RESP
0X80000004
提交短消息的响应
ESME_DELIVER_SM
0X00000005
SMSC下发短消息到特定的ESME
ESME_DELIVER_SM_RESP
0X80000005
下发短消息的响应
ESME_QUERY_SM
0X00000003
ESME查询以前所提交的短消息的状态
ESME_QUERY_SM_RESP
0X80000003
查询短消息的响应
ESME_CANCEL_SM
0X00000008
ESME要求取消以前所提交的某条短消息
ESME_CANCEL_SM_RESP
0X80000008
ESME要求取消以前所提交的某条短消息的响应
ESME_REPLACE_SM
0X00000007
ESME要求替换以前所提交的某条短消息
ESME_REPLACE_SM_RESP
0X80000007
ESME要求替换以前所提交的某条短消息的响应
ESME_QRYLINK
0X00000015
询问扩展短消息实体与短消息中心的连接情况
ESME_QRYLINK_RESP
0X80000015
询问扩展短消息实体与短消息中心的连接情况的响应
ESME_NACK
0X80000000
接收消息头错误的响应
ESME_REPLACE_SM_EX
0X00000090
ESME要求替换以前所提交的某条短消息的扩展命令,它增加了数据编码格式字段
ESME_REPLACE_SM_EX_RESP
0X80000090
扩展替换短消息的的响应
ESME_ADD_SUB
0X000000A0
增加用户
ESME_ADD_SUB_RESP
0X800000A0
增加用户的响应
ESME_DEL_SUB
0X000000A1
删除用户
ESME_DEL_SUB_RESP
0X800000A1
删除用户的响应
ESME_MOD_SUB
0X000000A2
修改用户
ESME_MOD_SUB_RESP
0X800000A2
修改用户的响应
ESME_QRY_SUB
0X000000A3
查询用户的信息
ESME_QRY_SUB_RESP
0X800000A3
查询用户的信息的响应