您的位置:首页 > 其它

基于SyncML的funambol dm开源项目的改造应用(一)

2012-01-05 12:26 441 查看
很久没写博了, 发现这里改变了许多, 发扬开源精神, 分享一些我最近的开发经验, 希望对同仁有所帮助, 能够少走些弯路, 呵呵:)

syncML 是应用比较广泛的通讯同步协议, 包含两个功能, DM和DS同步. DS后续我会深入讲解, 这里先介绍DM, 如果大家有接触过手机OTA的升级功能的话, 对同步应该会有个形象的了解.DM 全称 Device Management, 即设备管理, 分为固件升级管理和应用升级管理. 我们手机的系统固件通过OTA方式升级, 一般都是采用DM中的FU(firmware update) 交互.

实际开发运用, 需要对syncml_sync_protocol有所了解, 这方面的资料不愁匮乏, 可以去搜索下, 还是有很多详细的英文资料, 但有译成中文的很少, 对英文不好的同仁去研究的话是相当的痛苦, 不过也没关系, 只要对主要的指令有个了解就行了, 因为后面开发运用会结合funambol进行改造, 至于协议中很细节的规范可完全交由funambol去处理, 我们只需要把精力放在业务层面, 根据需求进行改造.

下面主要从SYNCML协议角度, 讲解 客户端与服务端的同步交互实现:

一、任何通讯协议, 概括分为初始化, 信息传递, 会话结束三个过程。DM同步流程参照以下图示, 共有四次双向交互, 初始化阶段传递的是设备信息或应用程序版本信息, 信息传递阶段分为两步, 第一步返回的是信息描述内容, FU返回的是固件信息, AU返回的是服务端所有可升级的应用程序概述信息. 第二步则是根据提供的描述信息, 下载升级包并执行升级. 会话结束阶段, 客户端将升级执行情况反馈给服务端, 这样就完成一次同步升级. 从整个流程来看, 其实很简单, 但是具体实现来讲还要考虑很多东西, 比如鉴权处理,
版本升级规则, 执行信息统计, 会话中断, 容错处理等.


二、接下来看看SYNCML具体内容是什么, 怎样识别命令, 传递信息的。 以初始化交互为例, 分为包头和包体两部分信息, SyncHdr 包头是些概要描述信息, 如协议版本号, 会话标识, 消息序列, 源客户端标识等, 这里要注意的是, MEID(移动设备唯一标识号, 就像网卡的MAC)是放在Source中的LocURI节点内, 这是规范, 得遵循。 而且MEID是一个重要信息。

SyncBody包体主要处理业务交互, Alert是传递执行指令, 不同编码代表不同含义 , 客户端发送的1201代表第一步初始化会话的建立, Replace顾名思义为替换的意思, 贴切一点应该为更新, 也就是客户端传递最新的设备信息给服务端, 要求服务端同步更新. 这样, 服务端才能根据此信息来正确匹配相应的升级包. 每个Item代表的是一条描述信息, 注意Source中的LocURI, 节点名称对应的是设备信息中的不同属性, 这不是随便定义的, 具体可参照协议文档, 遵循规范, 可以做到兼容性,
如果只是做给自己用, 那么可以随便填, 自己能够识别就行. 如果传送的内容较多, 可以支持分包传送, 完整的包信息需要加上<Final/>做为标识.

<SyncML xmlns="SYNCML:SYNCML1.2">
<SyncHdr>
<VerDTD>1.2</VerDTD>
<VerProto>DM/1.2</VerProto>
<SessionID>1</SessionID>
<MsgID>1</MsgID>
<Target>
<LocURI>http://www.syncml.org/mgmt-server</LocURI>
</Target>
<Source>
<LocURI>IMEI:493005100592800</LocURI>
</Source>
<Meta> <!-- Maximum message size for the client -->
<MaxMsgSize xmlns="syncml:metinf">5000</MaxMsgSize>
</Meta>
</SyncHdr>
<SyncBody>
<Alert>
<CmdID>1</CmdID>
<Data>1201</Data> <!-- Client-initiated session -->
</Alert>
<Replace>
<CmdID>3</CmdID>
<Item>
<Source><LocURI>./DevInfo/DevId</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>IMEI:493005100592800</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/Man</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>Device Factory, Inc.</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/Mod</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>android</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/DmV</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>1.0.0.1</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/Lang</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>US-en</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/Ext/HwV</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>ANDROID-v1.0-0000-b20101217</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/Ext/KrV</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>Linux-2.6.29-Android-r1.0.0-b20101217.085137</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/Ext/SysV </LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>Donut.35mtd_Android_r1.02.11-b20101217.085137-CTA</Data>
</Item>
<Item>
<Source><LocURI>./DevInfo/FGV</LocURI></Source>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">text/plain</Type>
</Meta>
<Data>1.1.2</Data>
</Item>
</Replace>
<Final/>
</SyncBody>
</SyncML>


以上介绍了些同步协议的内容, 先有一个大致的了解, 要完整详细的介绍, 内容太多, 大家可以在网上找些相关的英文资料和sync4j源码, 结合起来, 掌握得会比较快些, 今天就先写这么多, 下次有空再接着写:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: