消息名
|
传递方向
|
解释说明
|
CMPP_CONNECT
|
SP---àISMG
|
CMPP_CONNECT操作的目的是SP向ISMG注册作为一个合法SP身份,此消息需要向ISMG发出验证信息,验证方式采用md5加密密码方式,若注册成功后即建立了应用层的连接(否则ISMG会立即断开Socket),此后SP可以通过此ISMG接收和发送短信。
ISMG以CMPP_CONNECT_RESP消息响应SP的请求。具体的算法实现参考CMPP2.0文档和本文附件代码。
|
CMPP_CONNECT_RESP
|
SPß---ISMG
|
ISMG对CMPP_CONNECT消息的回复(无论是否验证成功);如果未通过,会在消息中包含参考信息,但ISMG会立即断开连接。
|
CMPP_ACTIVE_TEST
|
SPßàISMG
|
这个消息通信双方都可以发出,目的是在没有其他消息发送时,保持双方的通信链路的连接,避免系统认为通信通道已经关闭。每一个收到此消息的实体应当返回CMPP_ACTIVE_TEST_RESP消息,以“礼节性”表示自己的还在通信,维持数据连接有效性。
不过,据网友交流,有些厂家实现的ISMG,仅仅靠自己发出此消息等待SP回答CMPP_ACTIVE_TEST_RESP来确定数据链路的有效性,而忽略SP的CMPP_ACTIVE_TEST消息(有些霸道吧?)这个值得注意,不要仅仅实现发送而不响应此消息,避免数据连接失效。
|
CMPP_ACTIVE_TEST_RESP
|
SPßàISMG
|
对通信的另一端的CMPP_ACTIVE_TEST消息的回复。作用参考CMPP_ACTIVE_TEST的解释。
|
CMPP_SUBMIT
|
SP---àISMG
|
在正确建立了数据连接后,SP向ISMG发送一个SMS数据包。本消息需要仔细研究。接收到此消息后,ISMG需要以CMPP_SUBMIT_RESP消息作为回答。如果在一定时间时间内(移动给出的参考值60秒)内未得到消息回应,那么SP需要重新发送此数据包,以确保消息得到投递。如果重发达到3次后仍然得不到回应,SP端应该考虑可能ISMG已经失效,应当停止发送此短消息。
|
CMPP_SUBMIT_RESP
|
SPß---ISMG
|
该消息由ISMG发送给SP,同时返回一个“收条”(源CMPP_SUBMIT消息的ISMG端的标示MSGID)给SP,表示“我ISMG已经确认收到你这条消息了”。收到此消息后,SP需要保留此“收条”,因为后面ISMG会最终报告本消息是否正确发送到用户手机。那个报告就是以此消息的“收条”作为确认那一条消息的。
|
CMPP_QUERY
|
SP---àISMG
|
这个查询不是查询单条消息的,是查询SP发送给ISMG的短信的业务情况。可以查总计数,还可以分类查询。(基本就是发起对移动sms业务数据库的查询统计)
|
CMPP_QUERY_RESP
|
SPß---ISMG
|
ISMG将查询的数据返回给SP。
|
CMPP_CANCEL
|
SP---àISMG
|
SP发起的取消某条消息的命令消息,其中包含了之前已经发送给ISMG消息的“收条”以便ISMG可以确定是那一条消息。如果消息已经发送给用户了,那么此消息/命令会无效,ISMG返回失败。
|
CMPP_CANCEL_RES
|
SPß---ISMG
|
ISMG返回的对CMPP_CANCEL的回复,并告知是否删除成功。
|
CMPP_DELIVER
|
SPß---ISMG
|
当有MO或者状态报告时,ISMG发送此消息。注意,此消息的数据可以是用户手机发送给SP的消息,也可是对于之前SP发送到ISMG的短信的最终状态的回复,报告短信的最终状态。
|
CMPP_DELIVER_RESP
|
SP---àISMG
|
SP礼节性的回复告知收到CMPP_DELIVER消息。要指出SP报告的CMPP_DELIVER消息的MSGID,以便ISMG知道那一条消息SP已经确认收到。
|
CMPP_TERMINAT
|
SPßàISMG
|
SP和ISMG都可以主动发消息给对方,自己这端由于某种原因需要终止当前的数据连接。终止后,要经过重新Connection(验证)之后才可以(进入事务阶段)发送SMS数据消息。
|
CMPP_TERMINATE_RES
|
SPßàISMG
|
通知对方,本端已经最好撤除连接的准备。
|
字段名
|
长度(byte)
|
类型
|
描述
|
Msg_Id
|
8
|
Unsigned Integer
|
信息标识,应该由SP侧ISMG本身产生,本处填空,供ISMG传输时使用。SP提交时候应当留空。
|
Pk_total
|
1
|
Unsigned Integer
|
相同Msg_Id的信息总条数,从1开始。如果一条消息长度超多一条短信,可能需要分解成多条消息,那么实际上这多条消息属于一条完整消息,所以可以根据此给分解得到的多条短信进行编号,那么总计需要编成多少条短信,此处就填写多少。
|
Pk_number
|
1
|
Unsigned Integer
|
相同Msg_Id的信息序号,从1开始。编号决定消息的相对位置。
|
Registered_Delivery
|
1
|
Unsigned Integer
|
是否要求返回状态确认报告:
0:不需要
1:需要
2:产生SMC话单(该类型短信仅供网关计费使用,不发送给目的终端)。
一般情况下,都需要确认报告。SMC话单也需要返回是否成功的报告。这条消息用于包月SMC时,当你发送消息给移动的ISMG,移动的计费系统会一次性扣除用户的信息费,但是此消息不会送到用户手机。但是注意,有的ISMG厂商(很可能是移动要求)实现此消息时候,如果你并没有发送任何此包月类型的消息给用户手机,是不发生扣费行为的。移动会认为这是属于违规的“代收费”行为,会影响同移动的合作关系。
|
Msg_level
|
1
|
Unsigned Integer
|
信息级别,信息的优先级。不过实际当中,感觉ISMG端并没有区分优先级。
|
Service_Id
|
10
|
Octet String
|
业务类型,是数字、字母和符号的组合。这个表示业务的字符串可以给发出的短信分类。通过此字段大约可以知道每个服务项目的业务量,有利于统计和计费以及结算。
|
Fee_UserType
|
1
|
Unsigned Integer
|
计费用户类型字段
0:对目的终端MSISDN计费;
1:对源终端MSISDN计费;
2:对SP计费;
3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
|
Fee_terminal_Id
|
21
|
Unsigned Integer
|
被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段取0、1、2时互斥)
|
TP_pId
|
1
|
Unsigned Integer
|
GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
|
TP_udhi
|
1
|
Unsigned Integer
|
GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
|
Msg_Fmt
|
1
|
Unsigned Integer
|
信息格式
0:ASCII串
3:短信写卡操作
4:二进制信息
8:UCS2编码
15:含GB汉字
这个决定了Msg_Content字段的字节内容应该按照什么编码来解码/编码。
|
Msg_src
|
6
|
Octet String
|
信息内容来源(SP的企业代码),例如919000。
|
FeeType
|
2
|
Octet String
|
资费类别
01:对“计费用户号码”免费
02:对“计费用户号码”按条计信息费
03:对“计费用户号码”按包月收信息费
04:对“计费用户号码”的信息费封顶
05:对“计费用户号码”的收费是由SP实现。
通常值为02,注意这是一个字符串,并非整型。
|
FeeCode
|
6
|
Octet String
|
资费代码(以分为单位),如:“0050”代表人民币0.50元。
|
ValId_Time
|
17
|
Octet String
|
存活有效期,格式遵循SMPP3.3协议
|
At_Time
|
17
|
Octet String
|
定时发送时间,格式遵循SMPP3.3协议。这个字段可以让短信在规定的时间给手机用户。一般情况下不填,保留为空字符串。
|
Src_Id
|
21
|
Octet String
|
源号码
SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。实际上就是服务代码,可以是长号码
|
DestUsr_tl
|
1
|
Unsigned Integer
|
接收信息的用户数量(小于100个用户),通常是1。移动是忌讳一条消息发给多个用户的。
|
Dest_terminal_Id
|
21*DestUsr_tl
|
Octet String
|
接收短信的MSISDN号码,一个类似字符串数组的结构。受DestUsr_tl的约束,决定了本字段的长度。
|
Msg_Length
|
1
|
Unsigned Integer
|
信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)。如果是ASCII码,可以达到160个英文字母。原因是因为英文字母仅占用7bit,而中文等双字节代码需要16位,同时每一个字节最高为都占用,所以最多140个字节,也就是70个汉字。
|
Msg_Content
|
Msg_length
|
Octet String
|
信息内容
|
Reserve
|
8
|
Octet String
|
保留
|
字段名
|
字节数
|
属性
|
描述
|
Msg_Id
|
8
|
Unsigned Integer
|
信息标识
生成算法如下:
采用64位(8字节)的整数:
(1)时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中
bit64~bit61:月份的二进制表示;
bit60~bit56:日的二进制表示;
bit55~bit51:小时的二进制表示;
bit50~bit45:分的二进制表示;
bit44~bit39:秒的二进制表示;
(2)短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中。
(3)序列号:bit16~bit1,顺序增加,步长为1,循环使用。
各部分如不能填满,左补零,右对齐。
|
Dest_Id
|
21
|
Octet String
|
目的号码
SP的服务代码,一般4--6位,或者是前缀为服务代码的长号码;该号码是手机用户短消息的被叫号码。
|
Service_Id
|
10
|
Octet String
|
业务类型,是数字、字母和符号的组合。
|
TP_pid
|
1
|
Unsigned Integer
|
GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
|
TP_udhi
|
1
|
Unsigned Integer
|
GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
|
Msg_Fmt
|
1
|
Unsigned Integer
|
信息格式
0:ASCII串
3:短信写卡操作
4:二进制信息
8:UCS2编码
15:含GB汉字
|
Src_terminal_Id
|
21
|
Octet String
|
源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)
|
Registered_Delivery
|
1
|
Unsigned Integer
|
是否为状态报告
0:非状态报告(MO SMS)
1:状态报告
此字段决定了CMPP_DELIVER消息到底是手机上行一条消息到SP还是ISMG向SP报告之前发送的消息最终递送状态。
|
Msg_Length
|
1
|
Unsigned Integer
|
消息长度。是指Msg_Content字段的长度。
|
Msg_Content
|
Msg_length
|
Octet String
|
消息内容。如果消息不是状态报告,那么按照Msg_Fmt指示解码为特定编码的字符串内容。
|
Reserved
|
8
|
Octet String
|
保留项
|
字段名
|
字节数
|
属性
|
描述
|
Msg_Id
|
8
|
Unsigned Integer
|
信息标识
SP提交短信(CMPP_SUBMIT)操作时,与SP相连的ISMG产生的Msg_Id。
这个MSGID实际上就是SP之前发送一个CMPP_SUBMIT消息之后的CMPP_SUBMIT_RESP消息中返回的关于CMPP_SUBMIT消息的ISMG编号.,根据此MSGID可以知道那条消息最终确定的递送状态。
|
Stat
|
7
|
Octet String
|
发送短信的应答结果,含义与SMPP协议要求中stat字段定义相同,详见下面。SP根据该字段确定被报告的CMPP_SUBMIT消息的处理状态。
|
Submit_time
|
10
|
Octet String
|
YYMMDDHHMM(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59)
|
Done_time
|
10
|
Octet String
|
YYMMDDHHMM
|
Dest_terminal_Id
|
21
|
Octet String
|
目的终端MSISDN号码(SP发送CMPP_SUBMIT消息的目标终端)
|
SMSC_sequence
|
4
|
Unsigned Integer
|
取自SMSC发送状态报告的消息体中的消息标识。
|
消息状态名
|
最终状态
|
描述
|
DELIVERED
|
DELIVRD
|
消息到达目标
|
EXPIRED
|
EXPIRED
|
消息过期
|
DELETED
|
DELETED
|
消息被删除
|
UNDELIVERABLE
|
UNDELIV
|
消息未被送达
|
ACCEPTED
|
ACCEPTD
|
消息被认可
|
UNKNOWN
|
UNKNOWN
|
未知状态
|
REJECTED
|
REJECTD
|
消息被弹回
|