WAP PUSH的SMS PDU解析
WAP PUSH業務是承載在SMS業務之上的,亦即WAPPUSH數據封裝在SMSPDU的UserData中。本文分析PDU的UserData中WAP PUSH的WSP和WBXML的封裝。
?
本文以《SMS PDU封裝》中已經講解了SMS PDU封裝的WAP PUSH數據為例來講解WSP和WBXML的封裝。SMS PDU封裝在WSP和WBXML外面,所以WSP和WBXML的封裝是不區分是否是拼接的長短信的,WSP和WBXML關注的是合并后的SMS PDU的完整UserData。
79 06 01 ae 02056a0045c6080c03662e31303038362e636e2f662f736a6678000103e689bee69c8be5
8f8be38081e69fa5e5a4a9e6b094e38081e79c8be5b08fe8afb4e38081e79c8be696b0e997bbe280
a6e6898be69cbae9a39ee4bfa1efbc8ce7ae80e58d95e4bda0e79a84e7949fe6b4bbefbc81e8b5b6
e5bfabe4b88be8bdbde4bd93e9aa8ce6898be69cbae9a39ee4bfa1000101
?
一、WSP
下面是按次解析的WSP封裝
?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數據。
02056a 00 45c6 08 0c 03662e31303038362e636e2f662f736a6678000103e689bee69c8be58f8be380 81e69fa5e5a4a9e6b094e38081e79c8be5b08fe8afb4e38081e79c8be696b0e997bbe280a6e6898b e69cbae9a39ee4bfa1efbc8ce7ae80e58d95e4bda0e79a84e7949fe6b4bbefbc81e8b5b6e5bfabe4 b88be8bdbde4bd93e9aa8ce6898be69cbae9a39ee4bfa100 0101?
二、PUSHSI的封裝WBXML
WAP PUSH SI是封裝在XML格式中的,但是XML不適合在SMS這種長度極度受限的傳輸手段,所以采用PUSH采用WBXML(WAPBinary XML)封裝。WBXML用一個字節代替常用的TAG和Attribute,所以能極大的節約傳輸數據量。
?
下面是WBXML到XML的解析:
? 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為: ? <?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提醒通知采用了Stringtables。很多手機終端雖然能收到通常的PUSH消息,但是卻接收不到139郵箱的WAP PUSH通知,原因就是不支持帶stringtable的WBXML的解析,而忽略了這樣的PUSH消息。
下面是帶有Stringtable的WAP PUSH SI數據
02056a0fe982aee4bbb63a52653a507573680045c60c03792e31303038362e636e2f693f663d3430 26693d313039383830393834303100080183000101?
下面是WBXML到XML的解析:
? 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> ? 把StringTable中的內容替換,得到最終解析出的XML: ? <?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。
總結
以上是生活随笔為你收集整理的WAP PUSH的SMS PDU解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A的大小是多少c语言中,C/C+中字符(
- 下一篇: 8种你可能正在写错的SQL用法