`
逆风的香1314
  • 浏览: 1436761 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

协议开发 中移动CMPP2.0协议API(二)

阅读更多
 

接上篇:

其实说到API的开发,也只是包装了一个通讯协议。让上层用户可以不用去知道详细的协议解释,而专注于自己的业务模块。

 <!----><o:p></o:p>

对于CMPP2.0协议,要用的指令也就8个,相对来说并不是很复杂

CMPP_CONNECT          =0x00000001; //       请求连接

CMPP_CONNECT_RESP     =0x80000001; //       请求连接应答

CMPP_TERMINATE        =0x00000002; //       终止连接

CMPP_TERMINATE_RESP   =0x80000002; //       终止连接应答

CMPP_SUBMIT           =0x00000004; //       提交短信

CMPP_SUBMIT_RESP      =0x80000004; //       提交短信应答

CMPP_DELIVER          =0x00000005; //       短信下发

CMPP_DELIVER_RESP     =0x80000005; //       下发短信应答

CMPP_QUERY            =0x00000006; //       短信状态查询

CMPP_QUERY_RESP       =0x80000006; //       短信状态查询应答

CMPP_CANCEL           =0x00000007; //       删除短信

CMPP_CANCEL_RESP      =0x80000007; //       删除短信应答

CMPP_ACTIVE_TEST      =0x00000008; //       激活测试

CMPP_ACTIVE_TEST_RESP =0x80000008;       //     激活测试应答

 <o:p></o:p>

实现CMPP协议模块也就是实现上面的8个指令就可以了。按照上面说的设计模式,同进结合API开发来说一下协议的实现。

 <o:p></o:p>

对于API对外的接口,一般的定义格式如下:

 <o:p></o:p>

extern "C" __declspec( dllexport ) int WINAPI ActiveTest()

 <o:p></o:p>

接下来就是实现接口的功能:

 <o:p></o:p>

一、建立SOCKET连接

struct sockaddr_in _socaddr ;

    _socaddr.sin_family      = AF_INET;

    _socaddr.sin_port        = htons( _port );

    _socaddr.sin_addr.s_addr = inet_addr( _ismg );

        return connect( _soc, (struct sockaddr *)&_socaddr, sizeof( _socaddr ));

 <o:p></o:p>

致于设置发送超时,接收超时还有阻塞或非阻塞的接收模式,可以自己根据需要去设置不同的目标值。

 <o:p></o:p>

、登录短信网关服务器<o:p></o:p>

CMPP协议,主要的部分是就是AuthenticatorSource = MD5Source_Addr+9 字节的0 +shared secret+timestamp),MD5算法在网上可以直接找到源程序,不必要自己重新去写这个内容。这部分内容相对比较简单就不在这里再写出来了。

       

//计算单向HASH函数的值

    strcpy( authsrc, _spid ) ;

       char * pos = authsrc + strlen( _spid ) + 9 ;  //9 字节的0

    strcpy( pos, _passwd ) ;

       pos += strlen( _passwd );

       strcpy( pos, _timestamp( timestr ));    //时间戳

       pos += strlen( timestr );

 <o:p></o:p>

    ctx.update(( unsigned char * )authsrc, (int)( pos - authsrc ));

       ctx.finalize();

    ctx.raw_digest( msg->digest );              //复制转换成MD5的字符串到发送数据中

 <o:p></o:p>

三、提交短信息<o:p></o:p>

相对于登录来说,提交短信也不会很复杂。只是简单的把客户端程序提交过来的数据复制到发送窗口,发送并等待网关回应的状态就可以了,当然也可以在接收到用户的数据前作一些适当的如:手机号码是否全数字,定时发送或存活时间是否正确等的判断。

               <o:p></o:p>

//要注意的就是可变的用户数据与保留字段的内容:

memcpy( _pkg->data, &msg, sizeof( CMPP_SUBMIT ));

               //将最后8个字节的保留数据拷贝到适当的位置

              memcpy(

               ( _pkg->data + nsize - sizeof( msg.reserve ) - sizeof( CMPP_HEAD )),

               msg.reserve,

               sizeof( msg.reserve ));<o:p></o:p>

 <o:p></o:p>

四、接收短信息和状态<o:p></o:p>

        接收短信后有两种处理方式,

1、  采用回调函数的方式:

这种方式相对于API来说比较简单,只要定义一下接口函数就可以了,客户端程序在初始化时,传入回调函数的函数指针,当API接收到短信网关下发(DELIVER)的短信时,调用函数指针把相关参数据传递给客户端。不必要考虑队列或其它细节的问题。

 <o:p></o:p>

如下我在API中定义的回调函数:

typedef int ( WINAPI * TProcGetDeliver )(

            char * msgid,

            unsigned char * destnumber,

            unsigned char * serviceid,

            unsigned char tppid,

            unsigned char tpudhi,

            unsigned char msgfmt,

            unsigned char * srcnumber,

            unsigned char delivery,

            unsigned char msglen,

            unsigned char * msgcontent,

            unsigned char * reserve,

            unsigned char * stat,

            unsigned char * submittime,

unsigned char * donetime ) ;

             

              而在API对外接口中只要定义一个参数作为传送函数指针就可以了:如下:

 <o:p></o:p>

              extern "C" __declspec( dllexport ) int WINAPI IFInitInterface( char *ismg, unsigned short port, TProcGetDeliver fCltGetDeliver );

             

              fCltGetDeliver 就是用户传递过来的回调函数指针,在调用时,直接采用参数开式用调用就可以了。如下所示:

              err = _fCltGetDeliver ( (char * )&_msgid,

                                _msg->destnumber,

                                _msg->serviceid,

                                _msg->tppid,

                                _msg->tpudhi,

                                _msg->msgfmt,

                                _msg->srcnumber,

                                _msg->delivery,

                                _msg->msglen,

                                _msg->msgcontent,

                                _msg->reserve,

                                _stat,

                                _submittime,

                                _donetime

                                 ) ;

              这样所接收到的所有参数就顺利传递到客户端了。

 <o:p></o:p>

2、  调用API的客户端程序定时检测并从缓冲队列中拾取方式:

对于队列的方式,API内部必需自己建立一个缓冲队列。这个队列对于安全来说,必须是线程安全的(可以用临界区来保护),接收到一个下发信息时,数据暂时保存入队列中:

       int nl = sizeof( CMPP_HEAD ) + sizeof( CMPP_DELIVER ) ;

        _pushrecqueue( _recpkg, nl ) ;

下面是_pushrecqueue函数;

void WINAPI _pushrecqueue( void * inval, int nl )

{

    char * _queval = new char[ nl + 1 ] ;

    memset( _queval, 0, sizeof( nl + 1 )) ;

    memcpy( _queval, inval, nl ) ;

 <o:p></o:p>

    _queue._push( _queval ) ;

}

为了保证数据最大安全性,不要接收到过多的数据进入队列。放入队列的数据就等待用户用API接口过来取走就可以了,其相关接口与回调函的参数相差不多,在这里就不多作说明,只要说明一下可以提供一个接口,可以让客户端可以检测队列中是否有可以接收的数据:

       extern "C" __declspec( dllexport ) int WINAPI HasDeliver() ;

        这检是否取数据就由客户端去作判断了。待续......

分享到:
评论

相关推荐

    中国移动短信CMPP 2.0协议API

    中国移动短信CMPP 2.0协议API是一种专用于短信服务的通信协议,广泛应用于移动通信领域,特别是企业级应用,如验证码发送、信息推送等。该协议基于TCP/IP,为服务提供商提供了高效、稳定且安全的短信发送和接收功能...

    中国移动CMPP2.0短信接口开发

    总的来说,CMPP2.0短信接口开发涉及到网络编程、协议解析等多个技术领域,C#作为一种强大的.NET开发语言,提供了丰富的类库支持,使得开发者能够方便地实现与移动运营商的接口对接,实现高效、稳定的短信服务。

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

    中国移动短信网关模拟器是为开发者和测试人员提供的一种工具,它能够模拟中国移动的CMPP2.0协议,用于测试和验证短信应用的正确性和效率。CMPP2.0(China Mobile Short Message Peer-to-Peer Protocol version 2.0)...

    CMPP 2.0 C# 源码

    CMPP(China Mobile Peer-to-Peer)是一种由中国移动制定的通信协议,主要用于短信服务,包括短信提交、查询、接收和报告等操作。CMPP 2.0是该协议的一个版本,它在CMPP 1.0的基础上进行了优化和增强,提高了系统的...

    使用mina框架实现cmpp2.0服务端

    CMPP2.0是其第二代版本,提供了更高效、更安全的数据传输方式。该协议主要包含以下功能: 1. 短信提交:SP向中国移动网关发送短信。 2. 短信接收:SP从中国移动网关接收短信。 3. 短信状态报告:网关向SP反馈短信的...

    cmpp2.0模拟短信网关

    总的来说,这个“cmpp2.0模拟短信网关”是开发和测试短信服务功能的强大工具,通过它,开发者可以在本地环境中模拟真实的短信通信场景,进行功能验证和性能测试,从而提高应用的稳定性和用户体验。在使用过程中,...

    CMPP2.0实现

    包含接口API与测试工程: 主目录下是详细使用手册.接口文件放在API文件夹中. Demo Project中包含两个示例工程. 一个是模拟网关的源码--“CMPPGateway” 一个是SP连接网关的示例代码--“SPClient”

    中国移动通信CMPP2.0短消息网关开发接口使用手册

    **CMPP2.0(China Mobile Packet Protocol)**是中国移动制定的一套用于移动互联网短信业务的标准协议,旨在规范SP(Service Provider,服务提供商)与运营商之间短消息业务的交互流程。此手册详细介绍了一款基于...

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

    CMPP(China Mobile Peer-to-Peer)协议是中国移动通信公司为SP(Service Provider)提供的一种基于TCP/IP协议的通信协议,用于实现SP与移动运营商之间的数据传输,主要包括短信、彩信、WAP Push等业务。C#是微软...

    CMPP2.0、3.0网关以及蓝杰网关代码

    CMPP2.0和CMPP3.0是该协议的不同版本,分别对应不同的功能需求和性能优化。 CMPP2.0是早期的版本,它支持基本的短信业务,如点对点短信、群发短信、短信状态报告等。CMPP2.0协议主要由以下几个关键部分组成: 1. ...

    CMPP2.0JAVA调用

    CMPP2.0是China Mobile Packet Protocol的2.0版本,是中国移动为了高效地处理大量短信业务而设计的一种协议。这个协议主要用于SP(Service Provider)与SMSC(Short Message Service Center,短信服务中心)之间的...

    中国移动短信网关cmpp 3.0 华为java api

    开发者可以通过这些示例,快速掌握API的基本用法,进行二次开发。 5. **配置参数**:在使用API时,开发者需要修改配置参数,如网关地址、端口号、系统ID、密码等,以适应自己的环境。这些参数通常在配置文件中设定...

    cmpp2_cmpp2客户端和服务端测试工具_

    - 在开发过程中,通过这两个工具可以快速测试CMPP2协议的实现,避免因协议问题导致的短信发送失败或延迟。 - 进行压力测试:模拟大量并发请求,评估系统的承载能力和性能瓶颈。 - 故障排查:当短信服务出现问题时...

    cmpp短信网关协议Java版

    总之,这个Java版的CMPP2.0实现为开发者提供了一个快速接入中国移动短信服务的平台,通过理解并运用此项目,开发者可以深入理解短信网关协议的工作原理,并能有效地集成到自己的应用系统中,实现短信的发送和接收...

    CMPP API

    CMPP(China Mobile Short Message Peer-to-Peer Protocol)是中国移动制定的一种高效、可靠的点对点短消息传输协议,它分为CMPP2.0和CMPP3.0两个版本,分别对应不同的功能需求和性能优化。 在描述中提到,该API...

    移动企信通客户端cmpp2

    在这个项目中,开发者使用C#语言实现了CMPP2.0协议的客户端,使得开发者可以通过编程接口(API)方便地向中国移动的短信网关发送和接收短信。这个客户端可能包含以下关键组件: 1. **连接管理模块**:负责建立和...

    CMPP SMGP SGIP短信应用平台 v2.0

    在这个短信应用平台中,C#开发者已经为SGIP协议提供了相应的API接口,使得开发人员能够轻松地进行短信的收发操作。 在提供的压缩包文件中,"sms_gate.rar"可能包含了整个短信网关的核心代码,包括对CMPP、SMGP和...

    CMPP.rar_cmpp_cmpp接口

    在这个项目中,开发者使用VC6.0来实现CMPP2.0协议,创建了一个接口,使得SP可以通过这个接口与移动运营商的短消息网关进行交互,简化了接入过程,减少了开发的复杂性。 在提供的压缩包文件中,我们可以找到以下几个...

    CMPP20模拟网关

    1. **协议仿真**:CMPP20模拟网关能够精确地模拟中国移动的CMPP2.0服务器行为,包括连接管理、消息传输、错误处理等,帮助开发者在本地环境中进行功能测试和性能优化。 2. **消息模拟**:支持发送和接收各种CMPP2.0...

    中国移动通信CMPP3.0短消息网关开发接口库 4.0

    CMPP(China Mobile Peer-to-Peer)3.0协议是CMPP2.0的升级版,主要改进了协议的安全性、可靠性和效率。该协议定义了SP(Service Provider,服务提供商)与SCP(Service Control Point,服务控制点)之间的接口,...

Global site tag (gtag.js) - Google Analytics