Advertisement

【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官方说明
运行测试:
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~