ESP32 OTA詳解-中文翻譯版

原文鏈接:https://github.com/espressif/esp-idf/tree/39f090a4f/examples/system/ota#error-ota_begin-error-err0x104

OTA的例子

注: 本指南適用於所有ota示例

概述

ESP32應用程序可以在運行時通過Wi-Fi或以太網從特定的服務器下載新圖像,然後將其閃存到某些分區中,從而進行升級。在ESP-IDF中有兩種方式可以進行空中(OTA)升級:

  • 使用app_update組件提供的本地api.
  • 使用esp_https_ota組件提供的簡化api,它在原生OTA api上添加了一個抽象層,以便使用HTTPS協議進行升級。

分別在native_ota_examplesimple_ota_example下的OTA演示中演示了這兩種方法。

爲了簡單起見,OTA示例通過在menuconfig中啓用CONFIG_PARTITION_TABLE_TWO_OTA選項來選擇預定義的分區表,該選項支持三個應用程序分區:工廠分區、OTA_0分區和OTA_1分區。有關分區表的更多信息,請參閱分區表.

在第一次引導時,引導加載程序將加載工廠應用程序圖像(即示例圖像),然後觸發OTA升級。它將從HTTPS服務器下載一個新映像並將其保存到OTA_0分區。它還會自動更新ota_data分區,以指示下一次重置時應該從哪個應用程序啓動。引導加載程序將讀取ota_data分區中的內容並運行所選的應用程序。

OTA工作流程如下圖所示:
在這裏插入圖片描述

如何使用這些例子

硬件要求

要運行OTA示例,您需要一個ESP32開發板(例如ESP32- wrover Kit)或ESP32核心板(例如ESP32- devkitc)。如果您想用以太網測試OTA,請確保您的板正確地設置了以太網。有關設置以太網的更多信息,請參閱以太網示例.

配置項目

打開項目配置菜單(idf.py menuconfig).

Example Connection Configuration 菜單中:

  • 根據您的板在Connect using中選擇網絡接口。目前我們同時支持Wi-Fi和以太網。

  • 如果你選擇了Wi-Fi接口,你還必須設置:

    • 您的ESP32將連接到的Wi-Fi SSID和Wi-Fi密碼
  • 如果你選擇了以太網接口,你還必須:

    • 在以太網物理層設備選項下設置物理層模型,如IP101。

Example Configuration 菜單中:

  • Firmware Upgrade URL選項中設置要下載的新固件的URL,其格式應該是https://<host-ip-address>:<host-port>/<firmware-image-filename>,例如https://192.168.2.106:8070/hello-world.bin

構建和燒錄

運行 idf.py -p PORT flash monitor 來構建和flash項目. 這個命令將查找分區表是否具有ota_data分區(在我們的示例中),然後ota_data將擦除爲initial。它允許從一個工廠分區運行新加載的應用程序。

(要退出串行監視器,請鍵入 Ctrl-])

有關配置和使用ESP-IDF構建項目的完整步驟,請參閱入門指南

示例輸出

HTTPS服務器運行

成功構建之後,我們需要創建一個自簽名證書,並運行一個簡單的HTTPS服務器,如下所示:

create_self_signed_certificate

  • 輸入一個包含HTTPS服務器根目錄的目錄,例如 cd build.
  • 要創建一個新的自簽名證書和密鑰,只需運行命令 openssl req -x509 -newkey rsa:2048 -keyout ca_key.pem -out ca_cert.pem -days 365 -nodes.
    • 當提示輸入Common Name (CN)時,輸入ESP32將連接到的服務器的名稱。對於這個示例,它可能是IP地址。HTTPS客戶機將確保CN與HTTPS URL中給出的地址匹配。
  • 要啓動HTTPS服務器,只需運行命令 openssl s_server -WWW -key ca_key.pem -cert ca_cert.pem -port 8070.
  • 在同一個目錄中,應該有ESP32稍後將下載的固件(例如hello-world.bin)。它也可以是任何其他的ESP-IDF應用程序,只要您還在menuconfig中更新Firmware Upgrade URL。惟一的區別是,當通過串行flash二進制文件時,二進制文件將flash到“工廠”應用程序分區,OTA更新將flash到OTA應用程序分區.
  • 注意: 如果您運行的防火牆軟件將阻止對端口8070的傳入訪問,請將其配置爲在運行示例時允許訪問。
  • 注意: 對於Windows用戶,您應該在 openssl命令之前添 winpty :
    • winpty openssl req -x509 -newkey rsa:2048 -keyout ca_key.pem -out ca_cert.pem -days 365 -nodes
    • winpty openssl s_server -WWW -key ca_key.pem -cert ca_cert.pem -port 8070

