GUIDE / ESPFLASH

一份实用指南:在 ESP32 上启用 OTA(空中升级),并通过 Android 手机上的 ESPFlash 推送新固件。

如何使用 ESPFlash 为 ESP32 设置 OTA 空中升级

在物联网(IoT)与嵌入式设备开发中,空中固件升级(OTA,Over-The-Air)是一项不可或缺的关键能力。当你的 ESP32 设备已经封装进外壳、安装到工业控制箱,或者部署在户外等难以触及的位置时,每一次升级都拆卸外壳并连接 USB 线显然不切实际。通过 Wi-Fi 进行 OTA 升级,不仅可以随时推送新功能和安全补丁,还能大幅缩短实地测试阶段的迭代周期。

本文将介绍如何在 ESP32 上规划 OTA 架构,并展示未来如何通过 Android 移动端工具 ESPFlash 直接无线推送新固件。

OTA 升级的前提条件

在尝试无线更新固件之前,必须满足以下三个前提:

  1. 初始有线固件烧录: 首次烧录必须通过物理连接完成。你可以使用 Android 手机配合 USB OTG 线,通过 ESPFlash 将包含 OTA 引导程序的初始固件刷入 ESP32。
  2. 支持 OTA 的 Flash 分区方案: ESP32 的片上 Flash 必须划分出至少两个应用程序分区,用于接收新固件和版本回滚。
  3. 可靠的局域网 Wi-Fi 连接: ESP32 必须能稳定接入局域网,确保设备在升级过程中与手机处于同一网段并保持通信连续。

步骤 1:配置 OTA 分区表(Partition Table)

ESP32 采用双分区机制(A/B 机制)实现安全的无缝升级。在标准双 OTA 配置中,Flash 中包含两个应用槽位:ota_0ota_1,以及用于记录当前激活分区的 otadata

典型的 4MB Flash 分区表(partitions.csv)结构如下:

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
ota_0,    app,  ota_0,   0x10000, 0x180000,
ota_1,    app,  ota_1,   0x190000,0x180000,

乒乓切换机制: 当前系统从 ota_0 运行时,新固件会被写入 ota_1;烧录校验完成后,系统更新 otadata 中的引导标记并重启。如果新固件启动失败,看门狗或回滚机制可自动切回上一版本,有效防止设备变砖。

步骤 2:准备支持 OTA 的固件代码

无论是基于 Arduino 还是 ESP-IDF,固件内都需要包含网络初始化与 OTA 监听逻辑。

Arduino 环境示例

使用官方内置的 ArduinoOTA 库即可快速启用监听:

#include <WiFi.h>
#include <ArduinoOTA.h>

void setup() {
  Serial.begin(115200);
  WiFi.begin("YOUR_SSID", "YOUR_PASSWORD");
  while (WiFi.status() != WL_CONNECTED) delay(500);

  ArduinoOTA.setHostname("esp32-node");
  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle(); // 保证此函数得到周期性执行
  // 其他应用业务逻辑...
}

注意: 必须确保 ArduinoOTA.handle() 能够高频执行,避免主循环中出现长时间的 delay() 阻塞,否则可能导致 OTA 传输超时断开。

ESP-IDF 环境

在 ESP-IDF 开发中,可以通过 esp_https_ota 组件或底层的 esp_ota_ops API 实现固件写入与校验流程,具有更高的安全性与任务调度灵活性。

步骤 3:使用 ESPFlash 从 Android 推送 OTA 更新

传统 OTA 流程往往依赖电脑运行 Python 脚本或 IDE 插件。而在工程现场,携带笔记本电脑并不方便。

为了让嵌入式更新更加轻量灵活,ESPFlash 即将支持从 Android 设备直接进行 OTA 固件推送

即将支持的 OTA 升级工作流程如下:

  1. 导出固件: 在 IDE 中编译固件并导出标准 .bin 二进制镜像,保存在手机本地存储或网盘中。
  2. 发现目标设备: 确保手机与 ESP32 处于同一 Wi-Fi 网络,在 ESPFlash 中进入 OTA 模式,通过 mDNS 自动发现设备或直接输入 ESP32 的局域网 IP 地址。
  3. 推送并写入: 选择 .bin 固件文件,点击开始升级。ESPFlash 会通过无线网络将数据切片推送到 ESP32 的备用 OTA 分区。
  4. 验证与自动重启: 传输完毕且校验通过后,ESP32 将自动切换分区并完成重启。

配合手机端的 SerialFlow Terminal,你可以通过 Wi-Fi 终端或随后连接 USB 串口实时查看固件启动与运行日志,确认升级结果。

常见 OTA 问题与排查指南

  • 设备无法被搜索或握手超时: 检查 Wi-Fi 路由器是否启用了“AP 隔离(Client Isolation)”,该设置会阻止局域网设备间直接通信;同时确认 ESP32 信号强度良好。
  • 提示空间不足(Not enough space): 说明编译生成的固件体积超过了分区表中预留给 ota_0/ota_1 的容量(如超出了 1.5MB)。此时需要精简固件依赖或调整分区表大小。
  • 固件刷入后发生崩溃循环: 设备重启后若由于内存泄漏或驱动崩溃,可借助 SerialFlow Terminal 捕获首屏引导输出,判断是引导指针异常还是应用业务代码触发了硬件断言。

结语

将双分区安全升级机制与移动端工具相结合,是现代嵌入式运维的大势所趋。随着 ESPFlash 对 OTA 功能的即将引入,从最初的有线 USB 刷机到底层的空中固件维护,开发者均可仅凭一台 Android 手机从容应对各种现场需求。