旁观者

参与软件开发这些年来,不断地遇到新领域新知识点,屡屡感受到新进入者的迷惑和彷徨,所以对遇到的每一个问题都详细记录问题现象、解决思路以及解决方案,并在blog中留下印迹,以备他日有心人google之而知之。
你们的新手之痛,你们的新业务发展之初的思路混沌,我都感同身受,所以欢迎和我一起探讨这些话题,诸如Semantic/NLP/Mashup/J2ME/IVR/SMS/WAP/Python等,知无不言言无不尽。
posts - 538, comments - 970, trackbacks - 39, articles - 1
   ::  ::  ::  :: 订阅 订阅 :: 管理
 

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

编写者

日期

关键词

郑昀@ultrapower

2005-9-5

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

源代码: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)

 

小结

利用本文档提供的源代码,您可以轻松发送一个OTA书签短信给您的手机。

 

编写者

日期

关键词

郑昀@ultrapower

2005-9-5

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

 源代码http://www.cnblogs.com
/Files/zhengyun_ustc/otasms.rar(不能下载的话,请来信)

Feedback

#1楼  回复 引用   

2005-11-14 15:10 by 菠萝莫[未注册用户]
高人啊,不得不拜

#2楼  回复 引用   

2005-12-15 16:55 by funnyking[未注册用户]
老大,你的代码下载不了啊,同时也发送不成功,发送后,内容是空的,什么东西也没有?怎么回事啊?

#3楼[楼主]  回复 引用 查看   

2005-12-15 18:39 by 让变化成为计划的一部分      
http://www.cnblogs.com/Files/zhengyun_ustc/otasms.rar,可以下载的,多试几遍即可。

同时,请注意,OTA settings是Nokia - Ericsson定义的规范,所以其他厂商的手机可能无法解析。有问题可以和我Google Talk。

#4楼[楼主]  回复 引用 查看   

2005-12-15 18:44 by 让变化成为计划的一部分      
不过我不明白你既然能够“发送后,内容是空的”,怎么还“代码下载不了”?otasms.rar里面不就既有code也有release winform还有word文档吗?请理顺您的逻辑。

#5楼  回复 引用   

2005-12-16 09:15 by funnyking[未注册用户]
我没下载你的代码我只是用了0B0504C34FC002000304010101062C1F2A6170706C69636174696F6E2F782D
7761702D70726F762E62726F777365722D73657474696E67730081EA01016A
0045C67F0187151103E68891E79A8477617000018717110387687474703A2F2F6
D797761702E636F6D00010101 你的这段代码,我看了,好像只是将Nokia里面的书签功能分出来而已,结果,只是收到服务设置的信息,可是看不到书签,而且我用Nokia的例子也只是更改主页设置,书签也不起作用

#6楼  回复 引用   

2005-12-16 09:25 by funnyking[未注册用户]
老大,我只是跟你探讨一下啦,呵呵,^_^,不过好像用索尼的手机可以耶,奇怪!!!!!!

#7楼  回复 引用   

2005-12-24 18:35 by mywap[未注册用户]
请问各位,有没有用短信设置手机的主页?能不能用中文,我的出现乱马为什么?

#8楼[楼主]  回复 引用 查看   

2005-12-24 21:23 by 让变化成为计划的一部分      
第一,手机没有主页这一概念;只有书签的概念,而本文就是讲如何用短信OTA模式设置手机的书签;
第二,书签是可以用中文的;
第三,你的乱码和你的代码或者机型有关。

#9楼  回复 引用   

2006-03-24 14:44 by 孤独水手[未注册用户]
谢谢!我可以参考用于发送彩信。

#10楼  回复 引用   

2006-08-16 09:48 by by[未注册用户]
WSP那部分的数据中,81
charset (well known PARM.(short

integer))

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

headers)

这两个数据是怎么出来的,应该参考哪个文档?我好象在WAP-230-WSP-20010705里没找到具体的定义表

#11楼[楼主]  回复 引用 查看   

2006-08-16 17:24 by 让变化成为计划的一部分      
不知道。我是看nokia的文档。

#12楼  回复 引用   

