日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OTA的学习

發(fā)布時間:2023/12/3 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OTA的学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是OTA?

OTA升級機制可以讓聯(lián)網(wǎng)設備在固件正常運行時通過網(wǎng)絡(WIFI或藍牙)進行固件升級。

要想通過OTA方式進行固件升級,首先要配置設備的分區(qū)表。

二、什么是分區(qū)表?

每片ESP32的flash上,可包含多個應用程序和多種不同類型的數(shù)據(jù)(例如校準數(shù)據(jù)、文件系統(tǒng)數(shù)據(jù)、參數(shù)存儲器數(shù)據(jù)等)。具體來說,分區(qū)表就在ESP32flash的默認偏移地址0x8000處,長度為0x1000(4KB)。

flash地址在0x9000之前的結(jié)構(gòu)是固定的,第一部分是二級的BootLoader,后面緊接著就是分區(qū)表,尺寸為0x1000。分區(qū)表的主要作用就是用來管理0x9000之后的數(shù)據(jù)。

三、如何創(chuàng)建分區(qū)表?

我們可以創(chuàng)建一個分區(qū)表文件來實現(xiàn),即CSV文件。下表是一張ESP32 flash大小為4M的分區(qū)表文件。

在這個分區(qū)表中,指定了兩個1600KB大小的應用程序分區(qū)(APP),存放我們待升級的固件,因此我們升級的固件大小不能超過1600KB。

ESP32 SPI Flash 內(nèi)有與升級相關的(至少)四個分區(qū):OTA dataFactory AppOTA_0OTA_1。其中 FactoryApp 內(nèi)存有出廠時的默認固件。

首次進行 OTA 升級時,OTA Demo 向 OTA_0 分區(qū)燒錄目標固件,并在燒錄完成后,更新 OTA data 分區(qū)數(shù)據(jù)并重啟。

系統(tǒng)重啟時獲取 OTA data 分區(qū)數(shù)據(jù)進行計算,決定此后加載 OTA_0 分區(qū)的固件執(zhí)行(而不是默認的 Factory App 分區(qū)內(nèi)的固件),從而實現(xiàn)升級。

同理,若某次升級后 ESP32 已經(jīng)在執(zhí)行 OTA_0 內(nèi)的固件,此時再升級時 OTA Demo 就會向 OTA_1 分區(qū)寫入目標固件。再次啟動后,執(zhí)行 OTA_1 分區(qū)實現(xiàn)升級。以此類推,升級的目標固件始終在 OTA_0OTA_1 兩個分區(qū)之間交互燒錄,不會影響到出廠時的 Factory App 固件。

四、怎么配置OTA FLASH分區(qū)?

在創(chuàng)建此分區(qū)文件后,我們可以在編譯項目時通過 menuconfig中配置指定自定義分區(qū)表文件。

你可以在菜單Partition Table-->Partition Table中選擇為Custom partition table CSV,同時選定分區(qū)表文件。

芯片升級整體過程

首先是連接上網(wǎng)絡。其次是定義分區(qū)表,確定OTA_0和OTA_1。

芯片從OTA_0啟動然后觸發(fā)OTA升級。芯片將從HTTPS服務器下載新固件并將其保存到OTA_1分區(qū)中,然后將自動更新ota_data分區(qū)數(shù)據(jù),指示下次重啟后應從OTA1分區(qū)啟動。引導加載程序?qū)⒆x取ota_data分區(qū)中的內(nèi)容并運行所選定的應用程序分區(qū)。

應用程序回滾

如果在新版應用第一次啟動時發(fā)生斷電或意外崩潰,則會回滾至之前正常運行的版本。

建議:盡快完成自測,防止因斷電回滾。

只有?OTA?分區(qū)可以回滾。工廠分區(qū)不會回滾

回滾的主要目的是確保設備更新后正常運轉(zhuǎn)。該功能可使設備在更新新版本后出現(xiàn)嚴重錯誤時,回滾到之前正常運行的應用版本。當設置了回滾使能,并執(zhí)行完OTA升級,應用更新至新版本后,芯片可能有三種情況。

