[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]

[SMS&WAP]实例讲解制作OTA短信

来自动配置手机WAP书签

编写者

 

 

 

 

日期

 

 

 

 

关键词

 

 

 

 

郑昀@ultrapower

2005-9-5

 

 

 

 

Sms wap ota 书签 空中下载 手机上网设置 WDP WSP WBXML

 

 

 

 

源代码http://www.cnblogs.com/Files/zhengyun_ustc/otasms.rar

空中下载
(OTA)的概念

 

OTA,即Over The Air,国内翻译为空中下载

 

 

 

OTA标准由爱立信和诺基亚共同制订。OTA涵盖了许多范围,比如Kjava中的应用程序下载也是通过OTA我们这篇文章主要讲的是,通过短信方式空中下载配置信息,参考的文档是OTA_settings_general_7_0.pdf

 

 

 

 

 

 

 

 

 

https://secure.forum.nokia.com/main/1,6566,1_47_50_10,00.html

 

 

 

你可以看到许多Nokia - Ericsson OTA Documents

 

 

 

下载OTA Setting规范:

 

 

 

http://sw.nokia.com/id/3377eb33-cb1d-490e-a1cb-8735d785e1d3/OTA_settings_general_7_0.pdf

 

 

 

下载OTA Setting示范:

 

 

 

http://sw.nokia.com/id/bf5f034f-be06-4506-87b7-22788de5c316/OTA_service_settings_example_v11.pdf

 

 

 

 

 

 

规范中定义了三种Setting

 

 

 

l         浏览器设置

 

 

 

l         浏览器的书签设置

 

 

 

l         SyncML设置

 

 

 

也就是说,你通过发送短信可以帮助用户手机配置这三种设置。

 

 

 

商业应用示范

 

网易有一个很好的示范,你可以浏览

 

 

 

http://wapapps0.163.com/wap/OTASetting.jsp?type=all

它下面的注解也说了:“OTA自动配置简单来说就是通过一条特殊格式的短信为客户手机设置手机参数。适合机型:所有支持OTA设置的开通GPRSWAP手机。(常见的支持OTA的机型有:索尼爱立信、爱立信、诺基亚等。)

       它的这个示范是可以给你的手机上发送两个短信的,一个是你的WAP上网浏览器设置,一个是他的WAP书签。两条短信的显示标题都是“配置信息”。

我们下面具体讲解一下“WAP书签”的OTA短信生成办法。

      

简单粗暴直奔主题

 

原则上,你只要看了OTA_settings_general_7_0.pdf,并参照OTA_service_settings_example_v11.pdf,就可以轻松地制作出符合规范的OTA短信

 

 

 

但是,本文档的目的就是让你简单粗暴地直奔主题,看完这篇文档和源代码后,就了解了OTA短信的概念,通过以下代码:

 

 

 

OTAMessage

 

 

 

 

OTAMessage message = new OTAMessage();

 

 

 

txtOTAResult.Text = message.GetSMSBytes(txtBookmarkName.Text, txtBookmarkURL.Text);

 

 

 

 

 

 

 

 

来生成短信二进制内容,并通过

 

 

 

UltraBinarySMS

 

 

 

 

UltraBinarySMS.SendSMS sendsms = new UltraBinarySMS.SendSMS();

 

 

 

string strResponse = sendsms.send(content, destmobile);

 

 

 

 

 

 

 

 

发送短信,你就可以立即在手机上看到效果。

 

 

 

 

 

 

下面,我们来铺垫:

 

 

 

你要给目的手机发送一条短信,它必须是二进制格式的,这样手机才能够识别出来。

 

 

 

这条短信内容差不多分为三块:

 

 

 

l         WDP Layer的包头;

 

 

 

l         WSP Layer的包头;

 

 

 

l         WBXML

 

 

 

书签的真正内容是用WBXML表述的。

 

 

 

WDPWSP

 

什么是WDPWSP呢?

 

 

 

WDPWireless Datagram ProtocolWSPWireless Session Protocol

 

 

 

更多信息可以参考http://www.protocols.com/pbook/wap.htm

 

 

 

 

 

 

WAP Forum 在设计1.x版本的时候是经过深思熟虑的,但它和我们熟知和喜爱的3W协议(比如HTTP, SSL HTML)并不兼容。

 

 

 

