一、簡介
01概念
OTA:Over-the-Air Technology,即空中下載技術。
OTA升級:通過OTA方式實現(xiàn)固件或軟件的升級。
只要是通過無線通信方式實現(xiàn)升級的,都可以叫OTA升級,比如網(wǎng)絡/藍牙。
通過有線方式進行升級,叫本地升級,比如通過UART,USB或者SPI通信接口來升級設備固件。
02優(yōu)點
通過OTA方式,可以對分布在各地的設備進行軟件升級,而不必讓運維人員各地奔波。
物聯(lián)網(wǎng)平臺支持通過OTA方式進行設備固件升級,是智能設備修復系統(tǒng)漏洞、實現(xiàn)系統(tǒng)升級的手段。
在迅速變化和發(fā)展的物聯(lián)網(wǎng)市場,新的產(chǎn)品需求不斷涌現(xiàn),因此對于智能硬件設備的更新需求就變得空前高漲,設備不再像傳統(tǒng)設備一樣一經(jīng)出售就不再變更。通過固件升級用戶提供更好的服務。
03實現(xiàn)原理
核心流程:
制作升級包
下載升級包
驗簽升級包
更新程序
下載方式:
不管采用OTA方式還是有線通信方式升級,下載升級包的方式包括后臺式下載和非后臺式下載兩種模式。
后臺式下載:
在升級的時候,新固件在后臺悄悄下載,即新固件下載屬于應用程序功能的一部分,在新固件下載過程中,應用可以正常使用,也就是說整個下載過程對用戶來說是無感的,下載完成后,系統(tǒng)再跳到BootLoader程序,由BootLoader完成新固件覆蓋老固件的操作。比如智能手機升級Android或者iOS系統(tǒng)都是采用后臺式方式,新系統(tǒng)下載過程中,手機可以正常使用。
非后臺式下載:
在升級的時候,系統(tǒng)需要先從應用程序跳入到BootLoader程序,由BootLoader進行新固件下載工作,下載完成后BootLoader繼續(xù)完成新固件覆蓋老固件的操作,至此升級結束。早先的功能機就是采用非后臺來升級操作系統(tǒng)的,即用戶需要先長按某些按鍵進入bootloader模式,然后再進行升級,整個升級過程中手機正常功能都無法使用。
新舊固件覆蓋模式:
新固件替換老固件覆蓋的兩種方式:雙區(qū)模式和單區(qū)模式。
雙區(qū)模式:
雙區(qū)模式中老固件和新固件在flash中各占一塊bank(存儲區(qū))。假設老固件放在bank0(運行區(qū))中,新固件放在bank1(下載區(qū))中,升級的時候,應用程序先把新固件下載到bank1中,只有當新固件下載完成并校驗成功后,系統(tǒng)才會跳入BootLoader程序,然后擦除老固件所在的bank0區(qū),并把bank1的新固件拷貝到bank0中。
后臺式下載必須采用雙區(qū)模式進行升級。
優(yōu)點:
升級過程中出現(xiàn)問題或者新固件有問題,它還可以選擇之前的老固件老系統(tǒng)繼續(xù)執(zhí)行而不受其影響。
缺點:
多占用flash空間的一個存儲區(qū),在系統(tǒng)資源比較緊張的時候較為困難。
單區(qū)模式:
單區(qū)模式的非后臺式下載只有一個bank0(運行區(qū)),老固件和新固件共享這一個bank0。升級的時候,進入bootloader程序后先擦除老固件,然后直接把新固件下載到同一個bank中,下載完成后校驗新固件的有效性,新固件有效升級完成,否則要求重來。
優(yōu)點:
跟雙區(qū)模式相比,單區(qū)模式節(jié)省了Flash空間的一個bank,在系統(tǒng)資源比較緊張的時候,單區(qū)模式是一個不錯的選擇。
缺點:
如果升級過程中出現(xiàn)問題或者新固件有問題,單區(qū)模式碰到這種情況就只能一直待在bootloader中,然后等待再次升級嘗試,此時設備的正常功能已無法使用,從用戶使用這個角度來說,可以說此時設備已經(jīng)“變磚”了。
相比較,雙區(qū)模式雖然犧牲了很多存儲空間,但是換來了更好的升級體驗。
二、MCU OTA 升級
以MCU(微控制器)固件升級為例,講解嵌入式裸機程序的OTA升級。由于裸機固件是固化在設備的存儲器(如flash)中,即存儲器中保存的是機器碼,對MCU進行OTA固件升級,也就是要實現(xiàn)通過OTA方式將存儲器中舊固件的機器碼替換為新固件的機器碼。
數(shù)字簽名簽名:
A給B發(fā)送消息,A先計算出消息的消息摘要,然后使用自己的私鑰加密消息摘要,被加密的消息摘要就是簽名。
驗簽:B收到消息后,也會使用和A相同的方法計算消息摘要,然后用A的公鑰解密簽名,并與自己計算出來的消息摘要進行比較,如果相同則說明消息是A發(fā)送給B的,同時,A也無法否認自己發(fā)送消息給B的事實。
(B使用A的公鑰解密簽名文件的過程,叫做"驗簽")
密碼學基礎概念:
什么是消息摘要?
什么是非對稱加解密?私鑰與公鑰?
什么是數(shù)字簽名?
數(shù)字簽名的作用:
保證數(shù)據(jù)完整性,機密性和發(fā)送方角色的不可抵賴性。
消息摘要函數(shù):
MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512
數(shù)字簽名算法:
RSA、Rabin方式、ElGamal方式、DSA
01制作升級包
通過簽名工具使用簽名算法對固件進行數(shù)字簽名,簽名后的文件即為升級包。
升級包的內(nèi)容一般包括 firmware、header 和 signature value。
Firmware:固件
Header:頭部信息。存放配置信息,如版本號、產(chǎn)品類型等。
Signature value:簽名值。對firmware和header簽名后的值。
簽名工具:
上位機軟件,能計算固件的簽名值,并將固件打包為升級包的格式。
固件簽名:
上位機軟件先計算整個固件的消息摘要,使用非對稱密碼的私鑰對摘要進行加密,被加密后的消息摘要數(shù)據(jù)就是簽名值。
固件簽名的意義:
計算hash值可以識別固件是否被篡改和偽裝,確保固件的完整性。
使用非對稱秘鑰簽名方便后續(xù)驗證升級包身份的合法性。
02下載升級包
根據(jù)上位機軟件和MCU設備約定的通信協(xié)議,上位機軟件將升級包通過OTA方式發(fā)送給MCU設備,
MCU設備收到數(shù)據(jù)后,根據(jù)通信協(xié)議解析出升級包的數(shù)據(jù),并將升級包的數(shù)據(jù)保存到存儲器中。
通信協(xié)議的作用:
通訊雙方約定俗成地用于數(shù)據(jù)交流的格式。
下載的方式:
在應用程序中下載:后臺式
在BootLoader中下載:非后臺式
03驗簽升級包
MCU設備接收完所有的升級包后,先計算升級包中固件的摘要,然后使用非對稱秘鑰的公鑰解密升級包的簽名值,如果解密出來的固件摘要與自己計算的摘要相同,則驗簽成功。
04更新固件
驗簽成功保證了固件的完整性和合法性后,MCU設備從應用程序進入BootLoader程序,在BootLoader程序中將flash中的新固件數(shù)據(jù)搬運到舊固件的存儲區(qū),將其覆蓋。然后BootLoader程序啟動固件運行,此時固件為新固件。
flash固件數(shù)據(jù)更新:
擦除flash,寫flash。
三、Linux OTA升級
Linux系統(tǒng)的組成:
主要由三大部分組成,包括 uboot(引導啟動程序)、kernel(內(nèi)核)和 rootfs(根文件系統(tǒng))。
三者在flash中的分區(qū)如下:應用程序存放于rootfs。
Linux系統(tǒng)的啟動流程:
01系統(tǒng)升級
Linux系統(tǒng)由 ubootkernel ootfs 三大部分組成,對Linux系統(tǒng)進行升級,也就是對flash中這三個分區(qū)的數(shù)據(jù)進行更新替換。
由于ubootkernel ootfs在flash分區(qū)中是以二進制數(shù)據(jù)存儲的,與MCU固件在flash中存的是二進制數(shù)據(jù)一樣,包括ubootkernel ootfs的升級文件也是以二進制數(shù)方式直接寫入到對應的Flash分區(qū)。其升級方式與MCU固件的升級原理基本是一致的。
一般可在uboot中下載升級包來升級ubootkernel ootfs ,與MCU在BootLoader程序中完成升級類似。
02應用程序升級
在Linux系統(tǒng)中,應用程序是存放在文件系統(tǒng)中,并以可執(zhí)行程序文件的方式存在,其在系統(tǒng)中就是文件,這與MCU固件存放在flash分區(qū)的方式不同。
應用程序的升級流程與MCU固件、Linux系統(tǒng)升級基本一致。應用程序的升級除了可以升級可執(zhí)行文件外,還可以升級配置文件等。
應用程序升級流程:
制作升級包(打包簽名工具)、下載升級包(下載工具)、升級包驗簽、程序更新
與 MCU OTA 升級區(qū)別:
制作升級包:將應用程序相關的文件(可執(zhí)行程序、庫文件、配置文件等)打包為壓縮包,作為一個整體再進行簽名。
升級包下載和驗簽通過后,將壓縮包解壓,可以得到應用程序的相關文件。
應用程序的更新,可以通過啟動應用程序的程序來更新,如啟動腳本、啟動程序,類似MCU升級的BootLoader程序作用。
更新方式:
直接覆蓋舊程序;
保留舊程序,執(zhí)行新程序;
直接覆蓋舊程序:
保留舊程序,執(zhí)行新程序:
如pingpong操作
四、總結
OTA升級的核心:
審核編輯:湯梓紅
評論
查看更多