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