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 |
查询用户的信息的响应 |