天天看点

[OTA]制作OTA短信来配置手机与服务器同步

编写者

日期

关键词

郑昀@ultrapower

2005-9-26

sms ota 同步 空中下载 手机 wdp wsp wbxml sync4j 同步设置

  <b>本文档讲解了</b><b>ota</b><b>的概念,给出了如何发送“同步设置”的</b><b>ota</b><b>短信的步骤,并附带</b><b>java</b><b>编写的源代码</b><b>(http://files.cnblogs.com/zhengyun_ustc/syncsettingbuilder.rar)</b><b>。</b><b></b>

<b></b>

ota,即over the air,国内翻译为空中下载。

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

<a href="https://secure.forum.nokia.com/main/1,6566,1_47_50_10,00.html">https://secure.forum.nokia.com/main/1,6566,1_47_50_10,00.html</a>

你可以看到许多nokia - ericsson ota documents。

下载ota setting规范:

<a href="http://sw.nokia.com/id/3377eb33-cb1d-490e-a1cb-8735d785e1d3/ota_settings_general_7_0.pdf">http://sw.nokia.com/id/3377eb33-cb1d-490e-a1cb-8735d785e1d3/ota_settings_general_7_0.pdf</a>

下载ota setting示范:

<a href="http://sw.nokia.com/id/bf5f034f-be06-4506-87b7-22788de5c316/ota_service_settings_example_v11.pdf">http://sw.nokia.com/id/bf5f034f-be06-4506-87b7-22788de5c316/ota_service_settings_example_v11.pdf</a>

规范中定义了三种setting:

l         浏览器设置

l         浏览器的书签设置

l         syncml设置

也就是说,你通过发送短信可以帮助用户手机设置syncsettings,从而可以让手机与服务器同步信息(如电话本、日程和记事本等)。

手机无线同步服务--无忧通讯录,支持syncml,最专业的手机号簿备份服务:

<a href="http://www.51txl.com:8080/51txl/">http://www.51txl.com:8080/51txl/</a>

<a href="http://wapapps0.163.com/wap/otasetting.jsp?type=all"></a>

它提供的服务还是非常简单易用的:“无忧通讯录是一种方便使用的无线同步服务,它可以安全地将您手机上的电话簿备份到网络上。假如您的手机丢掉了、被偷或者损坏,这时您不用着急,无忧通讯录上保存有您的电话簿可立即被恢复,而且所有的操作都可方便地在无线状态下完成。”

       注册它的时候,它给你的手机上发送一个短信“同步设置”,你用“存入设置”菜单命令保存这个短信到同步菜单里,这样你就可以利用这同步设置和她的服务器端做数据同步了。

我们下面具体讲解一下“同步设置”的ota短信生成办法。

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

首先,你需要构造出这样的sync settings xml,如下所示:

<b>sync settings xml</b><b></b>

  &lt;version&gt;1.0&lt;/version&gt;

  &lt;hostaddr&gt;http://10.18.168.183:8080/sync4j/sync&lt;/hostaddr&gt;

  &lt;port&gt;80&lt;/port&gt;

  &lt;cttype&gt;text/x-vcard&lt;/cttype&gt;

  &lt;ctver&gt;2.1&lt;/ctver&gt;

  &lt;uri&gt;./scard&lt;/uri&gt;

  &lt;name&gt;sync4j&lt;/name&gt;

  &lt;authscheme&gt;1&lt;/authscheme&gt;

  &lt;username&gt;guest&lt;/username&gt;

  &lt;cred /&gt;

  &lt;/auth&gt;

  &lt;/remotedb&gt;

  &lt;authlevel&gt;2&lt;/authlevel&gt;

  &lt;contype&gt;1&lt;/contype&gt;

  &lt;refid&gt;4jsvr&lt;/refid&gt;

  &lt;/conref&gt;

  &lt;/syncsettings&gt;

其次,对这个xml文档,通过以下代码转译为wbxml:

<b>otamessage</b><b>的构造过程</b><b></b>

file xmldir = new file("c:\\opt\\xml\\sync4jsyncsettings.xml");

            string xml = iotools.readfilestring(xmldir);

            syncsettingwriter writer = new syncsettingwriter();

            vwriter.addelement(writer);

            xmlparser xmlp = new xmlparser(new stringreader(xml));

            // 遍历xml解析

            traversexml(xmlp);

            /*

             * 对于vector中的每一个writer都做关闭动作

             */

            int nindex = 0;

            for(syncsettingwriter writersync : vwriter)

            {

                nindex++;

                writersync.close(vwriter.size(), nindex);

                system.out.println(encodehex(writersync.getbytes()));

            }

上面的代码最后来打印出了短信二进制内容,比如:

第一个短信包:

0b0504c34cc002000304<b>0201</b>0106060502020b81ea01016a00555803312e30000150036

87474703a2f2f3231392e3233382e3136382e3138333a383038302f73796e63346a2f73796e6

30001520338300001544e03746578742f782d766361726400014f03322e31000156032e2f73636

172640001510373796e63346a000147490331000157037a68656e6779756e0001

其中的“<b>0201</b>”代表共有两个短信包,这是第一个包;

第二个短信包:

0b0504c34cc002000304<b>0202</b>4d010101510353796e63346a000147480332000149033

1000157037a68656e6779756e00014d01014b4c033100015303346a53767200010101

其中的“<b>0202</b>”代表共有两个短信包,这是第二个包;

这样,手机收到这两个包之后,就知道按照顺序组合到一起,然后再解析了。

下面,我们来铺垫:

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

发送短信,可以通过

<b>ultrabinarysms</b><b></b>

ultrabinarysms.sendsms sendsms = new ultrabinarysms.sendsms();

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

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

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

l         wdp layer的包头;

l         wsp layer的包头;

l         wbxml。

同步syncsettings xml的真正内容是用wbxml表述的。

什么是wdp和wsp呢?。

wdp即wireless datagram protocol。wsp即wireless session protocol。

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-&gt;ip,

n         wtp-&gt;tcp,

n         wtls-&gt;ssl/tls,

n         wsp-&gt;http,

n         wml-&gt;html。

       这时你可以参考

<a href="http://www.protocols.com/pbook/images/wapstack.gif">http://www.protocols.com/pbook/images/wapstack.gif</a>

,the osi model for wireless communication。

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

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

       2).能力协商

       3).会话状态长期保存

       4).会话挂起和恢复

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

       等等。