WAP1.x堆栈被定义为五层,自底向上依次是:

 

 

 

u       WDP (Wireless Datagram Protocol),

 

 

 

u       WTLS (Wireless Transport Layer Security),

 

 

 

u       WTP (Wireless Transaction Protocol),

 

 

 

u       WSP (Wireless Session Protocol),

 

 

 

u       WAE (Wireless Application Environment,包括 Wireless Markup Language WML, 以及 WMLScript )

 

 

 

       每一层都和3W堆栈层面大致吻合:

 

 

 

n         WDP->IP,

 

 

 

n         WTP->TCP,

 

 

 

n         WTLS->SSL/TLS,

 

 

 

n         WSP->HTTP,

 

 

 

n         WML->HTML

 

 

 

       这时你可以参考

 

 

 

http://www.protocols.com/pbook/images/wapstack.gif

 

 

 

The OSI Model for Wireless Communication

 

 

 

 

 

 

由于WSP相当于HTTP层,那么WSP层所肩负的职责是:

 

 

 

       1).提供HTTP 1.1的功能和语义

 

 

 

       2).能力协商

 

 

 

       3).会话状态长期保存

 

 

 

       4).会话挂起和恢复

 

 

 

       5).可靠以及不可靠的Push的公共机制

 

 

 

       等等。

 

 

 

在我们的OTA实现中,WSP Header其实就是声明两个内容:PDU typeMIME Type至于WDP,就是声明一个端口号,并说明本数据包是整条短信的第几个包。

 

 

 

 

 

 

本实现代码参考了CodeProject上的一个生成WAP Push的工程,所以你将会看到类似于它的WDPWSP类和方法

 

 

 

    WBXML

 

WBXML,就是WAP Binary XML

 

 

 

简单地说,它就是一个定义好的XML片断,可以表述出WAP浏览器设置、WAP书签设置等等内容。

 

 

 

比如,这样一个实例:

 

 

 

UltraBinarySMS

 

 

 

 

<CHARACTERISTIC-LIST>
<CHARACTERISTIC TYPE="BOOKMARK">
    <PARM NAME="NAME" VALUE="yahoo"/>
    <PARM NAME="URL" VALUE="http://wap.yahoo.com"/>
</CHARACTERISTIC>

 

 

 

</CHARACTERISTIC-LIST>

 

 

 

 

 

这样指明一个名为“yahoo”的WAP书签,指向http://wap.yahoo.com

 

 

 

很简单不是吗?

 

 

 

但是如何将这个XML转换为短信所需要的二进制呢?

 

 

 

转换过程:按图索骥

 

Nokia是这么定义转换规则的,很简单,就是尽可能简短地用一个字符表示某一个元素。比如我们上面定义的WBXML可以用下面的转换规则

 

 

 

WBXML节点定义

 

 

 

 

对应的二进制ASCII字符

 

 

 

 

<CHARACTERISTIC-LIST>

 

 

 

 

45

 

 

 

 

<CHARACTERISTIC

 

 

 

 

C6

 

 

 

 

TYPE="BOOKMARK"

 

 

 

 

7F

 

 

 

 

> (End attribute)

 

 

 

 

01

 

 

 

 

PARM

 

 

 

 

87

 

 

 

 

NAME="NAME"

 

 

 

 

15

 

 

 

 

VALUE

 

 

 

 

11

 

 

 

 

String start

 

 

 

 

03

 

 

 

 

Yahoo

 

 

 

 

7961686F6F

 

 

 

 

String end

 

 

 

 

00

 

 

 

 

/> End (PARM)

 

 

 

 

01

 

 

 

 

PARM

 

 

 

 

08

 

 

 

 

NAME="URL"

 

 

 

 

17

 

 

 

 

VALUE

 

 

 

 

11

 

 

 

 

String start

 

 

 

 

03

 

 

 

 

http://wap.yahoo.com

 

 

 

 

687474703A2F2F7761702
E7961686F6F2E636F6D

 

 

 

 

String end

 

 

 

 

00

 

 

 

 

/> End (PARM)

 

 

 

 

01

 

 

 

 

/> End (CHARACTERISTIC)

 

 

 

 

01

 

 

 

 

