SMPP是一种通用的短信接口协议

时间:2023-01-13 20:17:15
 

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

SMSCESME之间的传输网络可以是基于X.25, TCP/IP

 

 

ESMESMSC的消息

ESMESMSC的消息,如:提交、查询、删除短消息等请求,ESME必须以TRANSMITTER类型连接到SMSC

4描述了一个典型的TRANSMITTER类型的请求应答的示例。TRANSMITTER类型的ESME是以BIND_TRANCESMITTER连接到SMSCESME,此类型的ESMESMSC发起提交短消息,查询短消息状态,删除短消息等请求,SMSC返回请求的应答。

ESMESMSC之间的请求应答消息可以是阻塞方式也可以是异步方式的。所以ESME可能在SMSC没有应答的情况下,发起多个请求到SMSC


SMSC应该按照收到的请求顺序,给EMSE回响应。但是ESME必须能够处理没有按顺序的响应。

 

 


SMSCESME的消息

SMSCESME的消息,如:SMSC转发短消息到ESMEESME必须以RECEIVER类型连接到SMSC

5描述了一个典型的RECEIVER类型的ESMESMSC之间的消息序列的示例。RECEIVER类型的ESME是以BIND_RECEIVER连接到SMSCESMESMSC向此类ESME转发短消息,ESMESMSC回应答。

ESMESMSC之间的请求应答消息可以是阻塞方式也可以是异步方式的。所以SMSC可能在ESME没有回应答的情况下,发送发起多个deliver_sm请求到ESME


ESME应该按照收到请求顺序,给SMSC返回响应。但是SMSC必须能够处理没有按顺序回的响应。

 

 


消息流

本规范中规定的所有协议,不管是从ESMESMSC,还是从SMSCESME的消息,接收到请求的一方,都必须给请求方回一个应答消息acknowledge)。

 

 

消息语法

       在以下语法说明中,遵从以下规则:

              A.未使用的字段,依据类型必须设置为0NULL

              B.消息由消息头和消息体组成。

              C.状态(Command_status)的定义如表3所示。

 

状态定义

错误代码

描述

E_SUCCESS0X00000000

成功

E_OTHERERR0X00000001

其他错误

0X00000002 – 0X0000000F

保留给SMSC厂商定义错误

E_MSGLENERR0X00000010

消息长度错误

E_CMDLENERR0X00000011

命令长度错误

E_INVLDCMDID0X00000012

消息ID无效

E_NORIGHT0X00000013

没有执行此命令的权限

0X00000014 – 0X0000001F

保留

E_INVLDSYSTEMID0X00000020

无效的SYSTEMID

E_INVLDPASSWORD0X00000021

无效的密码

E_INVLDSYSTEMTYPE0X00000022

无效的SYSTEMTYPE

0X00000023 – 0X0000003F

保留

E_ADDRERR0X00000040

地址错误

E_MOEXCEED0X00000041

超过最大提交数

E_MTEXCEED0X00000042

超过最大下发数

E_INVLDUSER0X00000043

无效的用户

E_INVLDDATAFMT0X00000044

无效的数据格式

E_CREATEMSGFAILURE0X00000045

创建消息失败

E_INVLDMSGID0X00000046

无效的短消息ID

E_DATABASEFAILURE0X00000047

数据库失败

E_CANCELMSGFAILURE0X00000048

取消消息失败

E_MSGSTATEERR0X00000049

短消息状态错误

E_REPLACEMSGFAILURE0X0000004A

替换消息失败

E_INVLDRPLADDR0X0000004B

替换消息源地址错误

0X0000004C – 0X0000005F

保留

E_INVLDORGTON0X00000060

无效的源地址TON

E_INVLDORGNPI0X00000061

无效的源地址NPI

E_ORGADDRERR0X00000062

源地址错误

E_INVLDDESTTON0X00000063

无效的目的地址TON

E_INVLDDESTNPI0X00000064

无效的目的地址NPI

E_DESTADDRERR0X00000065

目的地址错误

E_INVLDSCHEDULE0X00000066

无效的定时时间

E_INVLDEXPIRE0X00000067

无效的超时时间

E_INVLDESM0X00000068

无效的ESM_CALSS

E_INVLDUDLEN0X00000069

无效的UDLEN

E_INVLDPRI0X0000006A

无效的PRI

E_INVLDRDF0X0000006B

无效的Registered_delivery_flag

E_INVLDRPF0X0000006C

无效的Replace_if_present_flag

0X0000006D – 0X0000007F

保留

用户管理部分(可选)

 

E_USERALREADYEXIST0X00000080

指定用户已经存在

E_CREATEUSERERR0X00000081

创建用户失败

E_USERIDERR0X00000082

用户ID错误

E_USERNOTEXIST0X00000083

指定用户不存在

0X00000084 – 0X0000008F

保留

0X00000090 – 0X00000FFF

保留给SMSC厂商定义错误

其他

保留

 

 

类型定义

              1integer:一定字节数所组成的整数,高位在前,低位在后。例                                             如:1字节(BYTE),2字节(WORD )  , 4字节 DWORD)                                                 6字节等等。

              2C_String:以NULL结束的ASCII字符串。

3C_DecString:以NULL结束的ASCII字符串,它由一系列的10进制字符                     组成(‘0---9’)。

       4C_OctetString:由任意8位字节组成数据流串。

              5C_HexString:以NULL结束的ASCII字符串,它由一系列的16进制字符组                         成(‘0---9’,‘A’(‘a’)---F’(‘f’))。

              6C_UnicodeString:以NULL结束的Unicode编码的字符串。

              7C_StringTime:表示时间的字符串,它为以下格式。“YYMMDDhhmmsstnnp"                  长度定为17个字节或1个字节,最后一个字节值必须为NULL1个字节表示                           使用缺省的时间定义(由短消息中心实现时具体设置),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表示此消息为ESMESMSC提交短消息。具体数值定义见附录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"

5BIND_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"

6BIND_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命令

此命令用于断开ESMESMSC之间的连接。

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"

7SUBMIT_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"

8SUBMIT_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

 

其中UDHI1表示短消息内容中有头结构,为0表示没有头结构。

Delivery RCPT1表示是此条短消息是状态报告,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:无效状态(不在尝试转发)

8EN_ROUTE,为兼容SMPP协议保留

9DELIVERED,为兼容SMPP协议保留

10EXPIRED,为兼容SMPP协议保留

11DELETED,为兼容SMPP协议保留

12UNDELIVERABLE,为兼容SMPP协议保留

13ACCEPTED,为兼容SMPP协议保留

14INVALID,为兼容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:扩充保留

015的其他值保留

 

       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,其值的具体含义由特定的ESMESMSC约定。其余值保留。

 

       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

查询用户的信息的响应