time 
设为首页】【收藏本站
当前位置: 主页 > 软件工程 > 分析与建模 > 短消息网关通信模块的设计与实现

短消息网关通信模块的设计与实现

时间:2009-12-01 20:27 点击:472次 字体:[ ]




   : 在阐述短消息网关结构的基础上,提出了短消息网关通信模块的设计思想,并给出了该通信模块的具体实现。

   关键词: 短消息 ; 短消息网关 ; 通信

   •  前言

   随着通信技术的发展,无线互联网短消息业务正在为用户提供越来越多的服务。人们不仅可以通过手机点播定制新闻、股票信息、天气预报,还可以下载铃声、图片等。无论需要什么样的信息,我们都可以随时随地地通过手机接入互联网络,享受各种服务。电信运营商要实现这些增值业务,就必须支持网间的互联互通。

   目前实现网间互联互通的方式有四种,包括:通过移动关口局互联互通;通过信令转接点互联互通;通过短消息网关互联互通;通过第三方运营商系统互联互通。前两种方式不易设置计费点和引出计费话单,因此不利于网间结算;最后一种方式,虽然能够保证计费点和结算点的统一,但是易受到地域条件的限制 。 而通过短消息网关实现互联互通,无须对 现网运行的设备进行大面积的数据改动和升级改造,能够 合理的设置计费点,保证计费的准确性,实现业务鉴权和业务过滤的功能,保证网络的安全,也能够通过对业务流量的监视和控制,防止网络风暴的发生,这种互联方式具有其他三种方式不可比拟的优点。目前,大部分短消息业务的互联互通都是使用短消息网关来实现。

   •  短消息网关结构

   短消息网关( ISMG )是处于短消息中心( SMSC )和业务提供商( SP )之间的设备,它为这两个实体的数据交换提供安全、快捷的通道。网关与短消息中心之间使用 SMPP 协议( Short Message Peer to Peer, 短消息点对点协议) , 与 SP 之间使用 CMPP 协议( China Mobile Peer to Peer, 中国移动点对点协议),因此短消息网关需要完成协议的转换、计费、路由、安全和网络管理等功能。其结构图如图 1 所示。

短消息网关通信模块的设计与实现_www.fengfly.com

短消息网关通信模块的设计与实现_www.fengfly.com

   具体说来,图 1 中 SMPP 通信代理系统主要实现网关和 GSM 网中短消息中心( SMSC )的连接,确保准确接收和发送数据,实现高效、可靠的数据传输。为了达到规范要求的不超过 0.001% 的数据丢包率, SMPP 通信代理需要支持流量控制。 CMPP 通信代理系统主要是实现和 SP 服务提供商的连接,与 SMPP 通信代理系统不同的是,由于协议的影响, CMPP 通信代理是服务器端,需等待 SP 的连接,而 SMPP 通信代理是客户端,需要主动连接 SMSC 。短消息网关处理系统是网关中最复杂的处理进程,它完成的任务包括:向 GNS( 汇接网关 ) 查询路由,维护路由表,进行协议转换和数据分发。防火墙系统主要为网关系统提供安全保障,它包括 IP 包过滤和身份验证。短信网关计费系统主要形成各种计费话单,为计费提供依据。业务管理系统主要完成对业务进行统计报告,生成报表,为运营者对用户数据的添加、修改、删除以及对网关系统的监控、查询、操作和维护提供接口和界面。

   •  短消息网关通信模块的设计与实现

   短消息网关通信模块是整个短消息网关的基础。无论是计费、统计,还是超时重传,高质量的通信构架是必不可少的保障。这个通信构架不仅要完成基本的收发消息的功能,而且还要有好的结构以支撑各种业务需求,保证良好的扩展性。

   短消息网关通信模块的设计

   在设计短消息网关通信模块时,我们考虑了以下几点:

   第一,由于短消息网关功能繁多,如果把通信和具体业务合在一起开发,容易顾此失彼。可能会因为开始的考虑不周全,造成在增加某项新业务时不得不修改通信底层和原来的业务代码,导致重复开发。所以我们采用通信代理的方式把通信和具体业务分开,在增加新业务时,就只需少量修改通信代理的设置,而且不必再改动原来的业务代码了。

   第二,通信代理需要同时侦听多个端口,我们选用多路复用 I/O 这种方式。虽然多线程能够通过并行计算和共享内存提高代码效率和资源利用率,但在短消息网关中,处理的数据量大,多线程方式的并行处理会造成一些消息的逻辑混乱,资源共享也会增加代码的复杂度。而多路复用使用简单,逻辑清晰明了,不易发生错误,也不会出现因资源共享带来同步和互斥问题。因此使用多路复用 I/O 是比较合理的。

   第三,业务处理模块与通信代理之间可以使用队列进行通信,对队列的管理和参数的设置 (例如对同一队列操作的互斥,以及队列个数的设置等)都使用专门的队列内核程序统一调度并封装成函数接口,以方便业务处理模块对队列的使用。另外,通过队列通信,也可以为今后增加的业务提供良好的扩展性。

   第四,为了达到 99.999%的不丢包率,通信代理需要使用流量控制机制以保证网关内部不丢包。这是因为无论队列设置有多大,如果出现消息只发不收的情况,都会造成队列溢出而丢包。因此,为每个队列中缓存的消息做记录,当某个时刻队列消息的数量达到规定限度,队列就不再收包,以保证到达网关的消息不会丢失。

   短消息网关通信模块的实现

短消息网关通信模块的设计与实现_www.fengfly.com