/> End (CHARACTERISTIC-LIST)

 

 

 

 

01

 

 

 

 

是不是很简单?

 

 

 

具体的转换规则,可以参考《OTA_settings_general_7_0.pdf》的8.2章节。

 

 

 

 

 

 

下面简单说一下分包:

 

 

 

分包

 

如果你的短信既要设置浏览器,又要设置书签,就有可能短信内容超长,必须事先分为两个或者多个包

 

 

 

OTA_settings_general_7_0.pdf

 

 

 

和《OTA_service_settings_example_v11.pdf》的例子可以很明显地看出来这一点。

 

 

 

每个包还按照二进制短信发出,由客户端-手机自行合并为一个,并解析。

 

 

 

 

 

 

OTA_service_settings_example_v11.pdf》的例子中,通过WDP的包头来设置:

 

 

 

02代表共有两个包(Total no. of segments in datagram);

 

 

 

第一个短信的01代表这是第一个包(segment count)

 

 

 

第二个短信则是02

 

 

 

我的源代码

 

OTASMS工程中有一个OTACreator项目它提供了一个com.ultrapower.OTACreator.dll来给出如何根据输入参数书签标题书签URL”生成最终要发送的OTA短信内容。它的调用方法如下所示:

 

 

 

OTAMessage

 

 

 

 

OTAMessage message = new OTAMessage();

 

 

 

