摘 要: 研究了彩信的发送过程,提出了一种基于TCP/IP的彩信发送方法。进而比较了彩信的两种发送方式和数据传输过程中协议的转换。并且在BenQM23上实现了基于TCP/IP的彩信发送方法,该方法无需额外实现WAP协议的WSP/WTP层封装,可以直接使用GSM模块自带的TCP/IP协议,大大降低了嵌入式终端上彩信发送的开发难度。
关键词: 彩信发送;WAP网关;彩信服务中心;GSM模块;TCP/IP
随着计算机和无线通讯领域相关技术的飞速发展,各种多媒体应用逐渐地由有线领域跨向无线领域。通过无线技术实现多媒体数据的传输已成为焦点。彩信作为一种多媒体数据的无线传输方式,也越来越广泛地得到应用。如何在嵌入式终端设备实现彩信的高效、方便的发送是一个非常有实用意义的研究。
彩信的发送主要有WAP和TCP/IP两种方式。但市场上现有的大部分GSM模块只支持TCP/IP协议栈,而没有WAP方式的彩信协议栈。若要实现WAP发送需要自己实现彩信协议,需要相当大的工作量。因此基于TCP/IP的彩信发送方式将成为今后彩信发送的主要方式。本文提出一种基于GSM模块所携带的TCP/IP协议栈实现彩信的发送。
1 MMS的发送过程
彩信从发送方到MMSC(彩信服务中心)需要经过WAP网关。MMS在发送方和WAP网关之间通过无线协议传输,在WAP网关和MMSC之间使用HTTP协议传输。其传输路径如图1所示。
(1)彩信发送方将欲发送的信息编辑成一个M-Send.req数据包,并根据现存的MMSC信息建立一个WAP连接,然后将 M-Send.req数据包通过无线传输协议(WAP或TCP/IP协议)编码后传送到WAP网关。WAP网关以HTTP方式将收到的内容传给彩信中继器MMS Proxy-Relay,彩信中继器再传至彩信服务器(彩信中继器和彩信服务器统称MMSC)。
(2)MMSC收到信息后,将信息内容转为MIME格式后存储,并进行数据分析,从而得到发送方信息,同时通过WAP连接向发送方返回一个M-Send.conf的确认包。确认包中含有状态码,如果收到的彩信格式正确,该状态码为OK。至此整个发送过程结束[1-2]。
2 WAP发送方式和TCP/IP发送方式的比较
WAP发送方式和TCP/IP发送方式的最大区别在于从发送方到WAP网关传输过程中所用到的通信协议不同,而从WAP网关到MMSC的传输方式都基于TCP/IP协议进行Internet的HTTP请求。
WAP发送方式在发送方和WAP网关之间使用WAP1.x协议。该协议在发送彩信时,需要对彩信包进行WDP、WTP和WSP层的封装。因此,若在普通的GSM模块上进行彩信发送,需要自己编程实现这三层的封装。WAP网关在收到彩信数据包,要进行WAP协议到HTTP协议的转化之后才能传输给彩信服务中心[3]。其协议转换过程如图2所示。
TCP/IP的发送方式如图3所示。这种方法基于WAP2.0协议栈。WAP2.0采用最新的Internet标准和协议,支持TCP/IP传送协议移动简本,并且能与目前Internet上运行的通用TCP互操作。因此,彩信发送可以直接使用GSM模块上自带的TCP/IP协议栈,而不必额外实现WAP协议,这大大减少了工作量和开发难度。并且发送方和WAP网关是采用TCP协议、面向连接的可靠性传输方式,具有较高的成功率。WAP网关接收到彩信数据包之后,无需进行WAP协议到HTTP协议上的转换,提高了发送效率。
3 基于TCP/IP协议彩信发送方法的实现
基于上述原理,本文提出了一种方法直接使用GSM模块上携带的TCP/IP协议实现彩信发送。具体实现方式是在开发板上通过串口向GSM模块发送AT指令,设置GSM模块,使其连接到WAP网关并获得临时分配的IP地址。连接成功后,开发板向串口发送添加过HTTP Header的彩信数据包。之后,GSM模块调用自带的TCP/IP协议栈向WAP网关发送彩信包。以常用的BenQM23模块发送移动彩信为例进行说明。
3.1 GSM模块连接GPRS网络
BenQM23模块与WAP网关连接需要如下AT指令:
(1)AT$NOSLEEP=1
防止串口进入休眠状态,利用TCP/IP数据连接前应使串口保持常开状态,以免数据丢失。
(2)AT+CGDCONT=1,"IP","CMWAP"
该指令用于设置GPRS接入网关。其PDP类型为IP,接入网关为CMWAP,表示中国移动网域接入点。如果是联通,接入点设为UNIWAP。
(3)AT%CGPCO=1,″PAP,,″,1
设置PAP验证,默认的用户名和密码为空。
(4)AT$DESTINFO=″10.0.0.172″,1,80,0
第1个参数为所连接网关的IP地址;第2个参数表示使用TCP协议;80为连接端口号。
(5)ATD*97#
ATD指令拨号连接,其连接的目的主机和连接方式为第4条指令所设置。
OK
CONNECT
OK
若串口返回上面的提示信息,表明连接成功,GSM模块获得临时IP地址。之后就可以向串口写入封装好的彩信信息,若彩信数据包成功写入GSM模块,BENQ23将返回OK提示信息。BENQ23G模块AT指令的详细说明见参考文献[4]。
3.2 构建彩信数据包
彩信数据包MMS PDU由MMS Header和MMS Body构成。
MMS Header根据WAP-209协议和RFC2378的规定,由一系列的域名和域值组成,这些域定义了PDU各种属性,包括类型、版本号、接收方、发送方、主题、发送时间等。这些域分为可选项和必选项,根据MMS PDU的类型不同而不同。此处只实现彩信的发送,即M-Send.req类型PDU。图4为一简单的M-Send.req类型PDU的Header解码后的结构图。
MMS Body采用MIME协议封装,包含多个多媒体信息,每个多媒体信息都包含Header和Entries两部分。根据MMS Header中Content-Type的指示, MMS Body的组装分为application/vnd.wap.multipart.mixed和application/vnd.wap.multipart.related两种方式。相对来讲,related组装方式会更复杂点,就以related方式为例。对于一个有图像和文本related类型的MMS,典型的消息格式如图5所示。
Heardlen与Datalen分别指明该部分数据的头部长度和数据部分长度。Content-Type表示该段多媒体数据对应的消息体的内容类型。Content-ID为该部分内容的标识,并且必须是唯一的。Content-Location类似于HTML中的URL,一个消息部分可以通过相对URL指向另外一个消息部分。例如:<img src=“image1.jpg”>,其中image1.jpg为另一个消息部分的Content-Location所对应的值[5]。接下来的Data即为该段多媒体信息的数据。
3.3 彩信数据包添加HTTP Header
构建好的彩信数据包需要添加HTTP Header之后,才能通过TCP/IP协议以POST方式发送到WAP网关。WAP网关接收到彩信包之后,根据HTTP Header的请求,将彩信包发送到MMSC。所添加HTTP Header的实现代码如下:
POST http://mmsc.monternet.com/HTTP/1.1
Host:10.0.0.172.80
X-Online-Host:mmsc.monternet.com
Cache-Control:no-cache
Connection:Keep-Alive
Accept-Encoding:deflate,gzip
User-Agent: SAMSUNG-SGH-E908/NetFront3.2/WAP2.0 Profile/MIDP-2.0 Configuration/CLDC-1.1
Accept:application/vnd.wap.mms-message,image/vnd.wap.
wbmp,image/png,image/jpeg,image/gif,text/x-iMelody,text/
ximelody,application/x-midi,audio/midi,audio/mid,audio/x-mid,
image/bmp,audio/mp3,audio/x-midi,audio/amr,application/
vnd.smaf,application/vnd.wap.mms-message x-wap-profile:
http://wap.samsungmobile.com/uaprof/e908_10.xml
Content-Length:35294
Content-Type:application/vnd.wap.mms-message
POST指明彩信所要提交的彩信中心地址,移动的为“mmsc.monternet.com”,如果发送联通的彩信,地址是“mmsc.myuni.com.cn”;Host和X-Online-Host是所要连接的服务器IP地址和域名;Cache-Control用于控制HTTP缓存,no-cache表示请求或响应消息不能缓存;Keep-Alive使客户端到服务器端的连接持续有效;Accept-Encoding字段声明发送方支持的编码类型;User-Agent标识发送方的一些信息;Accept字段确定客户端可以接收的媒体类型;Content-Length表示彩信数据包的长度,以字节为单位;Content-Type表示后面的彩信数据包属于哪一种MIME类型。
上述HTTP Header的构建,除了Content-Length需要根据彩信包实际长度修改外,其余部分在发送一般格式的彩信时,均可以保持不变。
将Http_Header和MMS_PDU构建成一个数据包,就可以通过串口向GSM模块发送了。
3.4 构建数据包的数据结构
程序中所封装彩信包的数据结构定义如下:
struct Packet
{
unsigned int length; //data的数据长度
unsigned char *data; //该层数据包
struct Packet *SubPaket;//下一层数据包
}
在Packet结构中,data存储本层协议所包含的数据包头部,length表示本层协议数据包头部的长度,SubPacket指向下一层数据包结构。例如,在给彩信添加HTTP头部时,data指向HTTP Header,SubPacket指向下一层的彩信数据包。这样在数据传输时可以直接从链表头发送到链表尾部。
3.5 发送结果
发送完成之后,等待WAP网关的响应。如果返回结果为HTTP 200 OK,说明得到彩信中心的响应。若返回其他状态码说明发送失败,具体原因可以查看RFC 2616 协议规定。当然,仅仅只是HTTP的返回码正确,还不能确定是否发送成功,还需查看所返回的数据包中M-Send.conf头部的Response-Status位。若Response-Satus位为128,则说明彩信发送成功,若返回其他的状态码详见参考文献[6]。
基于TCP/IP协议的彩信发送方法为利用现有的GPRS平台下的彩信发送提供了一条简单可行的途径,大大减少了开发者的工作量和复杂度,也省去了WAP网关对WAP协议和TCP/IP协议的转换,提高了发送速度。同时,只要GSM模块带有TCP/IP协议栈,就可以直接利用该方法发送彩信,无须实现额外的彩信发送协议。
参考文献
[1] ROYEWO.Technical_WAP2_0_20021106[EB/OL].(2002-11-06)[2011-09-23].http://www.openmobilealliance.org/Technical/WAPindex.aspx#WAP20.
[2] 于捷,王祖林,刘有才.BENQ23G的彩信发送及编码格式分析[J].单片机与嵌入式系统应用,2009(2):44-47.
[3] 陈亮,赵曙光,付鹏.一种基于IP的彩信收发模块设计[J].通信技术,2011,44(3):45-47.
[4] WANG J CW.BenQ Inc M23 AT command user guide(Version:1.75)[R].2005.
[5] 张会勇.MMS的消息格式和压缩编码分析[J].中国数据通信,2004,6(6):90-92.
[6] Wireless Application Protocol Forum Ltd.Wireless application protocol MMS encapsulation protocol(Version 05-jan-2002)[EB/OL].[2011-9-11].http://www.openmobilealliance.org/tech/affiliates/LicenseAgreement.asp?DocName=/wap/wap-209-mmsencapsulation-20020105-a.pdf.