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解析相关推荐

  1. [原]Wap push over sms 实践

    Wap push over sms 实践  author:clapton_xpAThotmailDOTcom 20060323 通过短信进行点对点的WAP PUSH,本质上来说应该是发送一个wap页面 ...

  2. android wap push实现

    WAP PUSH Date Ver Description Author Reviewer 2011-9-5 0.0.1 Draft 1. Wap Push简介: Wap Push分为两种:SI(Se ...

  3. Create WAP Push SMS Messages

    转自:http://blog.163.com/htlxyz@126/blog/static/1685940292009620111811387/ 改过后的代码在下面,程序好像可以输出了WAPPUSH的 ...

  4. WAP Push SP接口协议

    1.术语说明 1)      DSMP Data Service Management Platform,数据业务管理平台.中国移动集团公司的移动数据业务平台,移动梦网计划(Monternet)的核心 ...

  5. SMS PDU 短信回执设置

    以前做的一个东西,把资料整理了一下. 今天研究了一个上午的sms pdu 格式,找到了在pdu串中设置短信回执的方法.就是在pdu-type这个8位位组一般都设置为11:包含TP-MTI(2bit), ...

  6. 手机 SMS PDU 格式参考手册

    开发者指南 SMS with the SMS PDU-mode 翻译整理: 犬犬(心帆) E-Mail: shuixin13@163.com 最后修定日期: 2004-10-18 SMS with t ...

  7. Android 短信 彩信 wap push的接收

    接收彩信 <receiver android:name=".smsreceiver" android:permission="android.permission. ...

  8. wap push简介

    2019独角兽企业重金招聘Python工程师标准>>> WAP就像因特网,是一个内容丰富的网络,用户如何找到自己喜欢的站点,如何在一个站点中找到自己 喜 欢的业务,往往需要花上很长的 ...

  9. Wap Push 源码

    Wap Push 源码 CMPP3.0 , C# 源码 submit.TP_pID=0 submit.TP_udhi=1 submit.Msg_Fmt=0x04 WAPPUSH wap=new WAP ...

  10. 域格模块短信收发(PDU解析)

    文章目录 前言 一.test和PDU 二.使用步骤 1.发送短消息 2.接收短消息 三.PDU编码解析 前言 短信是伴随数字移动通信系统而产生的一种电信业务,通过移动通信系统的信令信道和信令网,传送文 ...

最新文章

  1. 详细!看看顶级互联网公司都在研究的无服务器架构!
  2. CentOS7下Hadoop集群搭建
  3. Django模板继承后出现logo图片无法加载的问题
  4. Manjaro下安装VirtualBox
  5. GO语言学习之路22
  6. 某些函数原型及其用法
  7. awk 字符串替换 gsub
  8. 南京大学软件测试复习
  9. 河南高中计算机会考excl,高中信息技术会考EXCEL知识点.pdf
  10. css等比例分割父级容器(完美三等分)
  11. 计算机提示无法访问手机tf卡,电脑不识别TF卡的解决办法
  12. vc6.0精简版支持win7 64位版本
  13. 【科目一】你必须知道的驾考交通标志大全
  14. 中文谚语 enlish version
  15. C#串口开发案例:迈瑞血球分析仪
  16. 将PDF转换成Word文档后,为什么字体全变了?
  17. php生成二维码并与背景图片合成
  18. 在OpenStack全球开源社区里,中国力量正在异军突起
  19. 什么是4D(DRG、DLG、DOM、DEM)数据?(转自gisriver的空间)
  20. 44个Java编码规范与常用知识点

热门文章

  1. SQL Server代码如何快速格式化
  2. 汪文君PowerMock实战视频
  3. 浅谈机器学习-分类和聚类的区别
  4. wps怎么在中文后面加数字_怎样给wps底部加上页面数字 - 卡饭网
  5. vibe的matlab实现,Matlab調用VIBE算法
  6. SNAP7 C++ 通讯
  7. 工业上服务器无线投屏到电视,台式电脑支持无线投屏吗 如何投屏到电视上
  8. 云原生日志管理瑞士军刀 Fluent Operator 中文入门教程
  9. Web大学生网页作业成品~美食餐饮网站设计与实现(HTML+CSS+JavaScript)
  10. 基于TI8168平台的16路D1分辨率的DVR方案