1、應用程序運行正常。esp_ota_mark_app_valid_cancel_rollback()標記合法函數(shù)將應用程序狀態(tài)標記為合法 ESP_OTA_IMG_VALID,啟動無限制。

2、應用程序出現(xiàn)嚴重錯誤,無法繼續(xù)工作,必須回滾到原先版本。esp_ota_mark_app_invalid_rollback_and_reboot()標記非法重啟函數(shù)將正在運行的版本標記為非法ESP_OTA_IMG_INVALID,然后重啟芯片。重啟后引導加載器不會選取剛才更新的版本,而是此前正常運行的版本。

?實現(xiàn)原理

核心流程:

1.制作升級包

2.下載升級包

3.驗簽升級包

4.更新程序

下載方式:

不管采用OTA方式還是有線通信方式升級,下載升級包的方式包括后臺式下載和非后臺式下載兩種模式。

后臺式下載:

在升級的時候,新固件在后臺悄悄下載,即新固件下載屬于應用程序功能的一部分,在新固件下載過程中,應用可以正常使用,也就是說整個下載過程對用戶來說是無感的,下載完成后,系統(tǒng)再跳到BootLoader程序,由BootLoader完成新固件覆蓋老固件的操作。比如智能手機升級Android或者iOS系統(tǒng)都是采用后臺式方式,新系統(tǒng)下載過程中,手機可以正常使用。

非后臺式下載:

在升級的時候,系統(tǒng)需要先從應用程序跳入到BootLoader程序,由BootLoader進行新固件下載工作,下載完成后BootLoader繼續(xù)完成新固件覆蓋老固件的操作,至此升級結(jié)束。早先的功能機就是采用非后臺來升級操作系統(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的公鑰解密簽名文件的過程,叫做"驗簽")

密碼學基礎概念:

1.什么是消息摘要?

2.什么是非對稱加解密?私鑰與公鑰?

3.什么是數(shù)字簽名?

數(shù)字簽名的作用:

保證數(shù)據(jù)完整性,機密性和發(fā)送方角色的不可抵賴性。

消息摘要函數(shù):

MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512

數(shù)字簽名算法:

RSA、Rabin方式、ElGamal方式、DSA

2.1 ?制作升級包
通過簽名工具使用簽名算法對固件進行數(shù)字簽名,簽名后的文件即為升級包。

升級包的內(nèi)容一般包括firmware、header和signature value。

Firmware:固件

Header:頭部信息。存放配置信息,如版本號、產(chǎn)品類型等。

Signature value:簽名值。對firmware和header簽名后的值。

簽名工具:

上位機軟件,能計算固件的簽名值,并將固件打包為升級包的格式。

固件簽名:

上位機軟件先計算整個固件的消息摘要,使用非對稱密碼的私鑰對摘要進行加密,

被加密后的消息摘要數(shù)據(jù)就是簽名值

固件簽名的意義:

計算hash值可以識別固件是否被篡改和偽裝,確保固件的完整性。

使用非對稱秘鑰簽名方便后續(xù)驗證升級包身份的合法性。

2.2? 下載升級包

根據(jù)上位機軟件和MCU設備約定的通信協(xié)議,上位機軟件將升級包通過OTA方式發(fā)送給MCU設備,

MCU設備收到數(shù)據(jù)后,根據(jù)通信協(xié)議解析出升級包的數(shù)據(jù),并將升級包的數(shù)據(jù)保存到存儲器中。

通信協(xié)議的作用:

通訊雙方約定俗成地用于數(shù)據(jù)交流的格式。

下載的方式:

1.在應用程序中下載:后臺式

2.在BootLoader中下載:非后臺式

2.3? 驗簽升級包

MCU設備接收完所有的升級包后,先計算升級包中固件的摘要,然后使用非對稱秘鑰的

