`
senilon
  • 浏览: 15913 次
  • 来自: 重庆(目前漂在深圳)
社区版块
存档分类
最新评论

CMPP协议参考(部分)

阅读更多
一、CMPP协议简介
中国移动通信互联网短信网关接口协议(China Mobile Peer to Peer CMPP),是中国移动梦网内部各SMS参与节点相互交换SMS的官方协议。作为梦网的参与方,移动梦网的增值服务商(Service Provider SP )要按照此协议规范实现SP的部分,才可以将自己的短信通过移动的GSM网络的数据通道传输到最终手机用户上。
实际上,协议规范了3个方面的内容:
。SP与移动的互联网短信网关(Internet Short Message Gateway,ISMG)之间的接口协议
。ISMG之间的接口协议(譬如移动各省、市之间的短信息交换通过ISMG之间进行)
。ISMG与汇接网关(Gateway Name Server GNS,类似互联网上的DNS服务器)之间的接口协议,譬如跨省之类的短信需要GNS的帮助指出当前ISMG该如何传递短信。
其中,后二方面属于移动短信息系统内部实现,对于SP来讲大概可以“透明”来看待,只要实现了SP同ISMG的正确交互,就可以实现接入移动梦网短信系统。我们关心的只是SP端的开发细节。
 
二、CMPP交互模式
从手机用户角度讲,按短信的发起/接收路径来讲,有两个叫法:
MT(Short Message Mobile Terminated, SMMT),短信接收,短信从SP发送到手机用户。
MO (Short Message Mobile Originate,SMMO),短信发送,短信从手机用户端发送到目标SP。
这两类短信交互,从SP端来看,都是属于Socket传输应用,CMPP的协议是以TCP/IP协议作为底层承载协议的,属于TCP/IP协议栈之上的应用。
SP同ISMG的交互连接分长连接短连接
所谓短连接,就是一次连接,传输一个消息,然后等待回复后拆除连接,显然,效率很低,所以,基本上不被考虑.所谓长连接,就是SP建立同ISMG连接,然后不断将数据包(一个个CMPP消息)发送到ISMG,此处发送不必等待某条消息的ISMG回应消息返回,就接着发送下一个消息。同时,等待ISMG返回信息或者等待ISMG发送给SP的消息。发送同接收消息不是一定要同步的,实际采用异步(同时也时双工)模式。从效率上,显然,必须全双工的异步模式才能够满足实际应用需求。
如下图(摘自CMPP2.0官方文档)所示,演示了长连接模式数据传输过程:
 
 
 
 
 
 
 

三、SP端开发
1.         消息分类
首先,图中的CMPP消息有很多种,SP同ISMG之间交流这些消息。大体上这些消息发出后,对方往往需要回复一个应答(RESP)类消息。注意,这些消息大多具有方向性,也就是说只能够从一端到另一端,而不可反方向进行,有些(少数)则可两端都能够发出。以下信息主要来源于移动的文档,但针对大家易混淆或源文档解释不够详细做了明确和补充。具体见下表:
       消息名
传递方向
解释说明
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
通知对方,本端已经最好撤除连接的准备。
                    
2.         交互阶段
整个CMPP协议交互分为验证事务两个阶段。验证阶段,发送CMPP_CONNECTION消息进行验证,通过验证后(必须要通过才)进入CMPP事务阶段,可以发送短信数据了。上表中的CMPP_CONNECTION以下的消息都属于事务阶段的消息。
 
3.         消息数据结构
每一个消息包含 消息头消息体两个部分,头固定长度为12字节,其他消息长度各异,但是同一类型消息的长度是固定的。所有消息的各个字段基本上仅有3种类型:Unsigned Integer (无符号整型)  、Integer(整型)、Octet String(字符串),每种类型具体长度不定,网络字节顺序。
1、 消息头(3个Unsigned Integer字段组成):
4字节的Total_Length (Unsigned Integer),包含了此消息的总计(包括了头部分)长度。
4字节的Command_Id(Unsigned Integer),指明了此消息到底是什么消息,就是上表中消息的枚举值。应用程序根据此值确定本数据包到底是什么消息,从而可以按照确定的消息类型,解析余下的消息体。
4字节的Sequence_Id(Unsigned Integer),指明了此数据包在发送此消息端的唯一编号。这个唯一编号,实际上可以看作流水操作编号。因为分析到交互模式我们看到,SP发送数据到ISMG,不是每发送一个就停下来等待ISMG的回复,而是“一下子”发送多个数据包过去,然后等待ISMG的回应。然而,怎么知道回应的消息是到底对应之前发送过去的消息中的那一条呢?本字段就是解决此难题。SP按照编号发送消息过去,等待ISMG的回应—一般情形下回应消息数据结构都有表明本消息回应的是SP发出的哪一条消息,这个对应就是依靠Sequence_Id。它并不要求一定要严格唯一,但是在给定的一段时间内,必须唯一(基本上只要SP发送过去的消息中没有重复就行了)。如果是需要SP回答的消息,SP也必须将ISMG发送过来的消息的Sequence_Id填入相应字段,表明这是某个消息的回应。SP端和ISMG端Sequence_ID都没有确定具体的算法。SP可以(但不推荐)采用数据库的唯一Id作为此值。
 
2、消息体。消息体长度根据消息不同,长度不一。其他的参考移动的文档《中国移动通信互联网短信网关接口协议(China Mobile Peer to Peer, CMPP)(V2.0)》,这里着重讲讲2个重要消息的消息体数据结构:
       CMPP­_SUBMIT的消息体:
字段名
长度(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
分享到:
评论
1 楼 lzlr1324 2008-03-26  
怎么没个本质的东西,复制来复制去  有意思么?

相关推荐

    CMPP协议参考实现

    CMPP协议报文由固定头部、可变头部和数据体三部分组成。固定头部包含了消息ID、命令ID、序列号等基本信息;可变头部根据不同的命令类型有不同的字段,如消息源、消息目标等;数据体则包含具体的消息内容,如短信...

    华为cmpp协议短信网关Delphi源码

    CMPP协议主要包括以下几个关键部分: 1. **连接建立**:CMPP协议通常基于TCP/IP协议栈,源码会实现与华为短信中心建立长连接的过程,确保数据传输的稳定性和可靠性。 2. **CMPP连接心跳**:为了维持连接的活跃状态...

    移动运营商CMPP通讯协议文档(v2.0 、v3.0)

    3. **消息类型**:CMPP协议定义了多种消息类型,包括CMPP_SUBMIT(提交短信)、CMPP_DELIVER(接收短信)、CMPP_QUERY(查询短信状态)、CMPP_CANCEL(取消发送短信)等。每种消息类型都有特定的字段和操作流程。 4...

    CMPP3.0参考代码和文档

    CMPP3.0参考代码和文档包含了实现CMPP协议所需的详细信息和技术指南。这些资料对于开发者来说是非常宝贵的,可以帮助他们快速理解和实现与中国移动网络的交互。以下是CMPP3.0的一些关键知识点: 1. **协议结构**:...

    CMPP3.0协议源码(,调试通过,代码全)

    2. **消息编码解码**:CMPP协议中的每个消息都有固定的报文结构,包括消息头、消息体等部分。源码中会包含将业务数据按照CMPP协议规范进行打包和解包的函数,这些函数通常会涉及二进制操作和网络字节序转换。 3. **...

    CMPP接口协议3.0

    对CMPP协议中的各种消息类型进行了详细定义,包括消息格式、字段含义、消息头和消息体等内容,是实现协议的关键部分。 9. **操作流程**: 描述了消息的发送、接收、确认和异常处理流程,以及不同情况下的错误恢复...

    中国联通CMPP协议源代码

    3. **网站短信平台**:"网站短信平台.rar"可能是一个完整的短信服务系统,包括用户界面、后台逻辑以及与CMPP协议对接的部分。这个平台可以让网站管理员或者用户通过Web界面发送和接收短信,同时支持批量发送、定时...

    中国移动cmpp3.0协议文档.pdf

    《中国移动cmpp3.0协议文档》深入解析 一、概览 中国移动cmpp3.0协议,全称为“China ...通过该协议,中国移动为用户提供了一套稳定、可靠的短信通信解决方案,同时也为行业内的技术创新与服务升级提供了参考标准。

    中国移动 CMPP 协议

    该部分详细定义了CMPP协议中各种消息的具体格式和内容,包括但不限于: - **8.4.1 SP请求连接到ISMG(CMPP_CONNECT)操作** - **8.4.1.1 CMPP_CONNECT消息定义(SPàISMG)**: 定义了SP向ISMG发起连接请求的消息...

    CMPP.rar_CSharp cmpp_cmpp_cmpp 2.0 C#_短信网关_网关

    2. **协议解析与封装**:理解CMPP协议的报文结构,包括命令标识、序列号、消息体等部分,将这些信息解析成可读的格式或封装成二进制数据发送。 3. **多线程编程**:为了处理并发请求,通常会用到多线程技术,确保多...

    cmpp3开发包(华为提供).rar_CMPP3_CMPP3 java_cmpp_java cmpp_华为

    “cmpp3开发包”则是核心部分,它包含了实现CMPP3.0协议的Java类库。开发者可以使用这些类库来创建客户端程序,与MC建立连接,发送和接收短信。这些类通常包括连接管理类、消息构建和解析类以及异常处理类。例如,...

    CMPP.rar_cmpp_cmpp delphi_delphi cmpp

    "华为网关cmppDelphi源码"很可能是包含了一个使用Delphi编写的CMPP协议客户端的源代码示例,这为开发者提供了学习和理解如何实现在Delphi中操作CMPP协议的实践参考。 CMPP协议的主要组成部分包括以下几个部分: 1....

    cmpp 2.0协议

    3. **消息格式**:CMPP协议的消息结构包括消息头、消息体两部分。消息头包含消息ID、命令ID、序列号等字段,用于标识和跟踪消息;消息体则根据不同类型的命令携带不同的参数,如源和目标终端号码、短信内容、消息...

    cmpp java 中国移动cmpp网管程序

    通过深入理解这些Java源码,开发者可以更好地掌握CMPP协议的实现细节,为自己的短信服务系统提供参考和借鉴。 总结,中国移动的CMPP网管程序结合Java语言,构建了一套高效、稳定的短信服务平台。理解和掌握CMPP协议...

    中国移动cmpp3.0协议文档

    CMPP协议的基本结构是基于TCP/IP的,它定义了SP(Service Provider,服务提供商)与SCP(Short Message Service Center,短消息服务中心)之间的通信标准。该协议主要包括以下几个部分: 1. **连接建立**:在CMPP...

    中国移动短信网关模拟器支持cmpp2.0

    4. 支持日志记录,便于分析和调试应用在处理CMPP协议时的行为。 在使用"cmpp2smg"这个压缩包文件时,开发者可以期待找到以下内容: 1. 模拟器软件:可能包含一个可执行文件或一组脚本,用于启动和配置模拟器。 2. ...

    利用CMPP\SGIP协议发送长短信发送格式说明

    利用 CMPP/SGIP 协议发送长短信发送格式说明 本资源摘要信息旨在详细解释利用 CMPP/SGIP 协议发送长短信的格式说明。长短信是一种特殊的短信格式,它允许发送超过 70 个汉字的信息内容,但需要将其拆分成多条短信,...

    中国移动短信协议CMPP封装 hicmpp

    hicmpp是针对CMPP协议的一个封装库,方便开发者进行短信服务的开发。下面将详细介绍CMPP协议以及hicmpp的相关知识。 CMPP协议概述: 1. **协议层次**:CMPP协议基于TCP/IP,位于应用层,用于实现SP和SCP之间的通信...

Global site tag (gtag.js) - Google Analytics