Flash證書到ESP32

在flash示例之前,請確保將生成的證書複製到OTA示例目錄中的server_certs目錄,以便將其與固件(例如cp ca_cert)一起flash到ESP32中。比如:cp ca_cert.pem ../server_certs/.

cp ca_cert.pem /path/to/ota/example/server_certs/

OTA示例的內部工作流

當示例啓動時,它會將“start OTA example”打印到控制檯,然後:

  1. 使用配置好的SSID和密碼(Wi-Fi情況)或以太網連接到AP.
  2. 連接到HTTPS服務器並下載新映像.
  3. 將映像寫入flash,並從該映像配置下一個引導.
  4. 重新啓動

如果您想在升級之後回滾到工廠應用程序(或者當工廠分區不存在時回滾到第一個OTA分區),那麼運行命idf.py erase_otadata。它可以將ota_data分區擦除到初始狀態.

注意: 這假設該項目的分區表是設備上的分區表.

HTTPS服務器的輸出

FILE:hello-world.bin
ACCEPT

支持回滾

如果應用程序無法運行,此功能允許您回滾到以前的固件。 選項 CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE 允許跟蹤應用程序的第一次引導(請參閱OTA文章).
對於 native_ota_example,添加了一些代碼來演示回滾是如何工作的。要使用它,您需要在menuconfig和CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE子菜單下啓用CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE選項來設置“用於診斷的GPIO輸入的數量”,以管理回滾過程.

要觸發回滾,必須在在第一個啓動時的消息診斷(5秒)…之前將GPIO拉低。如果GPIO沒有拉低,那麼應用程序的可操作性將得到確認.

支持應用程序的版本

對於 native_ota_example, 添加了代碼來演示如何檢查應用程序的版本並防止無限的固件更新。只有新版本的應用程序才能下載。版本檢查是在收到第一個固件映像包之後執行的,其中包含有關固件版本的數據。申請版本可從以下三個地方選取:

  1. 如果在項目 PROJECT_VER 文件中設置PROJECT_VER變量,則使用它的值.
  2. 否則,如果 $PROJECT_PATH/version.txt 存在,它的內容將用作 PROJECT_VER.
  3. 否則,如果項目位於Git存儲庫中,則使用 git describe的輸出.
  4. 否則, PROJECT_VER 將爲 “1”.

native_ota_example中, $PROJECT_PATH/version.txt 用於定義應用程序的版本. 更改文件中的版本以編譯新固件.

故障排除

  • 檢查你的電腦是否可以在它的IP上能ping ESP32,並且在menuconfig中IP、AP和其他配置設置是否正確。
  • 檢查是否有防火牆軟件在阻止PC上的傳入連接。
  • 通過檢查 curl -v https://<host-ip-address>:<host-port>/<firmware-image-filename>命令的輸出,檢查是否可以看到配置的文件(默認hello-world.bin)
  • 如果您有另一臺PC或電話,請嘗試從單獨的主機查看文件列表。

錯誤 “ota_begin error err=0x104”

如果您看到這個錯誤,那麼檢查分區表中配置的(和實際的)閃存大小是否足夠大,默認的“兩個OTA插槽”分區表只能處理4MB的flash大小。要使用較小flash大小的OTA,請創建一個自定義分區表CSV(查看components/partition_table)並在menuconfig中配置它。

如果更改分區佈局,通常明智的做法是在步驟之間運行idf.py erase_flash

.
.
.
.
.
.
.
.

>> 歡迎關注

頭條號:小鋒學長
微信公衆號:xfxuezhang

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章