公鑰解密升級包的簽名值,如果解密出來的固件摘要與自己計算的摘要相同,則驗簽成功。

2.4? 更新固件

驗簽成功保證了固件的完整性和合法性后,MCU設備從應用程序進入BootLoader程序,

在BootLoader程序中將flash中的新固件數(shù)據(jù)搬運到舊固件的存儲區(qū),將其覆蓋。

然后BootLoader程序啟動固件運行,此時固件為新固件。

flash固件數(shù)據(jù)更新:

擦除flash,寫flash。

在使用分區(qū)表時,最簡單的方法就是打開項目配置菜單(idf.py?menuconfig),并在?CONFIG_PARTITION_TABLE_TYPE?下選擇一個預定義的分區(qū)表:

  • “Single factory app, no OTA”

  • “Factory app, two OTA definitions”

  • 分區(qū)表設置成Factory app, two OTA definitions

  • 這里我們選擇如下:

  • 在以上兩種選項中,出廠應用程序均將被燒錄至 flash 的 0x10000 偏移地址處。這時,運行?idf.py partition-table?,即可以打印當前使用分區(qū)表的信息摘要(當然肯定是得先燒寫程序到ESP32里面)
  • ?

    ?

  • ?

    ?

    輸入 idf.py monitor,結(jié)果如下

?分區(qū)表設置成Single factory app, no OTA

?輸入 idf.py monitor,結(jié)果如下

?

?分區(qū)表設置為Single factory app(large),no OTA

?

?

?

?接下來演示在本地 PC 端搭建 http 服務器實現(xiàn)?ESP32?OTA 過程

?設置 WiFi 賬號密碼:

?

注意:wifi的SSID和密碼一定要跟連接的熱點或者路由器一致。

?使能 HTTP OTA:

?由于 ESP-IDF 默認為 HTTPS OTA,需要在?menuconfig?里打開以下選項來讓 HTTP OTA 成功進行

?

準備需要 OTA 的 Bin 文件

在此處以需要升級的 Bin 為 helloworld.bin?為例,將?helloworld.bin?文件放在build目錄下?

?

?查詢 python 版本,執(zhí)行如下命令:

?

  • 如果上述指令返回的 Python 版本是 3.X ,通過如下命令建立服務器

?

??查詢本機 IP

在任意終端輸入?ipconfig,結(jié)果如下

?

可以看到 PC 的 ip 地址為?192.168.1.102?,后續(xù)在填寫 OTA URL 時需要用到此 ip。?

?注:服務器建立好后,可通過網(wǎng)址 ip地址:8070?在網(wǎng)頁端查詢本地服務器(ip地址為pc機的地址)

?

?這個目錄列表就是終端的路徑下的。

進入網(wǎng)頁后,這里主要是復制hello_world.bin的地址

?我這里復制到的地址如下所示,這就是新固件的下載地址待會需要用到

?

配置 OTA URL?

?menuconfig 里配置 OTA URL 為?http://192.168.1.102:8070/hello_world.bin

1.到此升級包準備工作已經(jīng)完成
2.那個http服務端需要一直打開,不能關閉
3.你的電腦必須是在2.4G頻段的wifi,否則ESP32無法和電腦在同一個局域網(wǎng)內(nèi)
4.點擊hello_world.bin,看看能不能下載,如果不能下載,可能是電腦的防火墻攔截了,可以關閉防火墻試試。否則你的ESP32也是不能下載到固件的
?

?檢查分區(qū)表

在上述 menuconfig 里檢查分區(qū)表是否選擇為正確包含 OTA 分區(qū)的分區(qū)表,OTA 示例里會默認做以下修改:?

?

?

?開始 OTA

此時在 OTA 示例終端 下輸入?idf.py flash monitor?編譯燒寫 OTA 示例至 ESP32 中即可發(fā)現(xiàn) OTA 升級成功。?

?

總結(jié)

以上是生活随笔為你收集整理的OTA的学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。