现在的位置: 首页 > 综合 > 正文

嵌入式系统数据同步协议

2013年09月26日 ⁄ 综合 ⁄ 共 11474字 ⁄ 字号 评论关闭
SyncML 简介

姜君
工程师, 蓝点软件北京研发中心
2001 年 2 月

目 前在嵌入式系统与其他通信设备的数据同步方面,业界还没有统一的标准、协议。为了解决这个问题,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&

抱歉!评论已关闭.