OTA的学习
一、什么是OTA?
OTA升級機制可以讓聯網設備在固件正常運行時通過網絡(WIFI或藍牙)進行固件升級。
要想通過OTA方式進行固件升級,首先要配置設備的分區表。
二、什么是分區表?
每片ESP32的flash上,可包含多個應用程序和多種不同類型的數據(例如校準數據、文件系統數據、參數存儲器數據等)。具體來說,分區表就在ESP32flash的默認偏移地址0x8000處,長度為0x1000(4KB)。
flash地址在0x9000之前的結構是固定的,第一部分是二級的BootLoader,后面緊接著就是分區表,尺寸為0x1000。分區表的主要作用就是用來管理0x9000之后的數據。
三、如何創建分區表?
我們可以創建一個分區表文件來實現,即CSV文件。下表是一張ESP32 flash大小為4M的分區表文件。
在這個分區表中,指定了兩個1600KB大小的應用程序分區(APP),存放我們待升級的固件,因此我們升級的固件大小不能超過1600KB。
ESP32 SPI Flash 內有與升級相關的(至少)四個分區:OTA data、Factory App、OTA_0、OTA_1。其中 FactoryApp 內存有出廠時的默認固件。
首次進行 OTA 升級時,OTA Demo 向 OTA_0 分區燒錄目標固件,并在燒錄完成后,更新 OTA data 分區數據并重啟。
系統重啟時獲取 OTA data 分區數據進行計算,決定此后加載 OTA_0 分區的固件執行(而不是默認的 Factory App 分區內的固件),從而實現升級。
同理,若某次升級后 ESP32 已經在執行 OTA_0 內的固件,此時再升級時 OTA Demo 就會向 OTA_1 分區寫入目標固件。再次啟動后,執行 OTA_1 分區實現升級。以此類推,升級的目標固件始終在 OTA_0、OTA_1 兩個分區之間交互燒錄,不會影響到出廠時的 Factory App 固件。
四、怎么配置OTA FLASH分區?
在創建此分區文件后,我們可以在編譯項目時通過 menuconfig中配置指定自定義分區表文件。
你可以在菜單Partition Table-->Partition Table中選擇為Custom partition table CSV,同時選定分區表文件。
芯片升級整體過程
首先是連接上網絡。其次是定義分區表,確定OTA_0和OTA_1。
芯片從OTA_0啟動然后觸發OTA升級。芯片將從HTTPS服務器下載新固件并將其保存到OTA_1分區中,然后將自動更新ota_data分區數據,指示下次重啟后應從OTA1分區啟動。引導加載程序將讀取ota_data分區中的內容并運行所選定的應用程序分區。
應用程序回滾
如果在新版應用第一次啟動時發生斷電或意外崩潰,則會回滾至之前正常運行的版本。
建議:盡快完成自測,防止因斷電回滾。
只有?OTA?分區可以回滾。工廠分區不會回滾。
回滾的主要目的是確保設備更新后正常運轉。該功能可使設備在更新新版本后出現嚴重錯誤時,回滾到之前正常運行的應用版本。當設置了回滾使能,并執行完OTA升級,應用更新至新版本后,芯片可能有三種情況。
1、應用程序運行正常。esp_ota_mark_app_valid_cancel_rollback()標記合法函數將應用程序狀態標記為合法 ESP_OTA_IMG_VALID,啟動無限制。
2、應用程序出現嚴重錯誤,無法繼續工作,必須回滾到原先版本。esp_ota_mark_app_invalid_rollback_and_reboot()標記非法重啟函數將正在運行的版本標記為非法ESP_OTA_IMG_INVALID,然后重啟芯片。重啟后引導加載器不會選取剛才更新的版本,而是此前正常運行的版本。
?實現原理
核心流程:
1.制作升級包
2.下載升級包
3.驗簽升級包
4.更新程序
下載方式:
不管采用OTA方式還是有線通信方式升級,下載升級包的方式包括后臺式下載和非后臺式下載兩種模式。
后臺式下載:
在升級的時候,新固件在后臺悄悄下載,即新固件下載屬于應用程序功能的一部分,在新固件下載過程中,應用可以正常使用,也就是說整個下載過程對用戶來說是無感的,下載完成后,系統再跳到BootLoader程序,由BootLoader完成新固件覆蓋老固件的操作。比如智能手機升級Android或者iOS系統都是采用后臺式方式,新系統下載過程中,手機可以正常使用。
非后臺式下載:
在升級的時候,系統需要先從應用程序跳入到BootLoader程序,由BootLoader進行新固件下載工作,下載完成后BootLoader繼續完成新固件覆蓋老固件的操作,至此升級結束。早先的功能機就是采用非后臺來升級操作系統的,即用戶需要先長按某些按鍵進入bootloader模式,然后再進行升級,整個升級過程中手機正常功能都無法使用
新舊固件覆蓋模式:
新固件替換老固件覆蓋的兩種方式:雙區模式和單區模式。
雙區模式:
雙區模式中老固件和新固件在flash中各占一塊bank(存儲區)。假設老固件放在bank0(運行區)中,新固件放在bank1(下載區)中,升級的時候,應用程序先把新固件下載到bank1中,只有當新固件下載完成并校驗成功后,系統才會跳入BootLoader程序,然后擦除老固件所在的bank0區,并把bank1的新固件拷貝到bank0中。
后臺式下載必須采用雙區模式進行升級。
優點:
升級過程中出現問題或者新固件有問題,它還可以選擇之前的老固件老系統繼續執行而不受其影響。
缺點:
多占用flash空間的一個存儲區,在系統資源比較緊張的時候較為困難。
?
單區模式:
單區模式的非后臺式下載只有一個bank0(運行區),老固件和新固件共享這一個bank0。升級的時候,進入bootloader程序后先擦除老固件,然后直接把新固件下載到同一個bank中,下載完成后校驗新固件的有效性,新固件有效升級完成,否則要求重來。
優點:
跟雙區模式相比,單區模式節省了Flash空間的一個bank,在系統資源比較緊張的時候,單區模式是一個不錯的選擇。
缺點:
如果升級過程中出現問題或者新固件有問題,單區模式碰到這種情況就只能一直待在bootloader中,然后等待再次升級嘗試,此時設備的正常功能已無法使用,從用戶使用這個角度來說,可以說此時設備已經“變磚”了。
相比較,雙區模式雖然犧牲了很多存儲空間,但是換來了更好的升級體驗。
二、MCU OTA升級
以MCU(微控制器)固件升級為例,講解嵌入式裸機程序的OTA升級。由于裸機固件是固化在設備的存儲器(如flash)中,即存儲器中保存的是機器碼,對MCU進行OTA固件升級,也就是要實現通過OTA方式將存儲器中舊固件的機器碼替換為新固件的機器碼。
數字簽名
簽名:
A給B發送消息,A先計算出消息的消息摘要,然后使用自己的私鑰加密消息摘要,被加密的消息摘要就是簽名。
驗簽:
B收到消息后,也會使用和A相同的方法計算消息摘要,然后用A的公鑰解密簽名,并與自己計算出來的消息
摘要進行比較,如果相同則說明消息是A發送給B的,同時,A也無法否認自己發送消息給B的事實。
(B使用A的公鑰解密簽名文件的過程,叫做"驗簽")
密碼學基礎概念:
1.什么是消息摘要?
2.什么是非對稱加解密?私鑰與公鑰?
3.什么是數字簽名?
數字簽名的作用:
保證數據完整性,機密性和發送方角色的不可抵賴性。
消息摘要函數:
MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512
數字簽名算法:
RSA、Rabin方式、ElGamal方式、DSA
2.1 ?制作升級包
通過簽名工具使用簽名算法對固件進行數字簽名,簽名后的文件即為升級包。
升級包的內容一般包括firmware、header和signature value。
Firmware:固件
Header:頭部信息。存放配置信息,如版本號、產品類型等。
Signature value:簽名值。對firmware和header簽名后的值。
簽名工具:
上位機軟件,能計算固件的簽名值,并將固件打包為升級包的格式。
固件簽名:
上位機軟件先計算整個固件的消息摘要,使用非對稱密碼的私鑰對摘要進行加密,
被加密后的消息摘要數據就是簽名值。
固件簽名的意義:
計算hash值可以識別固件是否被篡改和偽裝,確保固件的完整性。
使用非對稱秘鑰簽名方便后續驗證升級包身份的合法性。
2.2? 下載升級包
根據上位機軟件和MCU設備約定的通信協議,上位機軟件將升級包通過OTA方式發送給MCU設備,
MCU設備收到數據后,根據通信協議解析出升級包的數據,并將升級包的數據保存到存儲器中。
通信協議的作用:
通訊雙方約定俗成地用于數據交流的格式。
下載的方式:
1.在應用程序中下載:后臺式
2.在BootLoader中下載:非后臺式
2.3? 驗簽升級包
MCU設備接收完所有的升級包后,先計算升級包中固件的摘要,然后使用非對稱秘鑰的
公鑰解密升級包的簽名值,如果解密出來的固件摘要與自己計算的摘要相同,則驗簽成功。
2.4? 更新固件
驗簽成功保證了固件的完整性和合法性后,MCU設備從應用程序進入BootLoader程序,
在BootLoader程序中將flash中的新固件數據搬運到舊固件的存儲區,將其覆蓋。
然后BootLoader程序啟動固件運行,此時固件為新固件。
flash固件數據更新:
擦除flash,寫flash。
在使用分區表時,最簡單的方法就是打開項目配置菜單(idf.py?menuconfig),并在?CONFIG_PARTITION_TABLE_TYPE?下選擇一個預定義的分區表:
-
“Single factory app, no OTA”
-
“Factory app, two OTA definitions”
-
分區表設置成Factory app, two OTA definitions
-
這里我們選擇如下:
- 在以上兩種選項中,出廠應用程序均將被燒錄至 flash 的 0x10000 偏移地址處。這時,運行?idf.py partition-table?,即可以打印當前使用分區表的信息摘要(當然肯定是得先燒寫程序到ESP32里面)
-
?
?
-
?
?
輸入 idf.py monitor,結果如下
?分區表設置成Single factory app, no OTA
?輸入 idf.py monitor,結果如下
?
?分區表設置為Single factory app(large),no OTA
?
?
?
?接下來演示在本地 PC 端搭建 http 服務器實現?ESP32?OTA 過程
?設置 WiFi 賬號密碼:
?
注意:wifi的SSID和密碼一定要跟連接的熱點或者路由器一致。
?使能 HTTP OTA:
?由于 ESP-IDF 默認為 HTTPS OTA,需要在?menuconfig?里打開以下選項來讓 HTTP OTA 成功進行
?
準備需要 OTA 的 Bin 文件
在此處以需要升級的 Bin 為 helloworld.bin?為例,將?helloworld.bin?文件放在build目錄下?
?
?查詢 python 版本,執行如下命令:
?
- 如果上述指令返回的 Python 版本是 3.X ,通過如下命令建立服務器
?
??查詢本機 IP
在任意終端輸入?ipconfig,結果如下
?
可以看到 PC 的 ip 地址為?192.168.1.102?,后續在填寫 OTA URL 時需要用到此 ip。?
?注:服務器建立好后,可通過網址 ip地址:8070?在網頁端查詢本地服務器(ip地址為pc機的地址)
?
?這個目錄列表就是終端的路徑下的。
進入網頁后,這里主要是復制hello_world.bin的地址
?我這里復制到的地址如下所示,這就是新固件的下載地址待會需要用到
?
配置 OTA URL?
?menuconfig 里配置 OTA URL 為?http://192.168.1.102:8070/hello_world.bin
1.到此升級包準備工作已經完成
2.那個http服務端需要一直打開,不能關閉
3.你的電腦必須是在2.4G頻段的wifi,否則ESP32無法和電腦在同一個局域網內
4.點擊hello_world.bin,看看能不能下載,如果不能下載,可能是電腦的防火墻攔截了,可以關閉防火墻試試。否則你的ESP32也是不能下載到固件的
?
?檢查分區表
在上述 menuconfig 里檢查分區表是否選擇為正確包含 OTA 分區的分區表,OTA 示例里會默認做以下修改:?
?
?
?開始 OTA
此時在 OTA 示例終端 下輸入?idf.py flash monitor?編譯燒寫 OTA 示例至 ESP32 中即可發現 OTA 升級成功。?
?
總結
- 上一篇: OTA升级二——阿里云端OTA配置及应用
- 下一篇: OTA测试