原帖:http://developer.sonyericsson.com/community/docs/DOC-3339
彩信(MMS)和WAP瀏覽器是WAP協議的兩大主要應用。WAP協議有點複雜,也算是SmartPhone中的 核心技術之一吧,它包括WDP/WTP/WSP這一套傳輸協議,也包括WML/和SMIL這樣的內容表示協議。去年花了一點時間去研究它,後來該任務取消 了,所以沒有搞得太透徹。今年要真正使用了,現在繼續研究,主要側重於它的實現。這裏記錄一些研究筆記,本文是關於彩信的。
彩信的架構 。彩信和其它WAP 應用的架構差不多,都要經過WAP Gateway中轉。要注意的是彩信並非直接投遞給接收方,而是像郵件一樣,先發送給一箇中間服務器MMS Proxy-Relay。MMS Proxy-Relay暫時保存彩信,然後通過push協議給彩信接收方發送一個通知,彩信接收方收到通知後從MMS Proxy-Relay上獲取彩信內容。MMS Client和WAP Gateway之間用WAP傳輸協議傳輸,而WAP Gateway和MMS Proxy-Relay之間走傳統的TCP/IP協議。
彩信的交互過程 。對彩信客戶端實現者來說,我們主要關心:彩信發送方與MMS Proxy-Relay之間的交互和彩信接收方和MMS Proxy-Relay之間的交互,這包括下列幾個過程。
l 發送過程。這是彩信發送方把彩信發送給MMS Proxy-Relay的過程,MMS Proxy-Relay在收到彩信後會給發送方一個確認消息。
l 通知過程。爲了把彩信投遞給接收方,MMS Proxy-Relay要通過PUSH協議給接收方發送一條彩信通知消息,這個消息通常是一條特殊短信,裏面包含彩信的位置URL。
l 彩信接收。接收方收到彩信通知後,從中取出URL,然後通過標準的HTTP GET請求從MMS Proxy-Relay上獲取彩信。
l 彩信回執。當MMS Proxy-Relay成功的通知彩信接收方後,它會給彩信發送方發送一個消息表明彩信投遞成功。
l 彩信閱讀回執。彩信閱讀回執是一條新彩信,它的傳遞過程和普通彩信沒有什麼差別,只是不能再有閱讀回執。
彩信的PDU 。PDU 即協議數據單元,對應前面每種消息的消息格式。彩信的PDU和HTTP協議極爲類似,當然相對來說要簡單多了。它定義了一些常用的消息域,有的消息域是公 有的,每種消息都可以使用,有的消息域是專用的,只有特定的消息才能使用。除了常用的消息域外,也可以自定義消息域,自定義消息域以X-打頭,但不能以 X-Mms-打頭。常用的消息域如:
l X-Mms-Message-Type
l X-Mms-Transaction-ID
l X-Mms-MMS-Version
l Date
l From
l To
l Cc
l Bcc
l Subject
l X-Mms-Message-Class
l X-Mms-Expiry
l X-Mms-Delivery-Time
l X-Mms-Priority
l X-Mms-Sender-
l Visibility
l X-Mms-Delivery-Report
l X-Mms-Read-Reply
l Content-Type
PDU的類型有:
l 發送請求。m-send-req
l 發送確認。m-send-conf
l 彩信通知。m-notification-ind
l 通知迴應。m-notifyresp-ind
l 獲取彩信迴應。m-retrieve-conf
l 接收確認。m-acknowledge-ind
l 彩信回執。m-delivery-ind
獲取彩信只是一個普通的HTTP GET請求,而沒有專門的PDU。
彩信的PDU編碼 。彩信PDU在語義上與HTTP協議類似,但是其編碼方式並不一樣,爲了充分利用帶寬,彩信PDU採用二進制方式編碼。其編碼規則很簡單,預定義的消息域的KEY都有唯一的單字節編碼,如:
Key |
編碼 |
Bcc |
0x01 |
Cc |
0x02 |
Content-Location |
0x03 |
Content-Type |
0x04 |
Date |
0x05 |
Delivery-Report |
0x06 |
Delivery-Time |
0x07 |
Expiry |
0x08 |
From |
0x09 |
Message-Class |
0x0A |
Message-ID |
0x0B |
Message-Type |
0x0C |
MMS-Version |
0x0D |
Message-Size |
0x0E |
Priority |
0x0F |
Read-Reply |
0x10 |
Report-Allowed |
0x11 |
Response-Status |
0x12 |
Response-Text |
0x13 |
Sender-Visibility |
0x14 |
Status |
0x15 |
Subject |
0x16 |
To |
0x17 |
Transaction-Id |
0x18 |
|
|
而消息域的Value部分,如果只有幾個固定的可選值,這幾個值也用單子節的編碼,由於這些值只出現在特定的上下文中,所以無需要全局唯一。