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

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





