ESP32之本地HTTP服务器OTA固件升级流程,基于VSCode环境下的ESP-IDF开发(附源码)
背景知识:
本实验利用编译链内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
思考:这种方式只能通过局域网升级,感觉有点鸡肋,在现实中有什么用处呢?