现在基于移动网络的电子设备,都要求内部软件支持在线升级,其原理说起来就是使用新软件覆盖旧软件,但是不同硬件资源,最终实现的方案不同。
简单的8位单片机如STM8,没有操作系统,实际是开发2套代码BL和APP。单片机外挂网络模块,通过移动网络下载单片机新软件后,告知APP请求升级,单片机重启进入BL。BL通过UART或者其他接口接收新APP bin档文件,并直接覆盖写入原APP的区域,完成后再跳转到APP执行。因为代码空间限制,升级是替换完整的APP软件且没有备份,因此务必使用掉电存储区域做好标记,万一异常,需要自动进BL向外界发信息请求再次传输APP软件。
复杂的ARM系统如MTK的手机芯片,自带文件系统和网络功能,运算量足够,可以先通过网络下载新APP软件存在文件区域,再重启进入BL向Flash写新软件,失败了重写。
这种下载完整的APP软件进行覆盖的升级方式,下载浪费流量且时间长,对大量基于GSM/GPRS或者NB-Iot的物联网产品体验更差,所以最佳选择是差分升级DFOTA。
设备内运行软件V01,期望升级到V02,可以将V01变成V02的差异部分提取,生成差异文件D3,也就是差分包。设备收到D3,结合自身V01计算还原出V02,再将V02写入,即完成了升级。
差分升级涉及的算法是开源的,但是为了安全,一般会在D3文件头尾加一些特殊标记用于校验,如收到D3文件残缺,则抛弃,继续运行V01。
升级是为了解决问题,但是一旦失败则可能导致设备变砖,前期测试尽量选择不同设备模拟升级异常,如强制断电或软件包异常,设备必须有自我恢复的机制。