string strSMSContent = message.GetSMSBytes(我的WAP, http://mywap.com);

 

 

 

 

 

strSMSContent就是我们要的短信内容。上面的代码执行之后,得到的二进制ASCII文本内容是:

 

 

 

Sms content

 

 

 

 

0B0504C34FC002000304010101062C1F2A6170706C69636174696F6E2F782D7761702D
70726F762E62726F777365722D73657474696E67730081EA01016A0045C67F018715110
3E68891E79A8477617000018717110387687474703A2F2F6D797761702E636F6D00010101

 

 

 

 

稍候我们按照《OTA_service_settings_example_v11.pdf》解释一下这个字符串每一个字符的含义。

 

 

 

 

 

 

我们还提供了一个公开的Web Service

 

 

 

http://219.238.168.183/SendBinarySMS/sendsms.asmx?wsdl

 

 

 

Web service介绍

 

 

 

 

提供免费的发送二进制短信的渠道。本服务仅供测试OTA自动配置和书签短信。中国移动有监控,请勿作其他用途。

 

 

 

支持下列操作。有关正式定义,请查看服务说明

 

 

 

·                     send
填写二进制短信的HEX ASCII文本内容。比如“0B0504C34FC0020003040202296A0101860711036874”之类的。具体要填写的内容,请参考我的OTASMS工程,它会帮助你生成要发送的二进制内容。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,供您测试发送OTA短信。只需要提供输入参数:短信内容和目标号码即可。

 

 

 

你运行本工程的OTATextBuilder,可以看到这样的界面:

 

 

 

 

 

 

 

 

 

 

 

 

点击“调用OTACreator生成OTA”按钮之后,再点击“将上面的二进制短信发出去”按钮,你的手机上就会收到一个叫做“配置信息”的短信,它有一个菜单叫做“存入书签”。

 

 

 

逐行解释OTA例子

 

上面生成了一个OTA短信:

 

 

 

Sms content

 

 

 

 

0B0504C34FC002000304010101062C1F2A6170706C69636174696F6E2F782D
7761702D70726F762E62726F777365722D73657474696E67730081EA01016A
0045C67F0187151103E68891E79A8477617000018717110387687474703A2F2F6
D797761702E636F6D00010101

 

 

 

 

我们尽量细地解释一下。首先是WDP

 

 

 

Layer

 

 

 

 

binary

 

 

 

 

解释

 

 

 

 

WDP

 

 

 

 

0B

 

 

 

 

User-Data-Header (UDHL) Length = 11

 

 

 

 

05

 

 

 

 

UDH IE identifier: Port numbers

 

 

 

 

04

 

 

 

 

UDH port number IE length

 

 

 

 

C3

 

 

 

 

这四个数字定义了一个端口号:49999

 

 

 

 

4F

 

 

 

 

C0

 

 

 

 

02

 

 

 

 

00

 

 

 

 

UDH IE identifier: SAR

 

 

 

 

03

 

 

 

 

UDH SAR IE length

 

 

 

 

04

 

 

 

 

Datagram ref no.

 

 

 

 

01

 

 

 

 

这两个只有当OTA内容过长时,短信会被拆分为两条或多条,这时候第1个字节表明OTA短信共有几个数据包,也就是共被拆分为几条短信;第2个字节表明当前数据包是第几个数据包。

 

 

 

默认情况下,我们只有一个数据包,并且当前包是第一个数据包。所以就是0x01 0x01了。

 

 

 

 

 

01

 

 

 

 

 

 

 

接下来是WSP

 

 

 

Layer

 

 

 

 

binary

 

 

 

 

解释

 

 

 

 

WSP

 

 

 

 

01

 

 

 

 

Transaction ID / Push ID WSP layer

 

 

 

 

06

 

 

 

 

PDU type (push)

 

 

 

 

2C

 

 

 

 

Header length (content type+headers)

 

 

 

 

1F

 

 

 

 

value length quote length greater than 30

 

 

 

 

2A

 

 

 

 

value length (value name not used)

 

 

 

 

61,70,70,6C,69,63,61,74,69,

 

 

 

6F,6E,2F,78,2D,77,61,70,2D

 

 

 

,70,72,6F,76,2E,62,72,6F,77,

 

 

 

73,65,72,2D,73,65,74,74,69,

 

 

 

6E,67,73

 

 

 

 

 

 

 

 

就是ASCII字符串:'a','p','p','l','i','c','a','t','i','o','n','/','x','-

 

 

 

','w','a','p','-

 

 

 

','p','r','o','v','.','b','r','o','w','s','e','r','-

 

 

 

','s','e','t','t','i','n','g','s',

 

 

 

MIME-Type =

 

 

 

browser settings

 

 

 

 

 

 

 

 

 

00

 

 

 

 

Null termination of content type string

 

 

 

 

81

 

 

 

 

charset (well known PARM.(short

 

 

 

integer))

 

 

 

 

 

EA

 

 

 

 

UTF-8 (using short integer) WSP layer (end WSP

 

 

 

headers)

 

 

 

 

 

然后是WBXML

 

 

 

Layer

 

 

 

 

binary

 

 

 

 

解释

 

 

 

 

WBXML

 

 

 

 

01

 

 

 

 

Version WBXML 1.1

 

 

 

 

01

 

 

 

 

Unknown public identifier

 

 

 

 

06

 

 

 

 

Charset UTF-8

 

 

 

 

00

 

 

 

 

string table length

 

 

 

 

45

 

 

 

 

CHARACTERISTIC_LIST with content tag

 

 

 

 

C6

 

 

 

 

CHARACTERISTIC with content and

 

 

 

attributes

 

 

 

tag

 

 

 

 

 

 

7F

 

 

 

 

书签属性。

 

 

 

在规范8.2章节定义的

 

 

 

TYPE=BOOKMARK

 

 

 

对应的binary7F

 

 

 

 

 

 

 

01

 

 

 

 

属性定义结束

 

 

 

 

87

 

 

 

 

PARM with attributes

 

 

 

 

15

 

 

 

 

NAME=NAME

 

 

 

 

11

 

 

 

 

VALUE

 

 

 

 

03

 

 

 

 

Inline string

 

 

 

 

E68891E79A84574150

 

 

 

 

“我的WAP”所对应的binary

 

 

 

 

00

 

 

 

 

End inline string

 

 

 

 

01

 

 

 

 

End(PARM)

 

 

 

 

87

 

 

 

 

PARM with attributes

 

 

 

 

17

 

 

 

 

NAME=URL

 

 

 

 

11

 

 

 

 

VALUE

 

 

 

 

03

 

 

 

 

Inline string

 

 

 

 

687474703A2F2F6D797761702E636F6D

 

 

 

 

“http://mywap.com”所对应的binary

 

 

 

 

 

 

 

 

00

 

 

 

 

End inline string

 

 

 

 

01

 

 

 

 

End(PARM)

 

 

 

 

01

 

 

 

 

end (CHARACTERISTIC)

 

 

 

 

01

 

 

 

 

end (CHARACTERISTIC_LIST)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值