物聯(lián)網(wǎng)設(shè)備OTA軟件升級之:完全升級和增量升級
包括產(chǎn)品的生產(chǎn)過程也是如此,那些踩過的坑,真是一把鼻涕一把淚,這個問題后面有時間專門寫一篇。
main: 主程序;現(xiàn)在,新的版本V2優(yōu)化了算法,壓縮包名稱是app_V2.0.tgz,其中包括文件:config.ini: 配置文件(包括一個配置項:version=V1_0);
mylib.so: 實現(xiàn)了某個算法的動態(tài)庫,被 main 程序調(diào)用;
main: 沒有變化;升級包app_V2.0.tgz已經(jīng)被下載到設(shè)備本地的文件系統(tǒng)中了,假設(shè)解壓到目錄/root/upgrade中。config.ini: 配置項修改了:version=V2_0;
mylib.so: 優(yōu)化了算法,主要就是想升級這個動態(tài)庫;
upgrade.sh: 一個腳本程序,新增的文件;
upgrade.sh 升級腳本
我們首先要明白一個問題:執(zhí)行升級指令、下載壓縮包,都是此刻正在執(zhí)行的main程序來執(zhí)行的。
寫過單片機程序的小伙伴肯定都知道:當(dāng)新的固件下載到flash之后,一般都是重新啟動設(shè)備,然后由bootloader來執(zhí)行具體的文件復(fù)制操作。
這個腳本文件的主要作用就是用來控制升級過程。

完全升級
所謂的完全升級,就是把舊版本的程序全部丟棄,把升級包中的新程序全部復(fù)制過去。
這樣的完全升級方式是最無腦、最粗魯?shù)摹?
- 停止(kill)當(dāng)前正在執(zhí)行的 V1.0 版本的程序;
- 刪除 /root/app 目錄下的所有舊文件;
- 把升級包中所有的新版本文件 /root/upgrade/* 復(fù)制到 /root/app 目錄下;
關(guān)于這個問題,我們就繼續(xù)來聊一下增量升級!
增量升級
所謂的增量升級:就是升級時并不會把所有的文件全部進行替換,而只是替換那些需要更新的文件。
同樣的,所有的升級過程仍然是寫在upgrade.sh這個升級腳本中:
- 替換 mylib.so 庫文件;
- 把配置文件 config.ini 中的版本字段修改為:version=V2_0;
PS:此時升級包中,只需要包含必要的文件就可以了,不需要把其他用不到的文件也放進去了。
- 停止(kill)當(dāng)前正在執(zhí)行的 V1.0 版本的程序;
- 把 /root/upgrade/mylib.so 文件復(fù)制到 /root/app 目錄下;
- 使用 sed 命令來修改 config.ini 文件中的 version 字段;
從我描述的文字來看,似乎完全升級和增量升級差別不大。
One more thing
為了表示我不是在胡說八道,這里提供一個很多年前的項目中,升級腳本文件的模板。
另外,不知道是否有小伙伴對于ESP32中的升級流程感興趣,下次再專門寫一篇ESP32模組,如何與AWS后臺通過MQTT指令進行交互,以及固件的下載、升級流程。
------ End ------





