一种基于IP的彩信收发模块设计

2011-03-06 09:16赵曙光
通信技术 2011年3期
关键词:彩信中继器线程

陈 亮,赵曙光,付 鹏

(东华大学 信息科学与技术学院,上海 201620)

0 引言

MMS即彩信,自中国移动于2002年10月提供该项业务以来,彩信以其丰富的媒体形式(文字、图片、声音和动画)和大容量的数据内容,极大提升了用户体验,成为备受欢迎的沟通手段。随着近几年移动通信的发展,服务提供商(SP)的积累,彩信业务种类的丰富,移动终端的支持,资费的下调,彩信业务必将得到更加广泛地推广和应用。

彩信开发主要有WAP方式和基于IP的方式两种。基于IP的方式有开发简单,数据包可靠交付等优点,成为当今彩信开发的主要方式。

1 彩信收发流程

1.1 发送流程

拨号连接 GPRS/CDMA2000 1X/3G网络(GPRS使用CMWAP接入点)后,彩信发送方通过 WSP/HTTP POST方法发送M-Send.req数据包到彩信中继器(MMS Proxy-Relay),该服务器将彩信交给彩信服务器存储(彩信中继器和各类彩信服务器合起来构成彩信消息中心 MMSC),并向发送方发送M-Send.conf回复数据包。回复数据包中包含发送请求的状态码,如果彩信中心接收到彩信,并且彩信内容完好,则该状态码置为“OK”(编码为0x80)[1]。

1.2 接收流程

接收分为延时接收和立即接收两种方式。立即接收是接收方在收到WAP PUSH通知消息后(M-Notification.ind),根据其中包含的彩信存取 URL地址,通过WSP/HTTP GET方法发送提取彩信的请求。GET方法不包含MMS数据包。彩信中继器在回复数据包M-retrieve.conf中包含彩信数据。接收方收到彩信后回复 M-NotifyResp.ind,若判断彩信提取成功,则将其中的接收状态码置为“Received”(编码为0x81)。

若是延时接收方式,接收方在收到通知后,先向彩信中继器发送 M-NotifyResp.ind,其中状态码置为“Deferred”。接收方提取时还是通过WSP/HTTP GET,在得到彩信中继器回复的M-retrieve.conf后,发送确认数据包M-AckNow Ledge.ind确认接收成功。

之后彩信中继器发送接收报告(M-delivery.ind)通知发送方[2-3]。

2 彩信实现方式

目前彩信有两种实现方式,基于WAP方式和基于IP方,分别对应图1中无线传输为WAP协议和HTTP协议[4]。

图1 WAP网络架构

2.1 WAP方式

WAP协议栈包括WTP、WSP和WDP。彩信终端和WAP网关之间使用 WAP协议,WAP网关和彩信中心之间使用HTTP协议[4]。WAP方式中WAP网关需要进行WAP协议和HTTP协议的转换,效率低,速度慢,并且采用面向非连接的UDP协议,难免发生丢包现象,导致发送成功率不高。

2.2 IP方式

彩信终端通过W-HTTP(Wireless Profiled HTTP)直接与彩信中心通信。WAP网关只是在发送WAP PUSH通知消息的时候使用。基于IP的实现方式由于采用面向连接(TCP协议)的可靠交付,发送成功率较高,并且HTTP协议相对WAP协议实现起来要简单的多,开发难度小。基于IP方式是开发彩信的首选方案。

3 HTTP Client实现方案

在 Windows平台进行网络程序开发, 可以使用不同的库常用的有:

①Winsock和ws2_32。Winsock工作于网络层和传输层的开发库,对于编写 TCP,UDP,以及原始 IP通信程序非常合适。Windows平台上的大多数程序,如QQ,讯雷等都基于其开发。ws2_32,是Winsock的升级版本;

②WinInet,Windows Internet扩展库,工作于应用协议层,提供了HTTP,ftp,gopher协议的实现,为基于以上三种协议的程序开发提供基础平台,用于开发客户端程序。基于WinInet的应用程序最著名的例子就是IE了。

相比较而言,winsock更为灵活,WinInet更为方便,却也不失灵活性。使用WinInet不需要深入了解TCP/IP协议,省去了很多工作,实现简单,而且WinInet支持缓冲机制、安全机制和WEB代理访问,性能更优。所以选用WinInet来实现。

4 彩信客户端设计

4.1 整体构架设计

如图 2所示。彩信经过编辑后通过彩信客户端(MMS Client)发送。接收方通过MMS Client接收彩信后存到数据库中,再由播放模块进行播放。在收发过程中同时在界面显示发送进度,并可手动取消收发。

MMS Client工作流程图如图3所示。由于彩信收发属于网络操作,往往占用较长时间,所以采用WinInet异步工作方式,这样节省了系统资源,使得系统不需要一直等待彩信收发结束再响应其他操作,也使得用户可以在收发期间主动终止收发,增加实用性。利用线程间通信机制,在每发送部分彩信数据后将相关信息上报给主线程,实现了进度上报。采用多线程方式,每个线程创建一个MMS Client类对象,分别存储每条彩信的相关信息,以支持彩信并发功能。

