ESP32-OTA初探
🚀 ESP32 OTA 固件升级 | 让设备秒变“自我进化”!
- 💡 碎碎念😎:本文档记录如何实现 ESP32 从指定的 URL 更新固件的 OTA 功能,并讲解官方示例程序。
- 📺 视频教程:🚧 开发中
- 💾 示例程序:✅ [点击查看代码]
- 📚 官网文档: API 参考 » 系统 API » 空中升级 (OTA)
- 💻 官方示例程序: esp-idf/examples/system/ota
一、OTA介绍
OTA(Over-The-Air) 技术是通过无线网络对设备进行远程更新和管理的方式。简单来说,就是“空中下载”技术,让设备不需要物理连接就能接收固件、软件更新,或者配置变更。
OTA的基本流程如下:
- 检测更新:设备通过HTTP/MQTT等协议向服务器请求检查是否有新固件。
- 下载固件:确认有新版本后,设备开始下载固件,一般采用分块下载以减少错误率。
- 校验完整性:下载完成后通过校验(如MD5、SHA256)确保文件未损坏。
- 写入并重启:将固件写入Flash的特定分区,然后重启设备进入新固件。
- 回滚机制(可选):若新固件启动失败,设备自动回滚到旧版本。
ESP32原生支持OTA,使用ESP-IDF提供的API可以方便地实现远程升级。ESP32通常使用双分区(A/B分区)模式进行OTA,这样可以确保升级失败时还能从旧版本启动。
二、尝试编译使用官方示例
我们尝试运行官方示例程序:esp-idf/examples/system/ota/simple_ota_example
这个示例程序实现了 ESP32 远程 OTA 固件升级,通过 HTTPS 下载新固件,校验 SHA-256 确保完整性,写入 OTA 分区,升级成功后自动重启运行新固件的流程。我们先尝试使用一下:
2.1 准备待升级固件:
首先我们要准备待升级的固件,这里我们使用一个hello world
程序固件作为待升级的程序:esp-idf/examples/get-started/hello_world
编译这个hello world
工程,保存编译后build
文件夹中的程序文件hello_world.bin
2.2 准备固件托管服务器:
可以按照示例程序下推荐的python进行文件托管,具体参考 https://github.com/espressif/esp-idf/tree/v5.2.4/examples/system/ota
也可以使用笔者自己使用node.js编写的服务器程序: https://github.com/DuRuofu/ESP32-OTA-Manager
不管使用那种方式,都是为了把待升级的固件文件托管起来,等待ESP32升级时下载,下面我使用自己写的ESP32-OTA-Manager
作为示例演示:
拉取代码:
git clone https://github.com/DuRuofu/ESP32-OTA-Manager.git
进入文件夹,并安装依赖:
cd ESP32-OTA-Manager
pnpm i
需要事先安装node.js 和pnpm包管理器,可参考:XXX
使用pnpm start
,运行项目,如下:
点击打开链接,如下:
默认密码为 admin
,打开后下一个界面如下:
拖拽固件到页面上,输入版本号:
成功后如下:
这时候我们就可以点击下载按键下载这个固件了。
安装node.js
:
apt update && apt install -y nodejs npm
三、示例程序解读
四、常用命令
# 擦除 otadata,将设备复位至工厂应用程序
otatool.py --port "/dev/ttyUSB1" erase_otadata
# 擦除 OTA 应用程序分区 0
otatool.py --port "/dev/ttyUSB1" erase_ota_partition --slot 0
# 将启动分区切换至 OTA 应用程序分区 1
otatool.py --port "/dev/ttyUSB1" switch_ota_partition --slot 1
# 读取 OTA 分区 'ota_3',将内容保存至文件 'ota_3.bin'
otatool.py --port "/dev/ttyUSB1" read_ota_partition --name=ota_3 --output=ota_3.bin