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

本文深入探讨了DM同步协议在设备管理中的作用,包括固件和应用升级管理,详细解析了协议的初始化、信息传递、会话结束流程,并通过SyncML XML实例展示了初始化交互的具体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

   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源码, 结合起来, 掌握得会比较快些, 今天就先写这么多, 下次有空再接着写:)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦神-mirson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值