编写者
日期
关键词
郑昀@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>
<version>1.0</version>
<hostaddr>http://10.18.168.183:8080/sync4j/sync</hostaddr>
<port>80</port>
<cttype>text/x-vcard</cttype>
<ctver>2.1</ctver>
<uri>./scard</uri>
<name>sync4j</name>
<authscheme>1</authscheme>
<username>guest</username>
<cred />
</auth>
</remotedb>
<authlevel>2</authlevel>
<contype>1</contype>
<refid>4jsvr</refid>
</conref>
</syncsettings>
其次,对这个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->ip,
n wtp->tcp,
n wtls->ssl/tls,
n wsp->http,
n wml->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><syncsettings></b>
<b> <version>1.0</version></b>
<b> <hostaddr>http://www.syncserver.com/sync</hostaddr></b>
<b> <port>8080</port></b>
<b> <remotedb></b>
<b> <cttype>text/x-vcard</cttype></b>
<b> <ctver>2.1</ctver></b>
<b> <uri>./contacts?class=private</uri></b>
<b> <name>private contact db</name></b>
<b> <auth></b>
<b> <authscheme>1</authscheme></b>
<b> <username>james</username></b>
<b> <cred>chdk</cred> <!-- base64 coded 'pwd' --></b>
<b> </auth></b>
<b> </remotedb></b>
<b> <cttype>text/x-vcalendar</cttype></b>
<b> <ctver>1.0</ctver></b>
<b> <uri>./calendar</uri></b>
<b> <name>calendar db</name></b>
<b> <name>pim service</name></b>
<b> <auth></b>
<b> <authlevel>2</authlevel></b>
<b> <authscheme>1</authscheme></b>
<b> <username>james</username></b>
<b> <cred>ym9uza==</cred> <!-- base64 coded 'bond' --></b>
<b> </auth></b>
<b> <authlevel>1</authlevel></b>
<b> <username>bond</username></b>
<b> <conref></b>
<b> <contype>1</contype></b>
<b> <refid>my ap</refid></b>
<b> </conref></b>
<b></syncsettings></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文档翻译为发送到手机上的二进制内容,并可以自动分包。手机收到之后,就可以存入同步设置,与你所指定的服务器进行同步了。