OTA的例子
注: 本指南適用於所有ota示例
概述
ESP32應用程序可以在運行時通過Wi-Fi或以太網從特定的服務器下載新圖像,然后將其閃存到某些分區中,從而進行升級。在ESP-IDF中有兩種方式可以進行空中(OTA)升級:
- 使用
app_update
組件提供的本地api. - 使用
esp_https_ota
組件提供的簡化api,它在原生OTA api上添加了一個抽象層,以便使用HTTPS協議進行升級。
分別在native_ota_example
和simple_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
- 注意: 這個URL的服務器部分(例如
192.168.2.106
)必須匹配生成證書和密鑰時使用CN字段。
- 注意: 這個URL的服務器部分(例如
構建和燒錄
運行 idf.py -p PORT flash monitor
來構建和flash項目. 這個命令將查找分區表是否具有ota_data分區(在我們的示例中),然后ota_data將擦除為initial。它允許從一個工廠分區運行新加載的應用程序。
(要退出串行監視器,請鍵入 Ctrl-]
)
有關配置和使用ESP-IDF構建項目的完整步驟,請參閱入門指南
示例輸出
HTTPS服務器運行
成功構建之后,我們需要創建一個自簽名證書,並運行一個簡單的HTTPS服務器,如下所示:
- 輸入一個包含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/
- 1
OTA示例的內部工作流
當示例啟動時,它會將“start OTA example”打印到控制台,然后:
- 使用配置好的SSID和密碼(Wi-Fi情況)或以太網連接到AP.
- 連接到HTTPS服務器並下載新映像.
- 將映像寫入flash,並從該映像配置下一個引導.
- 重新啟動
如果您想在升級之后回滾到工廠應用程序(或者當工廠分區不存在時回滾到第一個OTA分區),那么運行命idf.py erase_otadata
。它可以將ota_data分區擦除到初始狀態.
注意: 這假設該項目的分區表是設備上的分區表.
HTTPS服務器的輸出
FILE:hello-world.bin
ACCEPT
- 1
- 2
支持回滾
如果應用程序無法運行,此功能允許您回滾到以前的固件。 選項 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
, 添加了代碼來演示如何檢查應用程序的版本並防止無限的固件更新。只有新版本的應用程序才能下載。版本檢查是在收到第一個固件映像包之后執行的,其中包含有關固件版本的數據。申請版本可從以下三個地方選取:
- 如果在項目
PROJECT_VER
文件中設置PROJECT_VER變量,則使用它的值. - 否則,如果
$PROJECT_PATH/version.txt
存在,它的內容將用作PROJECT_VER
. - 否則,如果項目位於Git存儲庫中,則使用
git describe
的輸出. - 否則,
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