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