CMPP2.0 协议SP端的·NET开发

CMPP2.0 协议 SP 端的· NET 开发

TNT

** 内容简介 ** :本文介绍了 CMPP2.0 协议 SP 端 .net 实现需要注意的问题,并提供解决方案和参考意见,对 CMPP 协议做一个解读参考。

** 关键字 ** : CMPP 2.0 SMS ISMG Socket 线程 线程同步 .Net 事件模型

一、 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 间会需要?)

所谓长连接,就是 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 <SPAN style="F

Published At
Categories with Web编程
Tagged with
comments powered by Disqus