本文記錄了彩信的發送流程的一些細節及其所需要使用到的參考規范。
(1) 彩信的發送流程
1)首先,當彩信中心需要向手機發送彩信時,會將彩信內容保存到自己的存儲器中,并且準備一個URI,通過這個URI,手機能夠讀取到存儲器中的彩信的內容;
2)彩信中心會向手機發起一個m-notification-ind指示消息;
3)手機收到這個指示消息后,便會向根據m-notification-ind指示消息中的URI(在Content-Location參數中指示),向彩信發服務器發起一個HTTP GET(或WSP GET,從跟蹤到的消息來看,就是HTTP GET的格式)請求,來獲取彩信的內容;
4)彩信服務器會應答HTTP/WSP GET請求,返回內容,內容的格式是:application/vnd.wap.mms-message,X-Mms-Message-Type頭域的值是m-retrieve-conf,以通知手機,這是彩信的內容。
(2) 消息的封裝與規范
涉及到的規范可能有:
· 3GPP TS 23.140 Multimedia Messaging Service (MMS) --這個規范定義了收發彩信的流程,但對具體的消息格式則沒有定義;
· 3GPP TS 23.040 Technical realization of the Short Message Service (SMS) --這個規范定義了短消息協議的詳細的編碼格式。
· WAP Wireless Session Protocol Specification (WAP-230-WSP-20010705-a, Approved Version 5 July 2001)
· WAP Wireless Datagram Protocol (WAP-259-WDP-20010614-a, Version 14-Jun-2001) (--這個文檔還介紹了WDP協議是如何封裝在各消息中傳輸的,包括:GSM SMS, CDMA SMS,ANSI-136等)
· WAP MMS Encapsulation Protocol (WAP-209-MMSEncapsulation-20020105-a, Version 05-Jan-2002)
各協議間的關系是:
· WDP是WAP的數據報協議(就是TCP/IP中的UDP協議)--通過GSM SMS只能承載WDP消息;
· WTP是WAP的事務傳服協議(是有連接的,類似于TCP/IP中的TCP協議)(WTP協議在彩信收發的過程中沒有使用,所以這個筆記就沒有記錄了);
· WSP是WAP的應用基礎,定義了WAP的一些基本操作,這些操作是建立在WDP和WTP之上的。如:WSP的S-Unit-Push消息映射到WDP中,其實就是一條單向的WDP消息--T-DUnitdata.req。 當這條WDP承載于GSM短信中,就是一條GSM短信;
· 而WAP MMS Encapsulation Protocol則定義了,MMS如何通過WAP消息來進行收發。如,之前提到的“m-notification-ind”就是WAP MMS Encapsulation規范中定義的消息類型。
信令流程各階段的相關規范的詳細描述:
a) 彩信中心向手機發起的通知指示消息(m-notification-ind),通常是通過短信下發的(也即:WAP over SMS方式)。也就是說,下發的短信,不是普通的文字短信,而是一個WAP消息,具體的說是一條S-Unit-Push消息(在WSP規范中定義)。
b)這條m-notification-ind短信是一條怎樣的短信呢?
· 首先,短信類型是SMS_Deliver;
· TP-UDHI為1,即:數據區前面有一個Header;
· TP-DCS應該為0x04,即8-bit編碼,這樣數據區就是140個字節,通常Header是6個字節,所以可用的數據區是134個字節。這134個字節就可以保存WDP的內容。
· 因為TP-UDHI為1,所以數據區(TP-UD)的前段有一個Header,所以TP-UDL字段指示的長度是Header + TP-UD長度之和。而Header的格式在3GPP TS 23.040規范中有描述,即: 由Header的長度,外加若干個“IEI(信息標識)+IEIDL(信息內容的長度)+ IED(信息數據內容)”組成。
· 對于WDP消息,必須包含IEI=0x05的信息。根據3GPP TS 23.040,IEI為0x05是指“Application port addressing scheme, 16 bit address”,即:信息要指示兩個端口號--源端口號和目標端口號。 源端口和目標端口號將告訴手機,這條短消息應該發給哪個協議棧來處理。
· 對于m-notification-ind消息,源端口號必須為:9200(0x23F0) -- WAP connectionless session service, 目標端口號則必須是:2948 (0x0B84) -- WAP PUSH。這樣的端口信息向手機指示了:這是一條WAP無連接會話消息(即基于WDP的WSP消息),發給手機的WAP PUSH應用協議棧來處理。 對于端口號的定義,可以參考iana的端口號分配表:http://www./assignments/port-numbers
· 如果一段數據區保存不了所有的WDP消息,則需要兩條(或更多)短信的數據區來存儲,這時就需要使用長短信分塊技術,這就需要用到IEI=0x00的信息數據了。但是這是普通的WAP PUSH才可能用到,彩信的notification一般不會有這么長的內容。
· 好了,下面說說短信數據區(TP-UD)的內容。因為根據Header的端口指示,手機已經知道這是基于WDP的WSP消息了,所以數據區就直接按WSP的規范來解碼(WDP層的參數只有源地址和目標地址,而這在短信協議的Header區已經指示了,所以沒有需要編碼的字段了,所以數據區的一開始就是WSP的內容)。
· 根據WSP規范,WSP的內容每一個字節是TID。這是一個ID,在不同的消息中有不同的作用,在Push消息中,這表示Push-ID,標識一次Push請求);當然,某些消息可能沒有這個ID; 第二個字節為PDU Type,用于告訴WSP協議棧,這個WSP消息是什么消息。在彩信通知消息,這個值應該是:0x06 -- Push。也就是說,這個就告訴WSP協議棧,這是S-Unit-Push消息了(因為這是在WDP中封裝的,相當于是WDP層通過T-DUnitdata.ind發給WSP層的,所以WSP層知道,這是Unit消息); 第三個字節是S-Unit-Push頭域的長度,后面就是S-Unit-Push消息的頭域的內容了,使用二進制或ASCII的方式保存了一些頭域的值,需要使用到的頭域包括:
1) Content-Type -- 此值必須填“application/vnd.wap.mms-message”(代碼:0x3e,在http://www./wina/wsp-content-type.htm中有定義,而在“WAP MMS Encapsulation Protocol”中也指示這個值必須填“Application/vnd.wap.mms-message”)。當Content-Type填這個值時,這就表示S-Unit-Push的內容是彩信消息;
2) X-Wap-Application-Id -- 此值必須填編碼0x04(實際填的值是0x84,具體要參考WSP的變長數據值保存格式),表示“mms.ua”(0x04表示mms.ua,這個值在http://www./wina/push-app-id.htm和http://www./Tech/omna/omna-push-app-id.aspx中都有定義,而在“WAP MMS Encapsulation Protocol”中也指示,Application-Id必須填“4”。)
3) Push-Flag -- 這個頭域是可選的,不是必須填的,如果要填應該填(0x07,實際寫入0x87)。 Push-Flag的值的定義在另一個規范(“WAP Push OTA Protocol”)中有相關的描述: 6.4.1.3. Push Flag Push-Flag = "Push-Flag" ":" 1*7BIT ; bit mask flags to indicate the following: ; 1: initiator URI is authenticated. ; 10: content is trusted. ; 100: last push message. ; other: reserved for future use.
· S-Unit-Push頭域的后面就是S-Unit-Push的內容了。而內容的格式(類型)是根據“Content-Type”來確定的。而前面已經說了,Content-Type的值是“application/vnd.wap.mms-message”,所以WSP的應用層知道這是彩信(MMS)消息,于是就根據規范“WAP MMS Encapsulation Protocol”的要求來進行解碼。
· “application/vnd.wap.mms-message”數據的格式是: 頭域 + 內容。(某些操作可能沒有“內容”,那就只有頭域了。至于有頭域和內容的消息,頭域何時結束、內容從哪里開媽, 目前還沒有詳細的去研究!)
· 對于彩信通知消息,頭域需要包含這些內容,詳見規范“WAP MMS Encapsulation Protocol”中的“6.2. Multimedia Message Notification”節)。下面說說這些頭域中,最重要的幾個: 1) X-Mms-Message-Type: 其值必須是“m-notification-ind”(0x82); -- 這表示這是彩信通知消息,手機收到此消息表示彩信中心有該手機的彩信,手機應該去獲取此彩信 2) X-MMS-Content-Location:其值是一個URI地址,告訴手機應該到哪里去獲取彩信的內容;
· 彩信的“m-notification-ind”消息只有頭域沒有內容。
· 當手機收到“m-notification-ind”消息后,就可以通過HTTP GET向URI所指示的彩信中心服務器,請求獲取彩信內容。
· 而彩信中心服務器在返回HTTP GET的請求時,Content-Type也應該是“application/vnd.wap.mms-message”,并且內容中“Message Type”的值應該填“m-retrieve-conf”(0x84)。
(3) 相關信息
普通WAP Push的content type:
0x2e -- application/vnd.wap.sic
彩信通知的content type:
0x3e -- application/vnd.wap.mms-message |