在我们的ota实现中,wsp header其实就是声明两个内容:pdu type和mime type;至于wdp,就是声明一个端口号,并说明本数据包是整条短信的第几个包。

wbxml,就是wap binary xml。

简单地说,它就是一个定义好的xml片断,可以表述出同步服务器地址、远程数据库名称、登录账号等等内容。

比如,这样一个实例:

<b>nokia</b><b>给出的</b><b>syncsettings</b><b>例子</b><b></b>

<b>&lt;syncsettings&gt;</b>

<b>   &lt;version&gt;1.0&lt;/version&gt;</b>

<b>   &lt;hostaddr&gt;http://www.syncserver.com/sync&lt;/hostaddr&gt;</b>

<b>   &lt;port&gt;8080&lt;/port&gt;</b>

<b>   &lt;remotedb&gt;</b>

<b>      &lt;cttype&gt;text/x-vcard&lt;/cttype&gt;</b>

<b>      &lt;ctver&gt;2.1&lt;/ctver&gt;</b>

<b>      &lt;uri&gt;./contacts?class=private&lt;/uri&gt;</b>

<b>      &lt;name&gt;private contact db&lt;/name&gt;</b>

<b>      &lt;auth&gt;</b>

<b>         &lt;authscheme&gt;1&lt;/authscheme&gt;</b>

<b>         &lt;username&gt;james&lt;/username&gt;</b>

<b>         &lt;cred&gt;chdk&lt;/cred&gt; &lt;!-- base64 coded 'pwd' --&gt;</b>

<b>      &lt;/auth&gt;</b>

<b>   &lt;/remotedb&gt;</b>

<b>      &lt;cttype&gt;text/x-vcalendar&lt;/cttype&gt;</b>

<b>      &lt;ctver&gt;1.0&lt;/ctver&gt;</b>

<b>      &lt;uri&gt;./calendar&lt;/uri&gt;</b>

<b>      &lt;name&gt;calendar db&lt;/name&gt;</b>

<b>   &lt;name&gt;pim service&lt;/name&gt;</b>

<b>   &lt;auth&gt;</b>

<b>      &lt;authlevel&gt;2&lt;/authlevel&gt;</b>

<b>      &lt;authscheme&gt;1&lt;/authscheme&gt;</b>

<b>      &lt;username&gt;james&lt;/username&gt;</b>

<b>      &lt;cred&gt;ym9uza==&lt;/cred&gt; &lt;!-- base64 coded 'bond' --&gt;</b>

<b>   &lt;/auth&gt;</b>

<b>      &lt;authlevel&gt;1&lt;/authlevel&gt;</b>

<b>      &lt;username&gt;bond&lt;/username&gt;</b>

<b>   &lt;conref&gt;</b>

<b>      &lt;contype&gt;1&lt;/contype&gt;</b>

<b>      &lt;refid&gt;my ap&lt;/refid&gt;</b>

<b>   &lt;/conref&gt;</b>

<b>&lt;/syncsettings&gt;</b>

很简单不是吗?

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

nokia是这么定义转换规则的,很简单,就是尽可能简短地用一个字符表示某一个元素。

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

我们还提供了一个公开的web service:

<a href="http://219.238.168.183/sendbinarysms/sendsms.asmx?wsdl">http://219.238.168.183/sendbinarysms/sendsms.asmx?wsdl</a>

<b>web service</b><b>介绍</b><b></b>

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

填写二进制短信的hex ascii文本内容。比如“0b0504c34fc0020003040202296a0101860711036874”之类的。具体要填写的内容,请参考我的otasms工程,它会帮助你生成要发送的二进制内容。

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

利用本文档提供的源代码,您可以将一个syncsettings xml文档翻译为发送到手机上的二进制内容,并可以自动分包。手机收到之后,就可以存入同步设置,与你所指定的服务器进行同步了。