Skip to content

ESP32-OTA初探

🚀 ESP32 OTA 固件升级 | 让设备秒变“自我进化”!

一、OTA介绍

OTA(Over-The-Air) 技术是通过无线网络对设备进行远程更新和管理的方式。简单来说,就是“空中下载”技术,让设备不需要物理连接就能接收固件、软件更新,或者配置变更。

OTA的基本流程如下:

  1. 检测更新:设备通过HTTP/MQTT等协议向服务器请求检查是否有新固件。
  2. 下载固件:确认有新版本后,设备开始下载固件,一般采用分块下载以减少错误率。
  3. 校验完整性:下载完成后通过校验(如MD5、SHA256)确保文件未损坏。
  4. 写入并重启:将固件写入Flash的特定分区,然后重启设备进入新固件。
  5. 回滚机制(可选):若新固件启动失败,设备自动回滚到旧版本。

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作为示例演示:

拉取代码:

sh
git clone https://github.com/DuRuofu/ESP32-OTA-Manager.git

进入文件夹,并安装依赖:

sh
cd ESP32-OTA-Manager
pnpm i

需要事先安装node.js 和pnpm包管理器,可参考:XXX

使用pnpm start,运行项目,如下:

点击打开链接,如下:

默认密码为 admin,打开后下一个界面如下:

拖拽固件到页面上,输入版本号:

成功后如下:

这时候我们就可以点击下载按键下载这个固件了。

安装node.js :

apt update && apt install -y nodejs npm

三、示例程序解读

四、常用命令

sh
# 擦除 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

参考:

  1. https://espressif-docs.readthedocs-hosted.com/projects/espressif-esp-moonlight/zh-cn/latest/firmwareupgrade.html