当前位置: 首页 > 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

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

http://www.xdnf.cn/news/7633.html

相关文章:

  • 【Spring Boot】MyBatis入门:连接Mysql数据库、测试单元、连接的常见错误
  • 汇编语言中的数据
  • 基于C++(MFC)的细胞识别程序
  • 人工智能在后端开发中的革命:从架构到运维
  • 前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
  • 极狐GitLab 项目导入导出设置介绍?
  • 架构师面试(三十一):IM 消息收发逻辑
  • 手撕STL——vector
  • 利用DeepSeek设计一个HTML批量转换工具设计
  • Hadoop的三大结构及其作用?
  • hadoop的三大结构及各自的作用
  • yarn的定义
  • 「数据可视化 D3系列」入门第九章:交互式操作详解
  • 自动驾驶与机器人算法学习
  • 【区块链通用服务平台及组件】京北方分布式身份管理平台 | FISCO BCOS 应用案例
  • java八股之并发编程
  • 医院数据中心智能化数据上报与调数机制设计
  • 仿腾讯会议项目开发——界面关闭功能实现
  • Flink介绍——实时计算核心论文之Kafka论文详解
  • java输出、输入语句
  • Vue3 Composition API与十大组件开发案例详解
  • 杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其四
  • 【datawhaleAI春训营第一期笔记】AI+航空安全
  • Tensorflow实现用接口调用模型训练和停止训练功能
  • Mac mini 安装mysql数据库以及出现的一些问题的解决方案
  • 【前端HTML生成二维码——MQ】
  • uni-app 安卓10以上上传原图解决方案
  • 基于FPGA的AES加解密系统verilog实现,包含testbench和开发板硬件测试
  • 4.Rust+Axum Tower 中间件实战:从集成到自定义
  • 【Leetcode 每日一题】2364. 统计坏数对的数目