SyncML 简介
姜君
蓝点软件北京研发中心工程师
内容:
SyncML协议简述
SyncML 底层通讯
SyncML同步协议
SyncML表示协议
SyncML 参考工具包
相关资源
作者
目前在嵌入式系统与其他通信设备的数据同步方面,业界还没有统一的标准、协议。为了解决这个问题,IBM、Lotus、Motorola、Nokia、Palm Inc、Psion、Starfish Software已经形成了SyncML协议的标准草案。这个草案将会发展成为一个通用的可以被用在工业界的同步协议。本文简单介绍了SyncML协议与应用该协议的工具包。
1 SyncML协议简述
目前,移动计算和通信设备的流行很大部分原因是因为它们具有一些方便的功能,比如说在需要时可以发送信息给其他用户,用户希望随时随地都可以利用掌上设备访问信息和执行应用程序,甚至在飞行中也可以获得和更新信息。
具有在一台掌上设备运行应用程序和处理信息、还可以将应用程序和信息的更新同步回到办公室的设备或者网上的这种能力对于普遍、离线计算的效用和流行是一个关键。
遗憾的是,到今天为止还有两种方式没有实现:
支持任何移动设备同步的网络数据
支持同步人和网络数据的移动设备
这样一来,需要为移动设备增加很多用来同步不同的,尽可能多的数据所需要的协议,这些协议中的每一个仅适用于在一个选定的设备子集上进行选定的传输和运行,并且可以访问一部分网络数据,单一同步标准的缺乏为最终用户、设备制造商、应用程序开发者和设备提供商制造了很多问题
SyncML是一个新的标准,为了开发一个简单、通用的可以用于工业界方面的数据同步协议,推进这个标准的有IBM、Lotus、Motorola、Nokia、Palm Inc、Psion、Stafish Software。其他的公司、企业不断的被补充进来。
1.1 通用同步协议的优点
下面让我们看看适合工业界范围的数据同步协议对于每组角色的有益之处。
1. 最终用户:今天移动设备用户可能在每一种设备上使用了不同的同步产品。这样就会,有一种程序用来在膝上电脑和网络数据之间同步文件,另一种用来同步掌上电脑的日历,还有远程email访问,每一种技术只能用来同步少数应用程序或者被限制成特殊类型的网络连接。这种安排安装昂贵、配置和操作复杂、管理昂贵。使用SyncML,用户可以购买可以使用广泛的数据类型的设备。
2. 设备制造商:当每一个设备制造商想要支持这种能支持所有用户和服务提供商进行数据访问的技术。实际上一个设备会支持一种数据同步技术。这种选择迫使制造商压缩存储空间、内存、电源的用量和消耗。设备制造商会从通用的协议中获得好处,这种通用的协议使设备共同使用广泛的应用程序、服务、网络和传输技术。
3. 服务提供商:正在进入快速增长的应用程序舞台的服务提供商非常关注这样一个现象,即同步技术的增多会使在有效的成本下扩展用户和支持用户成为不可能。现在服务提供商已经支持一定范围的数据类型和应用中的设备;还必须安装、配置多种服务的基础结构,维护和支持这些基础结构,并且保证兼容性和性能。现在可选的是利用单独的数据连通方案,陷入了避免紧密结合的私有解决方案。使用SyncML,将会使提供支持广阔的应用程序的连接成为可能。
4. 应用程序开发者:选择支持多种同步技术可以使应用程序支持更多的设备类型 和网络数据,但是这种选择有一些浪费。为了保持向下兼容性开发者失去了选择网络数据仓库的灵活性,这也会增加程序开发的消耗和最终产品的复杂性。增加了复杂性的网络数据仓库对服务供应商的安装和采用是一个障碍。使用SyncML,可以开发能连接更多设备集合和网络数据的应用程序。
1.2 通用同步协议的描述
通用同步协议的目标是普遍适用,同步两端可以是任何一种类型、在任一种网络上面,这样会:
同步网络数据与任一种移动设备
同步移动设备与任一种网络数据
数据同步协议会同步网络数据和很多不同的设备,包括掌上电脑、移动电话、自动计算机和桌面计算机。一个用户可以在不同的设备上访问、操作同样的数据集合,举个例子,用户可以使用掌上设备或者移动电话阅读电子邮件,还可以维护一个一致的、更新的纪录。
同样的,同步两端可以使用任意类型,这使得移动设备可以支持更多数据类型,包括电子邮件、日历、事务管理信息、数据库中的企业数据和Web文档。这种功能使得想要通过电子邮件接收订单的用户可以在同样的设备上访问公司的目录清单系统,用来最后决定交付日期。
实现这个目标,协议需要下列特性:
可以有效的在有线和无线网络上运作
支持多种传输协议
支持任意的网络数据
可由多种应用程序访问
考虑到移动设备的资源限制
构造于现有的全球互联网和Web技术之上
协议最小功能就是赋予所有设备最常用的同步能力
2 SyncML 底层通讯
2.1 绑定Http
2.1.1 Tcp 传输服务
Http通信一般是在 Tcp连接之上的,这个绑定不是必需的,如果Http基于其它的协议,那么需求也和下面Tcp定义的相似
2.1.1.1 连接
在Http客户端连接到Http服务器端的时候,SyncML客户端建立一个Tcp连接在客户和服务器之间通过使用Tcp open操作,在超时的情况下还需要SyncML客户端从新建立连接。
2.1.1.2连接选项
关于端口和协议版本的一些选项。
2.1.1.3 断开连接
当连接不需要的时候,SyncML客户端负责使用tcp close操作结束连接。如果固定连接存在于Http请求中,Http连接的关闭有Http客户端来完成,当Http客户端接收到来自服务器的Http应答中指明这是最后一个SyncML的包。
2.1.1.4 终止
有时候非正常时间发生会要求应用程序中断Tcp连接,这种情况下,Tcp从新初始化来结束当前连接。
2.1.1.5 超时
当服务器超时,SyncML客户端需要重建一个新的HTTP会话并且Http服务器端会尝试从新发送当前的SyncML包
2.1.2. SyncML信息交换
一旦Http连接建立,一个或者多个SyncML消息会通过连接由SyncML客户端传输,它们存在于Http客户端的请求或者Http服务器端的应答中。
在Http请求中POST方法用来传递SyncML消息。
2.1.2.1 每包一个消息
下面是Http请求的部分代码:
POST ./servlet/syncit HTTP/1.1
Host: www.datasync.org
Content-Type: application/vnd.syncml-xml; charset="utf-8"
Content0Length: 1023
Accept: application/vnd.syncml-xml
下面是Http应答的部分代码:
HTTP/1.1 200 ok
Content-Type: application/vnd.syncml-wbxml; charset="utf-8"
Content-LengthL 1023
--HTTP body---
2.1.2.2 一个包里包含多个消息
每一个Sync消息必须使用SyncML MIME媒体类型在HTTP请求或应答中传递,当每个包里有多个SyncML消息的时候,每一个消息是否在分离的HTTP请求或应答传递依赖于它是否是SyncML的请求和应答。可以根据每一个SyncML消息是否有最后一个元素来判断这个包中是否有更多的SyncML消息,如够有最后一个元素,那么这消息就是该包中最后一个消息。
2.1.3 传输命令
HTTP使用一系列的命令,包括传输方法,头部信息,请求的头部信息,应答的头部信息
2.1.3.1 传输方法
SyncML客户端必须使用POST方法或者可以使用CONNECT方法(如果支持的话)来给SyncML服务器发送SyncML请求。CONNECT方法用来初始化SSL会话以验证HTTP客户和服务器,其他的方法目前没有用在SyncML客户端。
2.2 绑定Obex
2.3 绑定Wsp
3 SyncML同步协议
3.1 动机:
表示协议并不足够来实现信息的交互性
可以在多种设备之间传输多种格式的数据
3.2 设计原则
满足网络延迟的需要
满足各种设备
满足现有的各种储存模式
满足多种安全需求
多种使用模式
3.3 Sync 类型
3.3.1双向同步
客户端和服务器端双向传输信息
在特殊情况下采用Slow sync 作为传输模式
3.3.2 客户端单向同步
只有客户端提出修改信息
特殊情况下,数据可以被输出
3.3.3 服务器端单向同步
只有服务器端提出修改信息
特殊情况下,数据可以被输入
3.3.4 服务器端通告
同步要求从服务器端传到客户端
3.3.5 双向同步例子
日历的同步传输
客户端的认证请求被接受
客户端传送两条信息
服务器端传送一条信息
服务器端和客户端的数据一致会立刻完成
下面是一个例子,描述同步传输的大体过程。同步传输有七种方式,下面的例子是双向传输,最复杂的一种。首先进行初始的准备工作,然后进行传输,再进行确认。
3.3.5.1客户端发出同步请求
<SyncML>
相当于同步的头文件,基本为固定模式
<SyncHdr>
<VerDTD>1.0</VerDTD>
<VerProto>SyncML/1.0</VerProto>
<SessionID>1</SessionID>
<MsgID>1</MsgID>
同步初始化时数值为一,相当于第几个回合
目标地址
<Target><LocURI>http://www.syncml.org/sync-server</LocURI></Target>
源地址
<Source><LocURI>IMEI:493005/10/059280/0</LocURI></Source>
认证
<Cred> <!--The authentication is optional.-->
认证模式
<Meta><Type xmlns=''syncml:metinf''>syncml:auth-basic</Type></Meta>
相当于密码
<Data>dXNlcmlkOnBhc3N3b3Jk=</Data> <!--base64 formatting of "userid:password"-->
</Cred>
<Meta> <!--The Meta is now used to indicate the maximum SyncML message size, which
client can receive.-->
<mi:MaxMsgSize xmlns:mi=''syncml:metinf''>5000</mi:MaxMsgSize>
</Meta>
</SyncHdr>
头文件结束
<SyncBody>
唤醒对方,相当于发出信号
<Alert>
<CmdID>1</CmdID>
命令ID为1
<Data>200</Data> <!-- 200 = TWO_WAY_ALERT -->
共有七种连接方式,200代表其中一种
<Item>
<Target><LocURI>./contacts/james_bond</LocURI></Target>
进行操作的目标和地址,相当于数据库
<Source><LocURI>./dev-contacts</LocURI></Source>
<Meta>
相当于认证
<Anchor xmlns=''syncml:metinf''>
<Last>234</Last>
<Next>276</Next>
</Anchor>
</Meta>
</Item>
</Alert>
上传
<Put>
<CmdID>2</CmdID>
<Meta><Type xmlns=''syncml:metinf''>application/xml</Type></Meta>
固定的格式
<Item>
<Source><LocURI> devinf10</LocURI></Source>
固定的格式
<Data>
<DevInf xmlns=''syncml:devinf''>
相当于本地的数据描述
<Man>Big Factory, Ltd.</Man>
<Mod>4119</Mod>
<OEM>Jane''s phones</OEM>
<FwV>2.0e</FwV>
<SwV>2.0</SwV>
<HwV>1.22I</HwV>
<DevId>1218182THD000001-2</DevId>
<DevTyp>phone</DevTyp>
<DataStore>
<SourceRef>./contacts</SourceRef>
<DisplayName>Phonebook</DisplayName>
<MaxGUIDSize>32</MaxGUIDSize>GUID
相当于索引
<Rx-Pref>
<CTType>text/x-vcard </CTType>
<VerCT>2.1</VerCT>
</Rx-Pref>
<Tx-Pref>
<CTType>text/x-vcard</CTType>
<VerCT>2.1</VerCT>
</Tx-Pref>
数据存储能力
<DSMem>
<MaxMem>32650</MaxMem>
<MaxID>250</MaxID>
<FreeMem>22430</FreeMem>
<FreeID>122</FreeID>
</DSMem>
</DataStore>
<CTCap>
<CTType>text/x-vcard</CTType>
<PropName>BEGIN</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>END</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>VERSION</PropName>
<ValEnum>2.1</ValEnum>
<PropName>N</PropName>
<PropName>TEL</PropName>
<ParamName>VOICE</ParamName>
<ParamName>CELL</ParamName>
</CTCap>
<SyncCap>
<SyncType>01</SyncType>
<SyncType>02</SyncType>
</SyncCap>
</DevInf>
</Data>
</Item>
</Put>
<Get>
<CmdID>3</CmdID>
<Meta><Type xmlns=''syncml:metinf''>application/xml</Type></Meta>
<Item>
<Target><LocURI> devinf10</LocURI></Target>
</Item>
</Get>
<Final/>
</SyncBody>
</SyncML>
3.3.5.2服务器端发出同步请求
<SyncML>
头文件
<SyncHdr>
<VerDTD>1.0</VerDTD>
<VerProto>SyncML/1.0</VerProto>
<SessionID>1</SessionID>
<MsgID>1</MsgID>
<Target><LocURI>IMEI:493005/10/059280/0</LocURI></Target>
<Source><LocURI>http://www.syncml.org/sync-server</LocURI></Source>
<Cred> <!--The authentication is optional.-->
<Meta><Type xmlns=''syncml:metinf''>syncml:auth-basic</Type></Meta>
<Data>dXNlcmlkOnBhc3N3b3Jk=</Data> <!--base64 formatting of "userid:password"-->
</Cred>
</SyncHdr>
<SyncBody>
相当于回复客户端请求
回复头文件
<Status>
<MsgRef>1</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd>
<TargetRef>http://www.syncml.org/sync-server</TargetRef>
<SourceRef>IMEI:493005/10/059280/0</SourceRef>
212代表正常
<Data>212</Data> <!--Statuscode for OK, authenticated for session-->
</Status>
回复Alert
<Status>
<MsgRef>1</MsgRef><CmdRef>1</CmdRef><Cmd>Alert</Cmd>
<TargetRef>./contacts/james_bond</TargetRef>
<SourceRef>./dev-contacts</SourceRef>
<Data>200</Data> <!--Statuscode for OK-->
200代表正常
把认证对上,对方请求的值
<Item>
<Data><Anchor xmlns=''syncml:metinf''><Next>276</Next></Anchor></Data>
</Item>
</Status>
<Status>
回复Put
<MsgRef>1</MsgRef><CmdRef>2</CmdRef><Cmd>Put</Cmd>
<SourceRef> devinf10</SourceRef>
<Data>200</Data> <!--Statuscode for OK-->
</Status>
返回值,请求对方
<Results>
<MsgRef>1</MsgRef><CmdRef>3</CmdRef>
<Meta><Type xmlns=''syncml:metinf''>application/xml</Type></Meta>
固定格式
<Item>
<Source><LocURI>devinf10</LocURI></Source>
固定格式
<Data>
相当于数据描述
<DevInf xmlns=''syncml:devinf''>
<Man>Small Factory, Ltd.</Man>
<Mod>Tiny Server</Mod>
<OEM>Tiny Shop</OEM>
<DevId>485749KR</DevId>
<DevTyp>Server</DevTyp>
<DataStore>
<SourceRef>./contacts</SourceRef>
<DisplayName>Addressbook</DisplayName>
<Rx-Pref>
<CTType>text/x-vcard </CTType>
<VerCT>2.1</VerCT>
</Rx-Pref>
<Rx>
<CTType>text/vcard </CTType>
<VerCT>3.0</VerCT>
</Rx>
<Tx-Pref>
<CTType>text/x-vcard</CTType>
<VerCT>2.1</VerCT>
</Tx-Pref>
<Tx>
<CTType>text/vcard</CTType>
<VerCT>3.0</VerCT>
</Tx>
存储能力
<DSMem>
<MaxMem>132650</MaxMem>
<MaxID>1250</MaxID>
<FreeMem>122430</FreeMem>
<FreeID>1122</FreeID>
</DSMem>
</DataStore>
<CTCap>
<CTType>text/x-vcard</CTType>
<PropName>BEGIN</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>END</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>VERSION</PropName>
<ValEnum>2.1</ValEnum>
<PropName>N</PropName>
<PropName>TEL</PropName>
<ParamName>VOICE</ParamName>
<ParamName>CELL</ParamName>
<CTType>text/vcard</CTType>
<PropName>BEGIN</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>END</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>VERSION</PropName>
<ValEnum>3.0</ValEnum>
<PropName>N</PropName>
<PropName>TEL</PropName>
<ParamName>VOICE</ParamName>
<ParamName>FAX</ParamName>
<ParamName>CELL</ParamName>
<CTType>text/vcard</CTType>
<PropName>BEGIN</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>END</PropName>
<ValEnum>VCARD</ValEnum>
<PropName>VERSION</PropName>
<ValEnum>3.0</ValEnum>
<PropName>N</PropName>
<PropName>TEL</PropName>
<ParamName>VOICE</ParamName>
<ParamName>FAX</ParamName>
<ParamName>CELL</ParamName>
</CTCap>
<SyncCap>
<SyncType>01</SyncType>
<SyncType>02</SyncType>
<SyncType>07</SyncType>
</SyncCap>
</DevInf>
</Data>
</Item>
</Results>
进行双向传输,唤醒对方
<Alert>
<CmdID>1</CmdID>
<Data>201</Data> <!-- 201 = TWO_WAY_ALERT -->
<Item>
<Target><LocURI>./dev-contacts</LocURI></Target>
<Source><LocURI>./contacts/james_bond</LocURI></Source>
<Meta>
发送认证
<Anchor xmlns=''syncml:metinf''>
<Last>200005021T081812Z </Last>
<Next>200005022T093223Z </Next>
</Anchor>
</Meta>
</Item>
</Alert>
<Final/>
</SyncBody>
</SyncML>
3.3.5.3客户端提交数据
<SyncML>
<SyncHdr>
<VerDTD>1.0</VerDTD>
<VerProto>SyncML/1.0</VerProto>
<SessionID>1</SessionID>
<MsgID>2</MsgID>
<Target><LocURI>http://www.syncml.org/sync-server</LocURI></Target>
<Source><LocURI>IMEI:493005/10/059280/0</LocURI></Source>
</SyncHdr>
<SyncBody>
回复服务器的请求
<Status>
<MsgRef>1</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd>
<TargetRef>IMEI:493005/10/059280/0</TargetRef>
<SourceRef> http://www.syncml.org/sync-server </SourceRef>
<Data>212</Data> <!--Statuscode for OK, authenticated for session-->
</Status>
回复服务器的请求
<Status>
<MsgRef>1</MsgRef><CmdRef>1</CmdRef><Cmd>Alert</Cmd>
<TargetRef>./dev-contacts</TargetRef>
<SourceRef>./contacts/james_bond</SourceRef>
<Data>200</Data> <!--Statuscode for Success-->
<Item>
<Data>
Anchor回复对方请求的<next>值
<Anchor xmlns=''syncml:metinf''><Next>200005022T093223Z </Next></Anchor>
</Data>
</Item>
</Status>
<Sync>
<CmdID>1</CmdID>
<Target><LocURI>./contacts/james_bond</LocURI></Target>
<Source><LocURI>./dev-contacts</LocURI></Source>
<Meta>
存储能力
<DSMem xmlns=''syncml:devinf''>
<FreeMem>8100</FreeMem>
<!--Free memory (bytes) in Calendar database on a device -->
<FreeId>81</FreeId>
<!--Number of free records in Calendar database-->
</DSMem>
</Meta>
<Replace>
<CmdID>2</CmdID>
<Meta><Type xmlns=''syncml:metinf''>text/x-vcard</Type></Meta>
<Item>
<Source><LocURI>1012</LocURI></Source>
数据项地址
<Data><!--The vCard data would be placed here.--></Data>
</Item>
</Replace>
</Sync>
<Final/>
</SyncBody>
</SyncML>
3.3.5.4服务器端提交数据
<SyncML>
<SyncHdr>
<VerDTD>1.0</VerDTD>
<VerProto>SyncML/1.0</VerProto>
<SessionID>1</SessionID>
<MsgID>2</MsgID>
<Target><LocURI>IMEI:493005/10/059280/0</LocURI></Target>
<Source><LocURI>http://www.syncml.org/sync-server</LocURI></Source>
</SyncHdr>
<SyncBody>
回复客户请求
<Status>
<MsgRef>2</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd>
<TargetRef>http://www.syncml.org/sync-server</TargetRef>
<SourceRef>IMEI:493005/10/059280/0</SourceRef>
<Data>200</Data>
</Status>
回复Sync请求
<Status><!--This is a status for the client modifications to the server.-->
<MsgRef>2</MsgRef><CmdRef>1</CmdRef><Cmd>Sync</Cmd>
<TargetRef>./contacts/james_bond</TargetRef>
<SourceRef>./dev-contacts</SourceRef>
<Data>200</Data> <!--Statuscode for Success-->
</Status>
回复Replace
<Status>
<MsgRef>2</MsgRef><CmdRef>2</CmdRef><Cmd>Replace</Cmd>
<SourceRef>1012</SourceRef>
<Data>200</Data> <!--Statuscode for Success-->
</Status>
发出同步请求
<Sync>
<CmdID>1</CmdID>
<Target><LocURI>./dev-contacts</LocURI></Target>
<Source><LocURI>./contacts/james_bond</LocURI></Source>
<Replace>
<CmdID>2</CmdID>
<Meta><Type xmlns=''syncml:metinf''>text/x-vcard</type></Meta>
<Item>
<Target><LocURI>1023</LocURI></Target>
<Data><!--The vCard data would be placed here.--></Data>
</Item>
</Replace>
<Add>
<CmdID>3</CmdID>
<Meta><Type xmlns=''syncml:metinf''>text/x-vcard</type></Meta>
<Item>
<Source><LocURI>10536681</LocURI></Source>
<Data><!--The vCard data would be placed here.--></Data>
</Item>
</Add>
</Sync>
<Final/>
</SyncBody>
</SyncML>
3.3.5.5客户端显示数据更改情况
<SyncML>
<SyncHdr>
<VerDTD>1.0</VerDTD>
<VerProto>SyncML/1.0</VerProto>
<SessionID>1</SessionID>
<MsgID>3</MsgID>
<Target><LocURI>http://www.syncml.org/sync-server</LocURI></Target>
<Source><LocURI>IMEI:493005/10/059280/0</LocURI></Source>
</SyncHdr>
<SyncBody>
回复同步请求
<Status>
<MsgRef>2</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd>
<TargetRef>IMEI:493005/10/059280/0</TargetRef>
<SourceRef> http://www.syncml.org/sync-server </SourceRef>
<Data>200</Data>
</Status>
<Status>
<MsgRef>2</MsgRef><CmdRef>1</CmdRef><Cmd>Sync</Cmd>
<TargetRef>./dev-contacts</TargetRef>
<SourceRef>./contacts/james_bond</SourceRef>
<Data>200</Data>
</Status>
<Status>
<MsgRef>2</MsgRef><CmdRef>2</CmdRef><Cmd>Replace</Cmd>
<TargetRef>1023</TargetRef>
<Data>200</Data>
</Status>
<Status>
<MsgRef>2</MsgRef><CmdRef>3</CmdRef><Cmd>Add</Cmd>
<SourceRef>10536681</SourceRef>
<Data>200</Data>
</Status>
<Map>服务器和客户端的数据保持同步
<CmdID>1</CmdID>
<Target><LocURI>./contacts/james_bond</LocURI></Target>
<Source><LocURI>./dev-contacts</LocURI></Source>
<MapItem>
10536681和1024指的是同一个数据
<Target><LocURI>10536681</LocURI></Target>
<Source><LocURI>1024</LocURI></Source>
</MapItem>
</Map>
<Final/>
</SyncBody>
</SyncML>
3.3.5.6服务器端确认更改
<SyncML>
<SyncHdr>
<VerDTD>1.0</VerDTD>
<VerProto>SyncML/1.0</VerProto>
<SessionID>1</SessionID>
<MsgID>3</MsgID>
<Target><LocURI>IMEI:493005/10/059280/0</LocURI></Target>
<Source><LocURI>http://www.syncml.org/sync-server</LocURI></Source>
</SyncHdr>
<SyncBody>
<Status>
<MsgRef>3</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd>
<TargetRef>http://www.syncml.org/sync-server</TargetRef>
<SourceRef>IMEI:493005/10/059280/0</SourceRef>
<Data>200</Data>
</Status>
证实数据已经做了更改
<Status>
<MsgRef>3</MsgRef><CmdRef>1</CmdRef><Cmd>Map</Cmd>
<TargetRef>./contacts/james_bond </TargetRef>
<SourceRef>./dev-contacts</SourceRef>
<Data>200</Data>
</Status>
<Final/>
</SyncBody>
</SyncML>
4 SyncML表示协议
SyncML表示协议没有指定数据同步协议、同步引擎。而是指定了一些同步框架、格式使之适应不同的数据同步模型。SyncML指定了很多同步操作的结果。
定义了一种格式
注册为 MIME(多用途网际邮件扩充协议)媒体格式
定义了独立的同步传输协议
可以适合于多种同步传输方式的需要
与后台数据存储无关
与同步对象类型分离
4.1 SyncML 命令
4.1.1 请求的命令
Add:允许发送者将数据元素加入到接收者可以识别的同步数据中去,该命令必须在Sync命令中指定。
Alert:允许发送者通知接收者,通知可以作为应用程序和应用程序之间消息或者是接收用户接口的显示消息扩展。
Atomic:允许发送者指明一个命令集合可在带有语义或者没有任何语义的执行。
Copy:允许发送者复制可被接受者接收的数据。
Delete:允许发送者删除可被接受者接收的数据。Delete命令可以包含一个请求魏实现数据存档,删除可以是回收删除或者实际删除。
Exec:发送者可以要求接收者调用一个命名的、可执行的程序。
Get:发送者可以从接收者那里申请数据元素,这个命令不能被Sync命令指定。
Map:发送者可以接收者更新标识符在两个数据集合之间。
Put:允许发送者发送数据给接收者,这个命令不能被Sync命令指定。
Release:允许发送者对接收者可以接受的数据元素进行替换,这个命令不能被Sync命令指定。
Search:允许发送者进行数据元素的查询。
Sequence:允许发送者指定一系列按顺序执行。
Sync:允许发送者指定包含的命令作为同步两个数据集合的部分。
4.1.2 应答的命令
Status:当处理前一个请求发生错误的时候,指明一个操作的完成状态。
Results:用来返回Get或者Search命令的数据结果。
4.2 SyncML数据格式
SyncMl不但提供了通用的指令集合,还指明了一个小的通用的数据格式。数据格式提供了普通的为交换访问信息的媒体集合。例如通讯录、日历和消息。这三种数据格式是为了这个规范强制的,另外对于这些一般格式,SyncML允许鉴定其他的登记格式。SyncML利用MiME内容类型框架来鉴别数据格式。
4.3 使用XML
SyncML消息是使用一种标记语言,而SynML表示协议其实是一个XML应用。SyncML DTD定义了用来表示SyncML消息的XML文档。SyncML大量的使用了XML的名空间,名空间必须在第一个元素类型声明。在SyncML DTD中的元素类型被定义在一个URI为“http://www.syncml.org/docs/syncml_represent_v10_20001207.dtd或者URN为syncml:syncml。SyncML DTD也可以被ISO 9070标准公用标示符-//SYNCML//DTD SyncML 1.0//EN识别。任何XML 的标准属性可以被用在SyncML文档中。
4.4使用 MIME
互联网标准提供了一个工业界广泛接受的机制来鉴别不同的内容种类。SyncML消息用MiME媒体类型来鉴别,SyncML消息的媒体类型被登记在生产厂家列表中。目前有两个MIME内容可以用在SyncML消息中。applicattion/vnd.syncml+xml的MIME内容类型鉴别了SyncML消息基于文本的XML表达。applicattion/vnd.syncml+wbxml的MIME内容类型鉴别了SyncML消息基于文本的WBXML二进制表达。
4.5 SyncML标记语言描述
4.5.1 一般使用元素
Archive、Chal、Cmd、CmdID、CmdRef、Cred、Final、Lang、LocURI、MsgID、MsgRef、NoResp、NoResult、RespURI、SessionID、SftDel、Source、SourceRef、Target、TargetRef、VerDTD、VerProto。
4.5.2 消息容器元素
SyncML、SyncHdr、SyncBody。
4.5.3 数据描述元素
Data、Item、Meta。
4.5.4 协议管理元素
Status。
4.5.5 协议命令元素
Add、Alert、Atomic、Copy、Delete、Exec、Get、Map、MapItem、Put、Replace、Result、Search、Sequence、Sync。
详细内容请查阅相关文档。
5 SyncML 参考工具包
工具包在XML语言和SyncML之间起到桥梁的作用
5.1使用 SyncML 工具包
一个缓冲区,存储SyncML编码可以选择如下中一种 ...
可以只使用一个工作空间
可以为一个应用程序分配一个工作空间
把 in 和 out 分成两个工作空间
5.2 使用SyncML工具包的工作空间 当同步开始,工作空间被创建: instanceOptions.encoding = SML_WBXML;
instanceOptions.workspaceName ="MyWorkspace";
instanceOptions.workspaceSize =20000;
callbacks.addCmdFunc = &handleAddCmdFunc;
...rc = smlInitInstance(callbacks,
instanceOptions,
&instanceID);
5.3 使用SyncML工具包解析器
体积小而且经过了优化处理(代替 DOM XML 解析器)支持以下格式:
XML
WBXML
回调函数将把解析后的信息送到应用程序,开始解析SyncML :
smlProcessData(instanceID, // pass the instance
SML_ALL_COMMANDS, // parse entire Msg
pUserData); // a void ptr
5.4 使用工具包 编码器
需要编码的信息要经过Toolkit.
pAddStruct->elementType = SML_PE_ADD;
pAddStruct->cmdID = ... ;
pAddStruct->itemList = ... ;
pAddStruct->cred = ... ;
smlAddCmd(instanceID, pAddStruct);
5.5 内容与通信
5.5.1 整合负载
解析、编码嵌入式数据格式
vCard
vCalendar
....
数据库接口
Lotus Domino
Outlook
DB2
...
5.5.2 发布同步信息
传输绑定
HTTP
OBEX (Infrared)
WSP
Floppy Disk
相关资源
下面的链接是SyncML标准的网站
SyncML站点
作者
作者是蓝点软件公司北京研发中心工程师,对该方面感兴趣的读者可以和作者联系。
邮件地址:
[email protected]