2006-09-06 13:44 by mouse[匿名][未注册用户]
代码打开后提示部分文件CRC校验失败。
! C:\Documents and Settings\onwer\桌面\otasms.rar: [SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签.doc CRC 失败。文件被破坏
! C:\Documents and Settings\onwer\桌面\otasms.rar: OTA_service_settings_example_v11.pdf CRC 失败。文件被破坏
! C:\Documents and Settings\onwer\桌面\otasms.rar: OTA_settings_general_7_0.pdf CRC 失败。文件被破坏

能否把文件MAIL给我?howardcodd@163.com

#13楼[楼主]  回复 引用 查看   

2006-09-06 17:18 by 让变化成为计划的一部分      
多下载几遍,肯定没问题的

#14楼  回复 引用   

2006-09-12 13:19 by mouse[匿名][未注册用户]
发现下载的文件没有问题,是WINRAR用最新的版本解压就OK了。谢谢。
请问,是否需要.NET框架支持?我的电脑没有这个东西。

#15楼  回复 引用   

2006-09-14 00:39 by mouse[匿名][未注册用户]
请问,其他型号的手机的WAP PUSH怎么实现呢?我试验过所有网上可以找的例子,只有你这个例子可以使得我的手机可以收到短信,可是是乱码.我的手机是MOTO A780。

#16楼[楼主]  回复 引用 查看   

2006-09-14 21:41 by 让变化成为计划的一部分      
本例子不支持摩托罗拉手机。

#17楼  回复 引用   

2006-10-01 09:36 by lguo[未注册用户]
Motorola手机是不是采用“OMA-ERP-ClientProvisioning-V1_1-20050428-C”

#18楼  回复 引用   

2006-10-01 22:18 by eiei[未注册用户]
好东东,老大,加我,GMail呀
我加你了,汗,回我,呵
cx140ster@gmail.com

#19楼  回复 引用   

2007-02-07 00:44 by joee[未注册用户]
我想请教几个很简单的问题:java程序是否可以通过sms给手机发送短信呢?能否介绍一下UltraBinarySMS类?

#20楼[楼主]  回复 引用 查看   

2007-02-08 15:43 by 让变化成为计划的一部分      
to joee:
just browse this link>>
http://www.google.cn/search?complete=1&hl=zh-CN&rls=GGLJ%2CGGLJ%3A2006-35%2CGGLJ%3Aen&q=wma%2Bsms&btnG=Google+%E6%90%9C%E7%B4%A2&meta=lr%3Dlang_zh-CN

#21楼  回复 引用   

2007-03-14 10:29 by DH[未注册用户]
你的二进制码里在
“687474703A2F2F6D797761702E636F6D “http://mywap.com”所对应的binary ”的前面有一个87

可是从WBXML协议中看,没有这个87呀。

#22楼  回复 引用   

2007-05-10 17:55 by DK[未注册用户]
http://219.238.168.183/SendBinarySMS/sendsms.asmx?wsdl”无效,请问有变动吗?谢谢!

#23楼[楼主]  回复 引用 查看   

2007-05-10 23:52 by 让变化成为计划的一部分      
服务器不在了。您可以用其他的短信服务发送此二进制短信。

#24楼  回复 引用   

2007-05-15 10:27 by DK[未注册用户]
你好,我直接发送以下代码:0B0504C34FC002000304010101062C1F2A6170706C69636174696F6E2F782D
7761702D70726F762E62726F777365722D73657474696E67730081EA01016A
0045C67F0187151103E68891E79A8477617000018717110387687474703A2F2F6
D797761702E636F6D00010101,没有收到短信。我用的是Nokia6230+USB数据线,PDU编码方式。请问发送时还有什么需要注意的吗?

#25楼  回复 引用   

2007-05-20 00:13 by 李坚[未注册用户]
你好,我看到WDP层的编码资料有两种,这两种都一样吗?怎么开头的长度 有【0B】的也有【06】的,到底那种是正确的?

第一种:
0B WAP PUSH头部的总长度
05040B8423F0表示接下来是一个WAP PUSH
第二种:
06   'User Data Header Length (6 bytes)
05   'UDH Item Element id (Port Numbers)
04   'UDH IE length (4 bytes)
0B 84  'destination port number
23 F0  'origin port number

#26楼  回复 引用 查看   

2007-11-27 23:29 by 艾奥理斯      
我是很菜的,下了您的文件之后还是看不懂,是不是要有自己的OTA服务器,我想把它应用到我的WAP网站,具体要做些什么步聚,请高人指点!

#27楼[楼主]  回复 引用 查看   

2007-11-28 01:41 by 旁观者      
汗,既然您都已经说了你的水平,那就还是别自己干了,让第三方服务商做不就完了吗?OTA是要发送短信的,您就算架设了一个不管用的OTA Server,发不了短信,又能如何呢?还是让别人做吧。

#28楼  回复 引用   

2008-01-21 14:40 by 清风小号[未注册用户]
实际试了下,对于udh彩用0B的这种情况,在有些手机上网关应答deliver,但实际手机并没有任何反应,可能是由于手机型号,但对于udh采用06这种情况,目前测试兼容性比较好,在几款手机上都正常,但只能发送140字节以内信息.以上通过cmpp3协议发送,直连的网管中心,至于为什么0B到手机上没反应,原因不明.希望碰到过的朋友指点一下.

#29楼  回复 引用   

2008-01-21 14:41 by 清风小号[未注册用户]
谁做过超长的push信息给正常下行,并且兼容性比较好,麻烦给指点下..

#30楼[楼主]  回复 引用 查看   

2008-01-21 19:34 by 旁观者      
这里又不是论坛,几百年过一次,你这么留言,什么时候才能有人给你指点呢?

#31楼  回复 引用   

2008-01-29 08:45 by LZD[未注册用户]
一定要拜!高人!

#32楼  回复 引用   

2008-01-29 09:16 by LZD[未注册用户]
http://www.cnblogs.com/Files/zhengyun_ustc/otasms.rar大哥!這個不能下載?

#33楼[楼主]  回复 引用 查看   

2008-01-29 12:25 by 旁观者      
to LZD :
耐心,使劲下!

#34楼  回复 引用   

2008-06-18 16:51 by Gool[未注册用户]
你好,在你的文章中提到的 OTA setting 應該是指 Nokie/Ericsson 所制定的OTA 規格,那是否也代表著 OMA 所制定的 OTA 規格完全和它不相符呢?

另外,Windows Mobile 所支援的好像是 OMA 的規格,那您有嘗試在Windows Mobile 上面測試您的程式嗎?

#35楼[楼主]  回复 引用 查看   

2008-06-18 21:23 by 旁观者      
抱歉,从来就没摸过WindowsMobile系统的手机,可能略摸看过几眼。

#36楼  回复 引用   

2008-12-09 11:09 by Kinson[未注册用户]
现在好像不能发送了