跳转到内容

Arduino OTA 配置

Arduino OTA 配置

本节介绍 Arduino OTA 的配置和使用方法。Arduino OTA 是最简单的 OTA 实现方式,适合开发和调试阶段。学习完成后,您将能够:

  • 在 Arduino IDE 中配置 Arduino OTA
  • 理解 Arduino OTA 的工作原理
  • 通过 WiFi 远程上传固件到 ESP32
  • 评估 Arduino OTA 的适用场景

在开始本节之前,请确保:

  • ESP32 板级包已安装在 Arduino IDE 中
  • ESP32 已连接到 WiFi 网络
  • 了解 Arduino OTA 的基本概念

Arduino OTA 功能由 ArduinoOTA 库提供,该库随 ESP32 Arduino 核心包一起安装:

#include <WiFi.h>
#include <ArduinoOTA.h>
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
void setup() {
Serial.begin(115200);
Serial.println("正在启动...");
// 1. 连接 WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi 连接失败,重试中...");
WiFi.begin(ssid, password);
delay(5000);
}
Serial.println("WiFi 已连接");
Serial.print("IP 地址: ");
Serial.println(WiFi.localIP());
// 2. 配置 Arduino OTA
ArduinoOTA.setHostname("esp32-ota-demo"); // 设备名称
ArduinoOTA.setPassword("admin123"); // OTA 密码(可选)
// 3. 注册回调函数
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_SPIFFS
type = "filesystem";
}
Serial.println("开始 OTA: " + type);
})
.onEnd([]() {
Serial.println("\nOTA 完成");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("进度: %u%%\r", (progress * 100) / total);
})
.onError([](ota_error_t error) {
Serial.printf("OTA 错误[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("认证失败");
else if (error == OTA_BEGIN_ERROR) Serial.println("开始失败");
else if (error == OTA_CONNECT_ERROR) Serial.println("连接失败");
else if (error == OTA_RECEIVE_ERROR) Serial.println("接收失败");
else if (error == OTA_END_ERROR) Serial.println("结束失败");
});
ArduinoOTA.begin();
Serial.println("Arduino OTA 就绪");
}
void loop() {
// 必须在 loop 中调用 handle() 以保持 OTA 可用
ArduinoOTA.handle();
// 其他业务逻辑
delay(10);
}
配置项说明推荐值
setHostname()网络标识名,用于 mDNS 发现设备唯一名称
setPassword()OTA 认证密码(可选)建议设置,防止未授权访问
onStart()OTA 开始前回调可用于关中断、停任务
onEnd()OTA 完成后回调日志记录
onProgress()进度回调UI 显示进度
onError()错误处理错误日志和诊断
  1. 编译固件

    • 在 Arduino IDE 中正常编译(Sketch → Verify/Compile)
  2. 选择网络端口

    • 菜单:Tools → Port → Network Ports
    • 选择 esp32-ota-demo at 192.168.x.x
  3. 上传固件

    • 菜单:Sketch → Upload
    • 或使用快捷键 Ctrl+U / Cmd+U
  4. 监控进度

    • Arduino IDE 底部状态栏显示进度
    • 串口监视器输出进度百分比
Arduino OTA 上传过程:
[==============================] 100%
✓ 上传完成
✓ 设备自动重启
✓ 新固件开始运行
步骤描述耗时(典型)
编译将代码编译为二进制文件5-15 秒
连接通过 mDNS 发现设备1-2 秒
身份认证密码验证<1 秒
固件传输通过 WiFi 发送二制数据10-30 秒(1MB)
校验CRC 验证完整性1-2 秒
重启切换到新分区并重启2-5 秒
总计20-55 秒

Arduino OTA 使用 mDNS(Multicast DNS)服务发现局域网内的设备:

设备名称: esp32-ota-demo.local
服务类型: _arduino._tcp
端口: 3232

mDNS 的特点

  • 无需手动输入 IP 地址
  • 自动发现局域网内所有 Arduino OTA 设备
  • 支持设备名称解析

如果 OTA 上传失败,检查以下端口是否被防火墙阻止:

协议端口用途
UDP5353mDNS 服务发现
TCP3232OTA 数据传输
问题原因解决方案
”No network ports found”mDNS 未正常工作检查 ESP32 是否连接 WiFi
上传中途断开WiFi 信号弱靠近路由器,或使用信号放大器
”Authentication failed”密码错误检查 setPassword() 配置
上传成功但无变化上传了相同的固件确认版本号或代码有差异
OTA handle 导致卡顿handle() 调用频率不足确保 loop 中频繁调用
限制说明影响
局域网范围仅限同一子网无法互联网远程升级
手动操作需逐个设备上传无法批量管理
无版本管理不追踪固件版本难以管理设备群
无安全加密密码明文传输局域网风险较低但存在
IDE 依赖依赖 Arduino IDE不适合自动化部署
场景适用性建议
实验室原型验证✅ 非常适合快速迭代
客户 PoC 演示✅ 可以设备数量少时可行
小批量生产(<10)⚠️ 勉强逐个升级费时
大规模部署(>50)❌ 不推荐需 HTTP/HTTPS OTA

本节介绍了 Arduino OTA 的配置方法:

  1. 代码配置:WiFi 连接 + ArduinoOTA 初始化 + loop 中 handle
  2. 上传操作:Arduino IDE 中选择网络端口上传
  3. 适用场景:开发调试和小批量原型验证
  4. 主要限制:局域网范围、单设备操作、无版本管理