陳 亮,趙曙光,付 鵬
(東華大學 信息科學與技術學院,上海 201620)
MMS即彩信,自中國移動于2002年10月提供該項業務以來,彩信以其豐富的媒體形式(文字、圖片、聲音和動畫)和大容量的數據內容,極大提升了用戶體驗,成為備受歡迎的溝通手段。隨著近幾年移動通信的發展,服務提供商(SP)的積累,彩信業務種類的豐富,移動終端的支持,資費的下調,彩信業務必將得到更加廣泛地推廣和應用。
彩信開發主要有WAP方式和基于IP的方式兩種。基于IP的方式有開發簡單,數據包可靠交付等優點,成為當今彩信開發的主要方式。
撥號連接 GPRS/CDMA2000 1X/3G網絡(GPRS使用CMWAP接入點)后,彩信發送方通過 WSP/HTTP POST方法發送M-Send.req數據包到彩信中繼器(MMS Proxy-Relay),該服務器將彩信交給彩信服務器存儲(彩信中繼器和各類彩信服務器合起來構成彩信消息中心 MMSC),并向發送方發送M-Send.conf回復數據包。回復數據包中包含發送請求的狀態碼,如果彩信中心接收到彩信,并且彩信內容完好,則該狀態碼置為“OK”(編碼為0x80)[1]。
接收分為延時接收和立即接收兩種方式。立即接收是接收方在收到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]。
目前彩信有兩種實現方式,基于WAP方式和基于IP方,分別對應圖1中無線傳輸為WAP協議和HTTP協議[4]。

圖1 WAP網絡架構
WAP協議棧包括WTP、WSP和WDP。彩信終端和WAP網關之間使用 WAP協議,WAP網關和彩信中心之間使用HTTP協議[4]。WAP方式中WAP網關需要進行WAP協議和HTTP協議的轉換,效率低,速度慢,并且采用面向非連接的UDP協議,難免發生丟包現象,導致發送成功率不高。
彩信終端通過W-HTTP(Wireless Profiled HTTP)直接與彩信中心通信。WAP網關只是在發送WAP PUSH通知消息的時候使用。基于IP的實現方式由于采用面向連接(TCP協議)的可靠交付,發送成功率較高,并且HTTP協議相對WAP協議實現起來要簡單的多,開發難度小。基于IP方式是開發彩信的首選方案。
在 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來實現。
如圖 2所示。彩信經過編輯后通過彩信客戶端(MMS Client)發送。接收方通過MMS Client接收彩信后存到數據庫中,再由播放模塊進行播放。在收發過程中同時在界面顯示發送進度,并可手動取消收發。
MMS Client工作流程圖如圖3所示。由于彩信收發屬于網絡操作,往往占用較長時間,所以采用WinInet異步工作方式,這樣節省了系統資源,使得系統不需要一直等待彩信收發結束再響應其他操作,也使得用戶可以在收發期間主動終止收發,增加實用性。利用線程間通信機制,在每發送部分彩信數據后將相關信息上報給主線程,實現了進度上報。采用多線程方式,每個線程創建一個MMS Client類對象,分別存儲每條彩信的相關信息,以支持彩信并發功能。

圖2 HTTP Client在整個架構中的位置

圖3 HTTP Client流程
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]。
接收流程與發送基本相似,只是 InternetOpen、InternetConnect 、HTTPOpenRequest幾個函數的參數設置不同,比如發送中HTTPOpenRequest使用“POST”參數,而接收中使用“GET”。接收流程不需步驟⑦、步驟⑧。
在網絡信號較差,不穩定的情況下,比如在地鐵上,彩信發送成功率會降低。盡管基于IP方式采用可靠地數據交付,但網絡很差時往往引起請求超時,導致發送失敗。為提高發送成功率,可將建立連接的請求重復發送,以確保能建立起連接(該處是 WinInet API的一個漏洞,無法利用 Internet SetOption設置超時時間[7])。在建立連接之后,InternetWrite File發數據時即使超時也不會引起網絡重置,只是需要將此次發送失敗的數據重新發送。彩信就可以擁有充足的時間來發送,網絡好的時候能繼續發送數據,網絡差的時候相當于在等待了。這種機制使得在網絡較差時發送成功率也會提高。
為了增加用戶體驗,無線數據卡一般除了提供上網功能外,還提供了短信和電話功能,使得無線數據卡相當于一個簡易的 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.