基于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/>做为标识.
以上介绍了些同步协议的内容, 先有一个大致的了解, 要完整详细的介绍, 内容太多, 大家可以在网上找些相关的英文资料和sync4j源码, 结合起来, 掌握得会比较快些, 今天就先写这么多, 下次有空再接着写:)
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源码, 结合起来, 掌握得会比较快些, 今天就先写这么多, 下次有空再接着写:)
相关文章推荐
- 基于SyncML的funambol dm开源项目的改造应用(三) - 实际项目介绍
- 基于SyncML的funambol dm开源项目的改造应用(二) - 搭建SCTS测试环境
- OA—Ant构建工具和基于Ant的XDoclet开源项目的应用
- 仿应用汇应用搜索标签效果——flowTags基于github开源项目flowlayout
- Android 完整开源应用大全,完整开源项目
- C/C++程序员必须熟练应用的开源项目
- 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)
- Android开发者应该深入学习的10个开源应用项目
- C/C++程序员必须熟练应用的开源项目
- 基于.NET 2.0的GIS开源项目SharpMap分析手记(六):SharpMap的功能扩展之路
- 发布一个开源项目,基于thinkphp框架搭建的一个简单框架
- 10个经典的Android开源应用项目
- 应用Rational 工具简化基于J2EE的项目:第一部分 介绍
- 基于开源GIS软件的电子政务地理信息应用解决方案
- Android深入学习的10个应用开源项目 (zz)
- 基于事件的开源网络库—libevent:应用介绍
- 应用 Rational 工具简化基于 J2EE 的项目第 10 部分 :总结
- 应用Rational 工具简化基于J2EE的项目:第一部分 介绍
- 基于事件的开源网络库—libevent:应用实例
- Android开发者应该深入学习的10个开源应用项目[转]