当前位置: 首页 > news >正文

ESP32之本地HTTP服务器OTA固件升级流程,基于VSCode环境下的ESP-IDF开发(附源码)

背景知识:

本实验利用编译链内Python内置的 HTTP 服务器,将升级包通过http发送给设备,实现OTA固件升级。

目录

背景知识:

1.创建工程

1.1 创建OTA基础工程

3.编写、修改代码

3.1 修改menuconfig配置文件

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升级的关键步骤:

  1. 修改flash大小和OTA分区
  2. 修改WiFi账号、密码
  3. 固件的下载地址

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

思考:这种方式只能通过局域网升级,感觉有点鸡肋,在现实中有什么用处呢?

相关文章:

  • leetcode0112. 路径总和-easy
  • 每日算法【双指针算法】(Day 2-复写零)
  • 搜广推校招面经七十八
  • Linux系统编程之守护进程与调试技术
  • 施磊老师基于muduo网络库的集群聊天服务器(二)
  • 大模型如何突破“知识盲区”?一场静悄悄的技术革命正在发生
  • Pytest 的配置和命令行选项:掌控你的测试执行 (Pytest 系列之七)
  • VirtualBox导入 .ova 文件出错,怎么解决
  • 【Linux学习笔记】进程调度与切换之O(1)调度算法
  • Oracle日志系统之重做日志和归档日志
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(四级)答案 + 解析
  • Python项目调用Java数据接口实现CRUD操作
  • 什么是Python单例模式
  • Python 3.13 support for PyTorch
  • python中MongoDB 的两个驱动
  • 基于C++(MFC)图形编辑界面工具
  • 一个可以自定义Java服务名日志打印的小工具
  • CSS 文件格式
  • Ubuntu上安装Mysql
  • redis利用备忘录
  • 花3000元就能买“国际机构”的证书?揭秘假证产业链
  • 上海市政府常务会议部署多措并举促进消费,提高居民收入,减轻家庭负担
  • 动力电池、风光电设备退役潮来袭,国家队即将推出“再生计划”
  • 美菲开始举行年度军演,外交部:菲公然站在地区国家的对立面
  • 文甦任四川乐山市委副书记,曾赴外交部挂职副司长
  • 路面突陷大坑致车毁人亡,家属称不知谁来管,长治当地回应