生活随笔
收集整理的這篇文章主要介紹了
WAP PUSH解析(2)——WSP以及WBXML编码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
WAP PUSH業務是承載在SMS業務之上的,亦即WAP PUSH數據封裝在SMS PDU的UserData中。本文分析PDU的UserData中WAP PUSH的WSP和WBXML的編碼。
?
本文以《WAP PUSH解析(1)——SMS PDU編碼》中已經講解了SMS PDU封裝的WAP PUSH數據為例來講解WSP和WBXML的編碼。SMS PDU封裝在WSP和WBXML外面,所以WSP和WBXML的編碼是不考慮數據是否是拼接的長短信的,WSP和WBXML要解析的是SMS PDU(如果分多個SMS發送,這里是拼接后的)的完整UserData。
[plain] view plaincopy
79?06?01?ae?02056a0045c6080c03662e31303038362e636e2f662f736a6678000103e689bee69c8be5??8f8be38081e69fa5e5a4a9e6b094e38081e79c8be5b08fe8afb4e38081e79c8be696b0e997bbe280??a6e6898be69cbae9a39ee4bfa1efbc8ce7ae80e58d95e4bda0e79a84e7949fe6b4bbefbc81e8b5b6??e5bfabe4b88be8bdbde4bd93e9aa8ce6898be69cbae9a39ee4bfa1000101??
一、WSP
下面是按次解析的WSP封裝
[plain] view plaincopy
1.?transactionId:???????0x79??2.?pduType:?06???????06?PDU_TYPE_PUSH???????07?PDU_TYPE_CONFIRMED_PUSH??3.?headerLength:????????頭長度是變長的:32bits標示的7位編碼,最多用5個octets編碼???????octet的bit7為1標識后續octet仍為長度數據;為0標識長度結束?????所以,這里01也就是頭的長度。????4.?ContentType:????????(wap-230-wsp-20010705-a?section?8.4.2.24)???????WAP?PUSH是通常的說法,其實WAP?PUSH并不是最終的業務,最終業務是ContentType中標識的業務。?????????ae?&?0x80?->?2E???????0x2e?CONTENT_TYPE_B_PUSH_SI??????????"application/vnd.wap.sic"???????0x30?CONTENT_TYPE_B_PUSH_SL??????????"application/vnd.wap.slc"???????0x32?CONTENT_TYPE_B_PUSH_CO??????????"application/vnd.wap.coc"???????0x3e?CONTENT_TYPE_B_MMS??????????????"application/vnd.wap.mms-message"???????0x44?CONTENT_TYPE_B_PUSH_SYNCML_NOTI?"application/vnd.syncml.notification"?????????可以看到,PUSH?Service?Indication(SI)?/?PUSH?Sservice?Load(SL)?/?MMS都是WAP?PUSH?over?SMS中的業務,而通常說的WAP?PUSH業務指的是SI/SL。???????這里封裝的是SI。??
接下來是WBXML封裝的SI數據。
[plain] view plaincopy
02056a?00?45c6?08?0c?03662e31303038362e636e2f662f736a6678000103e689bee69c8be58f8be380??81e69fa5e5a4a9e6b094e38081e79c8be5b08fe8afb4e38081e79c8be696b0e997bbe280a6e6898b??e69cbae9a39ee4bfa1efbc8ce7ae80e58d95e4bda0e79a84e7949fe6b4bbefbc81e8b5b6e5bfabe4??b88be8bdbde4bd93e9aa8ce6898be69cbae9a39ee4bfa100?0101??
二、PUSH SI的封裝WBXML
WAP PUSH SI是封裝在XML格式中的,但是XML不適合在SMS這種長度極度受限的傳輸手段,所以采用PUSH采用WBXML(WAP Binary XML)封裝。WBXML用一個字節代替常用的TAG和Attribute,所以能極大的節約傳輸數據量。
?
下面是WBXML到XML的解析:
[plain] view plaincopy
02?<?xml?version="1.0"?encoding="UTF-8"?>??05?<!DOCTYPE?si?PUBLIC?"-//WAPFORUM//DTD?SI?1.0//EN"???????????????????????"http://www.wapforum.org/DTD/si.dtd">??6A?IANACharset?????04?iso-8859-1?????17?shift_JIS?????6A?UTF-8?????03?US-ASCII??00?String?table?Length??45?<si>??C6?<indication??08?action="signal-high"??????06?action="signal-low"??????07?action="signal-medium"??0C?href="http://??????0D?href="http://www.??????0E?href="https://??????0F?href="https://www.??03?start?of?inline?string?value??662e31303038362e636e2f662f736a6678??f?.?1?0?0?8?6?.?c?n?/?f?/?s?j?f?x??00?end?of?inline?string?value??01?'>'?end?of?attributes??????>??03?start?of?inline?string?value??e689bee69c8be58f8be38081e69fa5e5a4a9??找朋友、查天??e6b094e38081e79c8be5b08fe8afb4e38081??氣、看小說、??e79c8be696b0e997bbe280a6e6898be69cba??看新聞…手機??e9a39ee4bfa1efbc8ce7ae80e58d95e4bda0??飛信,簡單你??e79a84e7949fe6b4bbefbc81e8b5b6e5bfab??的生活!趕快??e4b88be8bdbde4bd93e9aa8ce6898be69cba??下載體驗手機??e9a39ee4bfa1??????????????????????????飛信??00?end?of?inline?string?value??01??</indication>??01??</si>??
最終解析得到的XML為:
[html] view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>??<!DOCTYPE?si?PUBLIC?"-//WAPFORUM//DTD?SI?1.0//EN"???????????????????????"http://www.wapforum.org/DTD/si.dtd">??<si>????<indication?action="signal-high"?href="http://f.10086.cn%2Ff%2Fsjfx">??????找朋友、查天氣、看小說、看新聞…手機飛信,簡單你的生活!趕快下載體驗手機飛信????</indication>??</si>??
三、帶有string table的WBXML
WBXML封裝的字符串有inline string和string table兩種,這兩種字串都以’\0’結束。String table中可以由’\0’結束的多個字符串,stringtable的長度把結束符’\0’計算在內,是所有字串的總長度。
139郵箱的WAP PUSH提醒通知采用了String tables。很多手機終端雖然能收到通常的PUSH消息,但是卻接收不到139郵箱的WAP PUSH通知,原因就是不支持帶stringtable的WBXML的解析,而忽略了這樣的PUSH消息。
下面是帶有String table的WAP PUSH SI數據
[plain] view plaincopy
02056a0fe982aee4bbb63a52653a507573680045c60c03792e31303038362e636e2f693f663d3430??26693d313039383830393834303100080183000101??
下面是WBXML到XML的解析:
[plain] view plaincopy
02?<?xml?version="1.0"?encoding="UTF-8"?>??05?<!DOCTYPE?si?PUBLIC?"-//WAPFORUM//DTD?SI?1.0//EN"???????????????????????"http://www.wapforum.org/DTD/si.dtd">??6A?IANACharset?????04?iso-8859-1?????17?shift_JIS?????6A?UTF-8?????03?US-ASCII???????0f?String?Table?Length?????長度是string?table中所有string的長度,長度包含結束符’\0’。??e982aee4bbb63a52653a50757368?????郵件:Re:Push??00?end?of?string?table?value????45?<si>??C6?<indication??0C?href="http://??03?start?of?inline?string?value??792e31303038362e636e2f693f663d343026693d3130393838303938343031?????y.10086.cn/i?f=40&i=10988098401??00?end?of?inline?string?value??08?action?attribute?-?signal?high?????action="signal-high"??01?'>'?end?of?attributes??????>??83?String?table?reference?below??00?String?table?index??01??</indication>??01??</si>??
把String Table中的內容替換,得到最終解析出的XML:
[html] view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>??<!DOCTYPE?si?PUBLIC?"-//WAPFORUM//DTD?SI?1.0//EN"???????????????????????"http://www.wapforum.org/DTD/si.dtd">??<si>????<indication?href="http://y.10086.cn/i?f=40&i=10988098401"?action="signal-high">郵件:Re:Push????</indication>??</si>??
四、小結
本文以WAP PUSH Service Indication為例,講解WAP PUSH的WSP編碼和WBXML編碼。并對WBXML的兩種string——inline string和string table進行了詳細闡述。
?
參考資料
1. WAP Binary XMLContent Format
??? WBXML標準,必看!
2. MIUI ROM接收WAP PUSH短信的補丁
??? Android上的WAP PUSH解析實現,有源代碼,但是解析不全。
3. WAP Push over SMS
??? WAP PUSH over SMS的大致介紹(英文)
4. WAP Push SMS encoding
??? WAP PUSH Service Indication封裝實例(英文)
5. Sending SMS WAP Push messages using the ActiveXperts SMS and MMS Toolkit
??? 發送WAP PUSH的工具。是使用說明,雖然沒實現細節,但可參考WBXML的Token和Attribute對照。(英文)
6. android wap push功能實現
??? 反面教材。用固定位置解析,以及固定用000103標識URL結束,固定用000101標識內容結束,簡直是胡扯!
??? 關于協議的解析還是要依據標準!用自己遇到的情況可以幫助理解協議,但是據此來做實現的話,只能解析一種情況,被解析內容或格式有少許變化,所做的實現就沒用了,到處是BUG。
【修改歷史記錄】
2012/07/02 對頁面布局做了修改
把PDU數據和編碼解析部分放在了CSDN編輯工具“編程語言(其他)”里,這樣看起來段落上好多了,不過損失了顏色標注!把解析后的XML放在CSDN編輯工具“編程語言(HTML/XML)”里。
總結
以上是生活随笔為你收集整理的WAP PUSH解析(2)——WSP以及WBXML编码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。