背景知識:
本實驗利用編譯鏈內Python內置的 HTTP 服務器,將升級包通過http發送給設備,實現OTA固件升級。
目錄
背景知識:
1.創建工程
1.1 創建OTA基礎工程
3.編寫、修改代碼
3.1.1 配置WiFi賬號和密碼
3.1.2配置flash和partition分區表
(1)不修改分區大小
(2)要修改分區大小
3.2 設置版本號
3.2.1 設置版本號
3.2.2 打印版本號
(1)編寫獲取版本號函數
(2)調用獲取版本號函數
4.驗證功能
4.1?運行HTTP本地服務器
(1)建立本地服務器
方式1:利用cmd命令窗口
方式2:利用VSCode窗口
(2)打開瀏覽器,獲取http下載地址
4.2 修改http的url下載地址
4.2.1 更改url下載地址
4.2.2 燒錄測試升級
(1)生成正式升級包
(2)燒錄初始代碼
(3)觀察OTA升級現象
5.注意事項
6.總結
7.參考文檔
8.源碼下載
1.創建工程
1.1 創建OTA基礎工程
3.編寫、修改代碼
3.1 修改menuconfig配置文件
3.1.1 配置WiFi賬號和密碼
3.1.2配置flash和partition分區表
(1)不修改分區大小
如果不修改分區大小,選擇默認配置即可:
(2)要修改分區大小
如果需要修改分區大小,則需從\Espressif\frameworks\esp-idf-v5.3.2\components\partition_table路徑中復制一個partitions_two_ota.csv文件到工程路徑,并將factory、ota_0、ota_1三者的size改成合適大小。
放到這里,并更改分區大小:
注意:修改分區大小后,
- 注意Flash大小是否足夠,不夠則需要修改大小;
- 要將Partition Table的值改成Custom partition table CSV;
- 要將Custom partition CSV file的值改成partitions_two_ota.csv。
3.2 設置版本號
3.2.1 設置版本號
在工程根目錄的cMakeList.txt中加入set(PROJECT_VER "1.0.0") 設置當前版本號:
3.2.2 打印版本號
(1)編寫獲取版本號函數
//獲取當前應用版本號
const char* get_app_version(void)
{static char app_version[32] = {0};if (app_version[0] == 0){//獲取當前分區的基本信息const esp_partition_t* running = esp_ota_get_running_partition();//獲取更多的分區信息esp_app_desc_t running_desc;esp_ota_get_partition_description(running, &running_desc);snprintf(app_version, sizeof(app_version), "%s", running_desc.version);}return app_version;
}
(2)調用獲取版本號函數
4.驗證功能
4.1?運行HTTP本地服務器
先編譯生成的bin文件作為臨時升級包,然后隨便找個目錄新建個文件夾取名Server,并將臨時升級包放到文件夾內,改名為update_pack.bin。
若 Python 版本是 3.X,則指令為:
python -m http.server 8070
若 Python 版本是 2.X,則指令為:
python -m SimpleHTTPServer 8070
(1)建立本地服務器
方式1:利用cmd命令窗口
在Server文件夾下打開cmd命令窗口,并輸入命令python -m http.server 8070,然后回車:
方式2:利用VSCode窗口
用VSCode打開用于升級的程序(Server文件夾),在終端ESP-IDF Terminal窗口輸入命令python -m http.server 8070后回車,即可運行HTTP本地服務器:
(2)打開瀏覽器,獲取http下載地址
輸入http://192.168.1.100:8070/(輸入電腦實際IP地址,可以在cmd命令窗口輸入ipconfig查看),然后鼠標右鍵點擊update_pack.bin,選擇復制鏈接地址(http://:8070/update_pack.binhttp://192.168.1.100:8070/update_pack.binhttp://:8070/update_pack.bin):
4.2 修改http的url下載地址
4.2.1 更改url下載地址
將復制的地址http://192.168.1.100:8070/update_pack.bin粘貼到menuconfig的firmware upgrade url endpoint中:
4.2.2 燒錄測試升級
(1)生成正式升級包
先把版本號改成v1.0.1,編譯工程生成bin文件用做正式升級包,然后改名為update_pack.bin,并復制到Sever中替換原本的update_pack.bin,接著按照步驟4.1打開本地服務器。
(2)燒錄初始代碼
將版本號改回v1.0.0,編譯下載,并打開串口監視。
(3)觀察OTA升級現象
運行時顯示當前版本為1.0.0:
升級過程:
復位后運行升級后的版本,發現變成v1.0.1了,說明升級成功了:
后續如有新的版本,照此方法放到Server文件夾中替換原本的update_pack.bin文件,即可完成升級。
5.注意事項
- 電腦端和ESP32必須連接同一個WiFi熱點,即電腦端和設備端必須連接同一個局域網。
- 這種方法升級完成后如果不及時關閉本地服務器則會一直重復執行升級,要么升級完后及時關閉服務器,要么在代碼中加入限制,防止重復升級。
6.總結
OTA升級的關鍵步驟:
- 修改flash大小和OTA分區
- 修改WiFi賬號、密碼
- 固件的下載地址
7.參考文檔
圖文手把手教程--ESP32 OTA空中升級(VSCODE+IDF)-CSDN博客
【ESP32】通過本地服務器實現OTA功能_esp32 ota-CSDN博客
2022.05 ESP32 空中升級 OTA_esp32c3 ota-CSDN博客
8.源碼下載
https://download.csdn.net/download/Freddy_Ssc/90641093
思考:這種方式只能通過局域網升級,感覺有點雞肋,在現實中有什么用處呢?