陳 亮,趙曙光,付 鵬
(東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院,上海 201620)
MMS即彩信,自中國(guó)移動(dòng)于2002年10月提供該項(xiàng)業(yè)務(wù)以來(lái),彩信以其豐富的媒體形式(文字、圖片、聲音和動(dòng)畫(huà))和大容量的數(shù)據(jù)內(nèi)容,極大提升了用戶體驗(yàn),成為備受歡迎的溝通手段。隨著近幾年移動(dòng)通信的發(fā)展,服務(wù)提供商(SP)的積累,彩信業(yè)務(wù)種類(lèi)的豐富,移動(dòng)終端的支持,資費(fèi)的下調(diào),彩信業(yè)務(wù)必將得到更加廣泛地推廣和應(yīng)用。
彩信開(kāi)發(fā)主要有WAP方式和基于IP的方式兩種。基于IP的方式有開(kāi)發(fā)簡(jiǎn)單,數(shù)據(jù)包可靠交付等優(yōu)點(diǎn),成為當(dāng)今彩信開(kāi)發(fā)的主要方式。
撥號(hào)連接 GPRS/CDMA2000 1X/3G網(wǎng)絡(luò)(GPRS使用CMWAP接入點(diǎn))后,彩信發(fā)送方通過(guò) WSP/HTTP POST方法發(fā)送M-Send.req數(shù)據(jù)包到彩信中繼器(MMS Proxy-Relay),該服務(wù)器將彩信交給彩信服務(wù)器存儲(chǔ)(彩信中繼器和各類(lèi)彩信服務(wù)器合起來(lái)構(gòu)成彩信消息中心 MMSC),并向發(fā)送方發(fā)送M-Send.conf回復(fù)數(shù)據(jù)包?;貜?fù)數(shù)據(jù)包中包含發(fā)送請(qǐng)求的狀態(tài)碼,如果彩信中心接收到彩信,并且彩信內(nèi)容完好,則該狀態(tài)碼置為“OK”(編碼為0x80)[1]。
接收分為延時(shí)接收和立即接收兩種方式。立即接收是接收方在收到WAP PUSH通知消息后(M-Notification.ind),根據(jù)其中包含的彩信存取 URL地址,通過(guò)WSP/HTTP GET方法發(fā)送提取彩信的請(qǐng)求。GET方法不包含MMS數(shù)據(jù)包。彩信中繼器在回復(fù)數(shù)據(jù)包M-retrieve.conf中包含彩信數(shù)據(jù)。接收方收到彩信后回復(fù) M-NotifyResp.ind,若判斷彩信提取成功,則將其中的接收狀態(tài)碼置為“Received”(編碼為0x81)。
若是延時(shí)接收方式,接收方在收到通知后,先向彩信中繼器發(fā)送 M-NotifyResp.ind,其中狀態(tài)碼置為“Deferred”。接收方提取時(shí)還是通過(guò)WSP/HTTP GET,在得到彩信中繼器回復(fù)的M-retrieve.conf后,發(fā)送確認(rèn)數(shù)據(jù)包M-AckNow Ledge.ind確認(rèn)接收成功。
之后彩信中繼器發(fā)送接收?qǐng)?bào)告(M-delivery.ind)通知發(fā)送方[2-3]。
目前彩信有兩種實(shí)現(xiàn)方式,基于WAP方式和基于IP方,分別對(duì)應(yīng)圖1中無(wú)線傳輸為WAP協(xié)議和HTTP協(xié)議[4]。
圖1 WAP網(wǎng)絡(luò)架構(gòu)
WAP協(xié)議棧包括WTP、WSP和WDP。彩信終端和WAP網(wǎng)關(guān)之間使用 WAP協(xié)議,WAP網(wǎng)關(guān)和彩信中心之間使用HTTP協(xié)議[4]。WAP方式中WAP網(wǎng)關(guān)需要進(jìn)行WAP協(xié)議和HTTP協(xié)議的轉(zhuǎn)換,效率低,速度慢,并且采用面向非連接的UDP協(xié)議,難免發(fā)生丟包現(xiàn)象,導(dǎo)致發(fā)送成功率不高。
彩信終端通過(guò)W-HTTP(Wireless Profiled HTTP)直接與彩信中心通信。WAP網(wǎng)關(guān)只是在發(fā)送WAP PUSH通知消息的時(shí)候使用。基于IP的實(shí)現(xiàn)方式由于采用面向連接(TCP協(xié)議)的可靠交付,發(fā)送成功率較高,并且HTTP協(xié)議相對(duì)WAP協(xié)議實(shí)現(xiàn)起來(lái)要簡(jiǎn)單的多,開(kāi)發(fā)難度小?;贗P方式是開(kāi)發(fā)彩信的首選方案。
在 Windows平臺(tái)進(jìn)行網(wǎng)絡(luò)程序開(kāi)發(fā), 可以使用不同的庫(kù)常用的有:
①Winsock和ws2_32。Winsock工作于網(wǎng)絡(luò)層和傳輸層的開(kāi)發(fā)庫(kù),對(duì)于編寫(xiě) TCP,UDP,以及原始 IP通信程序非常合適。Windows平臺(tái)上的大多數(shù)程序,如QQ,訊雷等都基于其開(kāi)發(fā)。ws2_32,是Winsock的升級(jí)版本;
②WinInet,Windows Internet擴(kuò)展庫(kù),工作于應(yīng)用協(xié)議層,提供了HTTP,ftp,gopher協(xié)議的實(shí)現(xiàn),為基于以上三種協(xié)議的程序開(kāi)發(fā)提供基礎(chǔ)平臺(tái),用于開(kāi)發(fā)客戶端程序?;赪inInet的應(yīng)用程序最著名的例子就是IE了。
相比較而言,winsock更為靈活,WinInet更為方便,卻也不失靈活性。使用WinInet不需要深入了解TCP/IP協(xié)議,省去了很多工作,實(shí)現(xiàn)簡(jiǎn)單,而且WinInet支持緩沖機(jī)制、安全機(jī)制和WEB代理訪問(wèn),性能更優(yōu)。所以選用WinInet來(lái)實(shí)現(xiàn)。
如圖 2所示。彩信經(jīng)過(guò)編輯后通過(guò)彩信客戶端(MMS Client)發(fā)送。接收方通過(guò)MMS Client接收彩信后存到數(shù)據(jù)庫(kù)中,再由播放模塊進(jìn)行播放。在收發(fā)過(guò)程中同時(shí)在界面顯示發(fā)送進(jìn)度,并可手動(dòng)取消收發(fā)。
MMS Client工作流程圖如圖3所示。由于彩信收發(fā)屬于網(wǎng)絡(luò)操作,往往占用較長(zhǎng)時(shí)間,所以采用WinInet異步工作方式,這樣節(jié)省了系統(tǒng)資源,使得系統(tǒng)不需要一直等待彩信收發(fā)結(jié)束再響應(yīng)其他操作,也使得用戶可以在收發(fā)期間主動(dòng)終止收發(fā),增加實(shí)用性。利用線程間通信機(jī)制,在每發(fā)送部分彩信數(shù)據(jù)后將相關(guān)信息上報(bào)給主線程,實(shí)現(xiàn)了進(jìn)度上報(bào)。采用多線程方式,每個(gè)線程創(chuàng)建一個(gè)MMS Client類(lèi)對(duì)象,分別存儲(chǔ)每條彩信的相關(guān)信息,以支持彩信并發(fā)功能。
圖2 HTTP Client在整個(gè)架構(gòu)中的位置
圖3 HTTP Client流程
WinInet異步API調(diào)用流程如下:
①CreateThread,創(chuàng)建子線程,注冊(cè)線程號(hào);
②InternetOpen,初始化WinInet.dll,需指定是異步;
③InternetSetStatusCallback,設(shè)置回調(diào),用于處理HTTP事件;
④InternetConnect,建立Internet連接;
⑤HTTPOpenRequest,打開(kāi)一個(gè)HTTP請(qǐng)求的句柄;
⑥HTTPSendRequertEx,向HTTP服務(wù)器發(fā)送指定的請(qǐng)求,等待發(fā)送請(qǐng)求結(jié)束;
⑦InternetWriteFile,將彩信數(shù)據(jù)寫(xiě)到一個(gè)打開(kāi)的Internet文件,等待請(qǐng)求完成或超時(shí),并向上層線程報(bào)告發(fā)送進(jìn)度;
⑧重復(fù)⑦直至彩信數(shù)據(jù)包發(fā)送結(jié)束;
⑨HTTPEndRequest,結(jié)束一個(gè)HTTP請(qǐng)求,等待響應(yīng)接收完畢;
⑩HTTPQueryInfo,查詢所需項(xiàng),例如 STATUS_CODE和CONTENT_LENGTH;
需要注意的是,HTTPSendRequertEx發(fā)送的HTTP頭需符合rfc2616協(xié)議規(guī)范;InternetWriteFile發(fā)送的彩信數(shù)據(jù)包需符合OMA MMS V1_2協(xié)議規(guī)范。否則這些API調(diào)用將出錯(cuò)或得不到彩信中心的HTTP 200 OK響應(yīng)。當(dāng)然僅僅得到HTTP 200 OK[5]頭還不夠,還要看數(shù)據(jù)包是否包含M-Send.conf規(guī)定的MMS頭[6]。
接收流程與發(fā)送基本相似,只是 InternetOpen、InternetConnect 、HTTPOpenRequest幾個(gè)函數(shù)的參數(shù)設(shè)置不同,比如發(fā)送中HTTPOpenRequest使用“POST”參數(shù),而接收中使用“GET”。接收流程不需步驟⑦、步驟⑧。
在網(wǎng)絡(luò)信號(hào)較差,不穩(wěn)定的情況下,比如在地鐵上,彩信發(fā)送成功率會(huì)降低。盡管基于IP方式采用可靠地?cái)?shù)據(jù)交付,但網(wǎng)絡(luò)很差時(shí)往往引起請(qǐng)求超時(shí),導(dǎo)致發(fā)送失敗。為提高發(fā)送成功率,可將建立連接的請(qǐng)求重復(fù)發(fā)送,以確保能建立起連接(該處是 WinInet API的一個(gè)漏洞,無(wú)法利用 Internet SetOption設(shè)置超時(shí)時(shí)間[7])。在建立連接之后,InternetWrite File發(fā)數(shù)據(jù)時(shí)即使超時(shí)也不會(huì)引起網(wǎng)絡(luò)重置,只是需要將此次發(fā)送失敗的數(shù)據(jù)重新發(fā)送。彩信就可以擁有充足的時(shí)間來(lái)發(fā)送,網(wǎng)絡(luò)好的時(shí)候能繼續(xù)發(fā)送數(shù)據(jù),網(wǎng)絡(luò)差的時(shí)候相當(dāng)于在等待了。這種機(jī)制使得在網(wǎng)絡(luò)較差時(shí)發(fā)送成功率也會(huì)提高。
為了增加用戶體驗(yàn),無(wú)線數(shù)據(jù)卡一般除了提供上網(wǎng)功能外,還提供了短信和電話功能,使得無(wú)線數(shù)據(jù)卡相當(dāng)于一個(gè)簡(jiǎn)易的 PC上的手機(jī)。這里設(shè)計(jì)的彩信功能,同樣將手機(jī)中的彩信功能在數(shù)據(jù)卡中實(shí)現(xiàn),大大豐富了數(shù)據(jù)卡的附加值。而且,PC上的多媒體資源也更加豐富,同時(shí)克服了各手機(jī)廠商對(duì)彩信媒體格式支持不同的缺點(diǎn),提高了彩信的播放質(zhì)量。由于使用IP方式實(shí)現(xiàn),也省去了WAP網(wǎng)關(guān)對(duì)HTTP/TCP和 WSP/WSP/WDP的轉(zhuǎn)換,提高了彩信收發(fā)速度[8]。利用這里設(shè)計(jì)的模塊也很容易擴(kuò)展電子郵件功能。
[1] 江亮亮,李洋洋.基于PC的彩信收發(fā)管理系統(tǒng)的設(shè)計(jì)[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] 黃戰(zhàn)華,魏凱.基于 GPRS和 Socket機(jī)制實(shí)現(xiàn)多媒體消息傳輸?shù)难芯縖J].通信技術(shù),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方式及應(yīng)用[J].通信技術(shù),2005(增刊):159-160.