2012-06-30
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。
一、WSP
下面是按次解析的WSP封装
接下来是WBXML封装的SI数据。
二、PUSH SI的封装WBXML
WAP PUSH SI是封装在XML格式中的,但是XML不适合在SMS这种长度极度受限的传输手段,所以采用PUSH采用WBXML(WAP Binary XML)封装。WBXML用一个字节代替常用的TAG和Attribute,所以能极大的节约传输数据量。
下面是WBXML到XML的解析:
最终解析得到的XML为:
三、带有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数据
下面是WBXML到XML的解析:
把String Table中的内容替换,得到最终解析出的XML:
四、小结
本文以WAP PUSH Service Indication为例,讲解WAP PUSH的WSP编码和WBXML编码。并对WBXML的两种string——inline string和string table进行了详细阐述。
参考资料
1. WAP Binary XMLContent Format
WBXML标准,必看!
Android上的WAP PUSH解析实现,有源代码,但是解析不全。
WAP PUSH over SMS的大致介绍(英文)
WAP PUSH Service Indication封装实例(英文)
5. Sending SMS WAP Push messages using the ActiveXperts SMS and MMS Toolkit
发送WAP PUSH的工具。是使用说明,虽然没实现细节,但可参考WBXML的Token和Attribute对照。(英文)
反面教材。用固定位置解析,以及固定用000103标识URL结束,固定用000101标识内容结束,简直是胡扯!
关于协议的解析还是要依据标准!用自己遇到的情况可以帮助理解协议,但是据此来做实现的话,只能解析一种情况,被解析内容或格式有少许变化,所做的实现就没用了,到处是BUG。
【修改历史记录】
2012/07/02 对页面布局做了修改