【ESP32、ESP8266的OTA(Over-The-Air)无线方式固件升级】
1方法总结
Arduino IDE OTA:最简单,适合快速开发。
HTTP OTA:适合远程更新,需要 Web 服务器。
MQTT OTA:适合远程更新,需要 Web 服务器、适合已使用 MQTT 的项目。
SPIFFS OTA:适合本地存储固件的场景。
第三方库:提供更高级的功能和易用性例如:
AsyncElegantOTA:基于 AsyncWebServer 的 OTA 库,支持 Web 界面更新。
WiFiManager:结合 OTA 功能,支持配置 Wi-Fi 和 OTA 更新。
Arduino IDE OTA实践
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char* ssid = "你的WIFI账号";
const char* password = "你的WIFI密码";
void setup() {
Serial.begin(115200);
Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
// 初始化 OTA
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_SPIFFS
type = "filesystem";
}
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
}
烧录完成之后,重启开发板,通过Arduino IDE可以选择无线更新了

还是很实用的,特别是调试产品的时候,免拆、免插线
上传的时候还要输入一下密码就是你的WIFI密码

还有一点要注意:如果要一直使用Arduino OTA功能,更新的固件也必须包含ArduinoOTA,否则更新固件后这个功能就消失了,必须有线更新固件了。
WifiManager OTA实践
WiFiManager 是一个非常实用的库,它可以帮助 ESP8266 在无法连接到预配置的 Wi-Fi 网络时,自动启动一个配置热点(AP 模式),允许用户通过网页配置 Wi-Fi 信息。
#include <ESP8266WiFi.h> // ESP8266 Wi-Fi 库
#include <DNSServer.h> // DNS 服务器库
#include <ESP8266WebServer.h> // Web 服务器库
#include <WiFiManager.h> // WiFiManager 库
void setup() {
// 初始化串口通信
Serial.begin(115200);
// 初始化 WiFiManager
WiFiManager wifiManager;
// 可选:重置保存的 Wi-Fi 配置(用于测试)
wifiManager.resetSettings();
// 设置自定义 AP 名称(可选)
wifiManager.setConfigPortalTimeout(180); // 设置配置热点超时时间为 180 秒
// 设置回调函数,当进入配置模式时触发
wifiManager.setAPCallback([](WiFiManager *wm) {
Serial.println("Entered config mode");
Serial.println(WiFi.softAPIP()); // 打印 AP 模式的 IP 地址
Serial.println(wm->getConfigPortalSSID()); // 打印配置热点的 SSID
});
// 尝试连接到已保存的 Wi-Fi 网络
// 如果连接失败,启动配置热点
if (!wifiManager.autoConnect("ESP8266-Config")) {
Serial.println("Failed to connect and hit timeout");
// 如果连接失败,重启 ESP8266
ESP.restart();
delay(1000);
}
// 连接成功
Serial.println("Wi-Fi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // 打印 ESP8266 的 IP 地址
}
void loop() {
// 主循环
// 这里可以添加其他代码
}
注意代码第14行,测试时要放开 wifiManager.resetSettings();这个注释,否则设备自动联网成功就不会启动AP热点,你也就无法访问WiFiManager的网页了。
自动连接成功串口输出如下

自动连接失败串口输出如下

此时根据串口输出的信息我们可以访问其AP热点ESP8266-ConFig,以及网址:192.168.4.1


这样我们就能配置热点,也能上传固件了,同样注意新固件也要继续包含WifiManager功能更新后才能继续使用。

总结:固件更新时需要断开互联网,使用ESP自身的热点.
但是功能强大
1、可以用来配网
2、还可以获取一些参数。在 WiFiManager 中添加自定义参数非常简单。WiFiManager 提供了一个 WiFiManagerParameter 类,允许你在配置页面上添加额外的输入字段(如文本框、下拉菜单等)。这些参数的值可以在设备连接 Wi-Fi 后获取并用于配置。
请看文章:ESP8266基于WiFiManager设置页面添加参数并且掉电不丢失
HTTP、MQTT OTA实践(需要服务器基于巴法云)
这是最接近工程实践的,产品部署出去,服务器自动升级。
巴法云ESP32-OTA官方说明
巴法云ESP8266-OTA官方说明
运行测试:

