GUIDE / ESPFLASH
一份实用指南:在 ESP32 上启用 OTA(空中升级),并通过 Android 手机上的 ESPFlash 推送新固件。
如何使用 ESPFlash 为 ESP32 设置 OTA 空中升级
在物联网(IoT)与嵌入式设备开发中,空中固件升级(OTA,Over-The-Air)是一项不可或缺的关键能力。当你的 ESP32 设备已经封装进外壳、安装到工业控制箱,或者部署在户外等难以触及的位置时,每一次升级都拆卸外壳并连接 USB 线显然不切实际。通过 Wi-Fi 进行 OTA 升级,不仅可以随时推送新功能和安全补丁,还能大幅缩短实地测试阶段的迭代周期。
本文将介绍如何在 ESP32 上规划 OTA 架构,并展示未来如何通过 Android 移动端工具 ESPFlash 直接无线推送新固件。
OTA 升级的前提条件
在尝试无线更新固件之前,必须满足以下三个前提:
- 初始有线固件烧录: 首次烧录必须通过物理连接完成。你可以使用 Android 手机配合 USB OTG 线,通过 ESPFlash 将包含 OTA 引导程序的初始固件刷入 ESP32。
- 支持 OTA 的 Flash 分区方案: ESP32 的片上 Flash 必须划分出至少两个应用程序分区,用于接收新固件和版本回滚。
- 可靠的局域网 Wi-Fi 连接: ESP32 必须能稳定接入局域网,确保设备在升级过程中与手机处于同一网段并保持通信连续。
步骤 1:配置 OTA 分区表(Partition Table)
ESP32 采用双分区机制(A/B 机制)实现安全的无缝升级。在标准双 OTA 配置中,Flash 中包含两个应用槽位:ota_0 和 ota_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 升级工作流程如下:
- 导出固件: 在 IDE 中编译固件并导出标准
.bin二进制镜像,保存在手机本地存储或网盘中。 - 发现目标设备: 确保手机与 ESP32 处于同一 Wi-Fi 网络,在 ESPFlash 中进入 OTA 模式,通过 mDNS 自动发现设备或直接输入 ESP32 的局域网 IP 地址。
- 推送并写入: 选择
.bin固件文件,点击开始升级。ESPFlash 会通过无线网络将数据切片推送到 ESP32 的备用 OTA 分区。 - 验证与自动重启: 传输完毕且校验通过后,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 手机从容应对各种现场需求。