短消息网关通信模块的设计与实现_www.fengfly.com

   基于以上设计思路,我们实现的短消息通信模块包括四个父进程: CMPP 通信代理 (cmpp_server) 、 SMPP 通信代理 (smpp_server) 、消息分发处理 server(package_server) 和前转消息处理 server(route_server) 。它们之间通过 6 个消息队列相互通信。具体的软件结构如图 2 所示。

   Cmpp_server 主要为 SP 和网关之间建立一条高质量的传输通道。它同时侦听与它相连的多个 socket ,通过队列接口函数 mqm_send( ) 把接收到的 CMPP 格式的消息送入队列 2 中。同时,它也要通过函数 mqm_recv( ) 不停的从队列 1 中获得消息,并把它转发到相应的目的 SP 。 cmpp_server 不需判断收到的消息类型,只负责通信,因此称通信代理。

   Smpp_server 与 cmpp_server 基本一致,唯一不同的只有一点: SMPP 协议规定 smpp_server 是客户端,需要主动发起建立连接的请求;而 CMPP 协议规定 cmpp_server 是服务器端,需等待对方连接。

   Package_server 是短消息网关的核心,所有的消息都要经过它,包括协议转换,超时重传,计费,路由,都需要在 package_server 中完成。 package_server 同时监听 2 、 4 、 6 三个队列,根据不同的消息头来判断这个消息的下一个目的地。路由表也需要在 package_server 中维护,以便 package_server 能得到路由信息,转发消息。如果路由表中找不到相关的信息, package_server 就要把该消息转发给 route_server ,由 route_server 从汇接网关处获得路由信息后发送该消息。

   Route_server 主要处理需要转发到其他网关的消息。当 package_server 发现消息的目的地不是本地网关所连的 SP 或 SMSC ,那么它就会把消息转发给 route_server 处理。 Route_server 接到消息后与汇接网关通信,请求目的地的网关地址,然后与目的网关建立 socket 连接,交付该消息并记录前转话单。

   在整个通信模块中,所有的 server 都使用队列接口函数 mqm_init( ) 初始化消息队列并复接在队列上。收发数据使用 mqm_send( ) 和 mqm_recv( ) 函数完成。存储消息采用固定的数据结构,其结构如下:

   struct mqm_connection {

   unsigned int package_server_seqnum; // 由网关自行产生。若消息从队列 4 中来,该元素将是转化后的 CMPP 协议格式的消息序列号;若消息从队列 2 中来,该元素将是转化后的 SMPP 协议格式的消息序列号。

   short mqm_sockfd; // 接收该消息的 socket;

   short mqm_seqnum; // 收到的消息序列号;

   time_t mqm_timeout; // 收到该消息的时间;

   int total_length; // 该消息的长度;

   char mqm_buf[MAX_PACKET_SIZE]; // 该消息的内容;

   char converted_buf[MAX_PACKET_SIZE]; // 转换协议后的消息内容;

   };

   现以 MO 请求业务为例,描述通信模块的工作流程。

   当 SMSC 以 SMPP 格式的 DELIVER_SM 消息发出订阅某个 SP 的言语传情短消息,经由 smpp_server 收到,从队列 4中转发给 package_server 。 Package_server 收到 MO 请求后回送给 SP 一个 SMPP 格式的 DELIVER_SM_REP 应答消息,并用 mqm_connection 结构体存储这条 MO 消息的各个信息。 之后, package_server 就把该消息转换成 CMPP 协议的 CMPP_Deliver 消息,并通过队列 1送到 cmpp_server 中,转发给目的 SP 。 SP 在接收到这个消息后,会产生一个 CMPP 格式 的 CMPP-_Deliver_Rep 的应答消息返回给网关。当 package_server 收到了应答信号,也需要用 mqm_connection 结构体存储。这时,一条 MO 短消息转发成功, package_server 记录 SMO 话单。

   下面给出在 Linux7.2版本的操作系统下,用C语言实现的package_server的主要代码:

   main ()

   {

   mqm_init( ); // 初始化队列;

   ……

   pipe( ); // 建立管道 ;

   if (( child_pid = fork( ) ) ==0)

   {

   // 通过管道通知 2 队列有数 ;

   while(1){

   get_result_msg_info(REQUEST_2,pipfd2[1]);

   }

   }

   ……

   // 建立监听描述符集 ;

   FD_ZERO ( &monit);

   FD_SET ( )_;

   ……

   // 处理队列中来的数据

   while(1)

   {

   select ( ); // 监听 2,4,6 队列 ;

   if ( FD_ISSET(queue2,&read_monit )) // 如果 2 队列有数 ;

   {

   handle_queue2_in( );// 处理 2 队列来的数据 ;

   }

   ……

   }//end while;

   } //end main ;

   •  结束语

   短消息网关是 无线互联网短消息业务中最为关键的一个设备, 它为手机用户和互联网的信息资源架起了一座桥梁。本文中短消息网关的通信模块设计周全,结构合理,为计费、路由、超时重传等模块提供了良好的扩展性。经实验室测试,在奔 2 处理器, 64 兆内存的机器上,收发包速率为每秒 5000 条,不丢包率达到 100% ,是一个稳定的系统。

   参考文献

   [1] 短消息网关设备规范 (V1.2). 中国移动通信集团公司, 2001.

   [2] 中国移动通信短消息网关测试规范( V1.2 ) . 中国移动通信公司, 2001.

   [3] 中国移动通信信息资源站实体与互联网短消息网关接口协议( V1.3 ) . 中国移动通信集团公司, 2001.

   [4] Short Message Peer to Peer Protocol Specification v3.4 .SMPP Developers Forum , 1999.

   [5] W.Richard Stevens.UNIX 网络编程 . 施振川,周利民,孙宏晖等译 . 清华大学出版社, 1999.


本文地址 : http://www.fengfly.com/plus/view-158653-1.html
标签: 模块 网关 通信 设计 消息 实现
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: