构建前后兼容且可扩展的OTA升级包


目录
  • 背景
  • 已有打包方案
    • 格式
    • 不足
  • 引入新方案
    • 格式
  • 新方案面临的问题
    • 设备配套情况
    • 云端设备情况
  • 如何解决上述问题

背景

原有OTA固件打包方案是固定的,仅能打包三个固件,没有考虑其扩展功能。

由于市场缺货,需要新增加一个其他厂家的MCU来替换缺货的MCU,故市面上的产品OTA升级需要支持当前两种不同的MCU硬件的情况。

已有打包方案

格式

不足

  • 仅有总版本号,没有各个固件包的分版本号;
  • sign值设置不合理,识别包的类型较为麻烦;
  • 没有考虑到各个固件是智能升级(OTA的版本新于当前版本就升级),还是全部升级的模式;
  • 仅能支持三个固件,没有为后期的固件包预留位置。(因为data_content的大小,在解析时被写死成了3个,导致无法解析)
  • 没有留扩展位。

引入新方案

针对旧方案的不足,优化OTA打包方案。

格式

说明:根据升级时用到的固件情况,可以提前预留当前固件个总数的3倍即可。

新方案面临的问题

设备配套情况

基站+一个或多个CAM

云端设备情况

OTA包是放到云端上的,用户手中的设备版本各种各样, 会面临多种复杂的情况。

  1. 情况1:旧基站+旧CAM,新的OTA固件包

? 对老设备,要能升级新包。--->OTA包要做成兼容旧包,并能正确解析升级。

  1. 情况2:旧基站+新CAM,新的OTA固件包

? 对于新设备CAM,要有区分自己固件的能力,以防升级成砖。

  1. 情况3:新基站+旧CAM

    ? 新版的基站要有识别CAM端硬件配置的能力,并能进行相应升级。

  2. 情况4:新基站+新CAM

    ? 新版的基站要有识别CAM端硬件配置的能力,并能进行相应升级。

以上问题总结如下:

  1. 新的OTA包支持老版的解析方式;

  2. 新版MCU的升级接口具有能识别要升级文件的能力;

  3. CAM具有向基站上报自身硬件信息的能力;

  4. 基站要能依据CAM的上报信息,选择相应固件包进行升级。

如何解决上述问题

从上面的问题可以看出,这不是一个简单的OTA打包解包的问题,还有本地升级策略的问题。

针对问题1,我采用得是两种打包方式同时使用,原有的固件使用旧打包程序,新的固件采用新的打包方式。然后将打好的两个包合并成一个包,旧的在先,新的在后。这样就能支持旧基站的解包方式了。

由于对固包进行了扩展,新版基站的OTA解包程序在旧的解包方式上增加一下判断,分辨一下当前的包是原始版本,还是新版本。判断方法也很简单,就是看实际文件大小比较旧包里的计算出来的数据大小,若实际文件大小大于计算值,说明是增加了扩展包,否则就是老版本。

针对问题2,这个要求在OTA设计时,要提前考虑到。

针对问题3,上报硬件信息要提前设计。

针对问题4,设备在进行本地升级时,要加入辨识硬件信息的判断,而且要版本智能升级与全部强制升级的能力。

OTA