加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 应用 > 正文

物联网设备OTA软件升级之:完全升级与增量升级

发布时间:2023-07-10 14:29:58 所属栏目:应用 来源:
导读:各位看官好,上一篇文章我们聊了一下关于 OTA 升级过程中,新的软件包是如何从开发者的电脑上,安全地下载到嵌入式设备中的。

其实这不仅仅是下载文件这么简单,这个问题关乎于众多终端设备的批量升级战略。

各位看官好,上一篇文章我们聊了一下关于 OTA 升级过程中,新的软件包是如何从开发者的电脑上,安全地下载到嵌入式设备中的。

其实这不仅仅是下载文件这么简单,这个问题关乎于众多终端设备的批量升级战略。

今天,我们继续 OTA 升级过程中后续的阶段。

设备中正在执行的 V1 版本的程序,包括这 3 个文件,它们位于文件系统中的 /root/app 目录下:

main: 主程序;
config.ini: 配置文件(包括一个配置项:version=V1_0);
mylib.so: 实现了某个算法的动态库,被 main 程序调用;
现在,新的版本 V2 优化了算法,压缩包名称是 app_V2.0.tgz,其中包括文件:

main: 没有变化;
config.ini: 配置项修改了:version=V2_0;
mylib.so: 优化了算法,主要就是想升级这个动态库;
upgrade.sh: 一个脚本程序,新增的文件;
升级包 app_V2.0.tgz 已经被下载到设备本地的文件系统中了,假设解压到目录 /root/upgrade 中。

upgrade.sh 升级脚本
我们首先要明白一个问题:执行升级指令、下载压缩包,都是此刻正在执行的 main 程序来执行的。

如果把复制替换的操作也让 main 程序来执行的话,肯定是会出问题的:它不可能去复制一个新的 main 文件,来把自己替换掉!

写过单片机程序的小伙伴肯定都知道:当新的固件下载到 flash 之后,一般都是重新启动设备,然后由 bootloader 来执行具体的文件复制操作。

那么对于我们的数字电视带有数字化分布式的数字电视文件系统的一系列的数字电视设备来说,也可以模仿当今世界一些类似的无线设备的操作方式。

此时就可以在 rc.local 这个文件中去做升级操作。

但是这样的方式,实质上相当于是轻微的一步步地侵入了对方的操作系统,只不过我们总感觉这样一刀切的做是不是有点不太好。

这里隐藏着一个很重要的思想:upgrade.sh 是放在升级包中的,它并没有固化在终端设备中。

这样的话,每次执行升级任务时,都可以根据本次的升级需要,来灵活地编写升级脚本。

完全升级
所谓的完全升级,就是把旧版本的程序全部丢弃,把升级包中的新程序全部复制过去。

此时,升级脚本文件 upgrade.sh 就完成下面这几个主要工作:

停止(kill)当前正在执行的 V1.0 版本的程序;
删除 /root/app 目录下的所有旧文件;
把升级包中所有的新版本文件 /root/upgrade/* 复制到 /root/app 目录下;
这样的完全升级方式是最无脑、最粗鲁的。

如果配置信息被用户修改了,那么升级之后,所有的配置信息又被恢复为默认值了,用户的私人配置信息全丢了怎么办?

增量升级
所谓的增量升级:就是升级时并不会把所有的文件全部进行替换,而只是替换那些需要更新的文件。

对于我们假设的升级场景,只需要做 2 件事情:

替换 mylib.so 库文件;
把配置文件 config.ini 中的版本字段修改为:version=V2_0;
同样的,所有的升级过程仍然是写在upgrade.sh 这个升级脚本中:

停止(kill)当前正在执行的 V1.0 版本的程序;
把 /root/upgrade/mylib.so 文件复制到 /root/app 目录下;
使用sed 命令来修改 config.ini 文件中的 version 字段;
PS:此时升级包中,只需要包含必要的文件就可以了,不需要把其他用不到的文件也放进去了。

关于 OTA 升级过程,就先说这么多了,主要是以思想为主,毕竟每一个项目的需求场景是不一样的,从大方向上明白 OTA 的升级过程就可以了。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章