图2 HTTP Client在整个架构中的位置

图3 HTTP Client流程

4.2 发送流程设计

WinInet异步API调用流程如下:

①CreateThread,创建子线程,注册线程号;

②InternetOpen,初始化WinInet.dll,需指定是异步;

③InternetSetStatusCallback,设置回调,用于处理HTTP事件;

④InternetConnect,建立Internet连接;

⑤HTTPOpenRequest,打开一个HTTP请求的句柄;

⑥HTTPSendRequertEx,向HTTP服务器发送指定的请求,等待发送请求结束;

⑦InternetWriteFile,将彩信数据写到一个打开的Internet文件,等待请求完成或超时,并向上层线程报告发送进度;

⑧重复⑦直至彩信数据包发送结束;

⑨HTTPEndRequest,结束一个HTTP请求,等待响应接收完毕;

⑩HTTPQueryInfo,查询所需项,例如 STATUS_CODE和CONTENT_LENGTH;

需要注意的是,HTTPSendRequertEx发送的HTTP头需符合rfc2616协议规范;InternetWriteFile发送的彩信数据包需符合OMA MMS V1_2协议规范。否则这些API调用将出错或得不到彩信中心的HTTP 200 OK响应。当然仅仅得到HTTP 200 OK[5]头还不够,还要看数据包是否包含M-Send.conf规定的MMS头[6]。

4.3 接收流程设计

接收流程与发送基本相似,只是 InternetOpen、InternetConnect 、HTTPOpenRequest几个函数的参数设置不同,比如发送中HTTPOpenRequest使用“POST”参数,而接收中使用“GET”。接收流程不需步骤⑦、步骤⑧。

4.4 网络影响

在网络信号较差,不稳定的情况下,比如在地铁上,彩信发送成功率会降低。尽管基于IP方式采用可靠地数据交付,但网络很差时往往引起请求超时,导致发送失败。为提高发送成功率,可将建立连接的请求重复发送,以确保能建立起连接(该处是 WinInet API的一个漏洞,无法利用 Internet SetOption设置超时时间[7])。在建立连接之后,InternetWrite File发数据时即使超时也不会引起网络重置,只是需要将此次发送失败的数据重新发送。彩信就可以拥有充足的时间来发送,网络好的时候能继续发送数据,网络差的时候相当于在等待了。这种机制使得在网络较差时发送成功率也会提高。

5 结语

为了增加用户体验,无线数据卡一般除了提供上网功能外,还提供了短信和电话功能,使得无线数据卡相当于一个简易的 PC上的手机。这里设计的彩信功能,同样将手机中的彩信功能在数据卡中实现,大大丰富了数据卡的附加值。而且,PC上的多媒体资源也更加丰富,同时克服了各手机厂商对彩信媒体格式支持不同的缺点,提高了彩信的播放质量。由于使用IP方式实现,也省去了WAP网关对HTTP/TCP和 WSP/WSP/WDP的转换,提高了彩信收发速度[8]。利用这里设计的模块也很容易扩展电子邮件功能。

[1] 江亮亮,李洋洋.基于PC的彩信收发管理系统的设计[J].黑龙江科技信息,2008,4(11):4.

[2] GWENAËL LE BODIC.Mulitimedia Messaging Service[M].USA:John Wiley & Sons,2003:53-110

[3] STEVEN.OMA-ERP-MMS-V1_2-25-429-A[EB/OL].(2005-03-01)[2010-01-09].http://www.openmobile alliance.org/Technical/ release_program/mms_v1_2.aspx.

[4] ROYEWO.technical_WAP2_0-20021106 [EB/OL].(2002-11-06)[2010-01-09].http://www.openmobilealliance.org/Technical/W APindex.aspx#WAP20.

[5] BERNER.HypertextTransferProtocol--HTTP/1.1 [EB/OL](1999-06)[2010-01-12].http://datatracker.ietf.org/doc/rfc2616/ .

[6] 黄战华,魏凯.基于 GPRS和 Socket机制实现多媒体消息传输的研究[J].通信技术,2007,40(11):376-378.

[7] Mircosoft.About WinInet [EB/OL] (2009-12-01)[2010-01-12].http://msdn.microsoft.com/en-us/library/aa385331(v=VS.85).aspx

[8] 王欣,毕红军.MMS的三种DRM方式及应用[J].通信技术,2005(增刊):159-160.

猜你喜欢
彩信中继器线程
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
我国科学家率先实现全光量子中继
彩信的巅峰与陨落
浅谈linux多线程协作
基于光伏发电的物联网中继器的设计
对利用轨间交叉环线进行列车定位的几点思考
山东省气象彩信平台本地化设计与实现
江苏 大学生有了创业新平台
Java的多线程技术探讨