单片机技术网|技术阅读
登录|注册

您现在的位置是:单片机技术网 > 技术阅读 > Arduino的OTA在线升级

Arduino的OTA在线升级

一、OTA 介绍

 OTA是Over-the-Air的缩写,中文意思是空中下载技术。通过移动通信(GSM或CDMA)的空中接口对SIM卡数据及应用进行远程管理的技术。空中接口可以采用WAP、GPRS、CDMA1X及短消息技术。OTA技术的应用,使得移动通信不仅可以提供语音和数据服务,而且还能提供新业务下载。
 在物联网(IoT)领域,尤其是嵌入式设备如ESP8266这样的Wi-Fi微控制器上,OTA功能允许设备通过无线连接接收并安装新的软件或固件更新。这对于远程管理和维护大量设备非常有用,因为它可以避免手动更新每一台设备的繁琐过程。
 在ESP8266的Arduino开发环境中,OTA功能是通过特定的库和代码实现的,允许开发者通过Wi-Fi连接将新的固件上传到设备中。这大大简化了固件更新的过程,并使得设备可以持续获得新的功能和修复。
 总的来说,OTA是一种强大且灵活的技术,使得嵌入式设备和物联网设备能够更方便地进行软件更新和维护。

二、OTA 代码

 工程使用Arduino IDE开发ESP8266模块并实现OTA(Over-The-Air)功能可以允许通过Wi-Fi连接远程更新设备上的固件。

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";

void setup() {
Serial.begin(115200);
delay(10);

// 连接到Wi-Fi网络
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

// 初始化mDNS和ArduinoOTA
if (!MDNS.begin("esp8266")) {
Serial.println("Error setting up mDNS");
} else {
Serial.println("mDNS responder started");
}

ArduinoOTA.setHostname("myesp8266");
ArduinoOTA.setPassword("your_ota_password");

ArduinoOTA.begin();

Serial.println("OTA address: " + ArduinoOTA.getLocalIp().toString() + ":8266");
}

void loop() {
// 检查是否有OTA更新
ArduinoOTA.handle();

// 在这里添加您的主循环代码
}

首先连接到Wi-Fi网络,然后初始化mDNS和ArduinoOTA。ArduinoOTA.setHostname():
设置设备的hostname。
ArduinoOTA.setPassword():
设置用于OTA更新的密码。
ArduinoOTA.begin():
启动OTA服务。
 代码上传成功并设备连接到Wi-Fi,就可以使用Arduino IDE的OTA功能来更新固件了。在Arduino IDE中,选择“工具”>“ESP8266 Sketch Data Upload”来上传新的固件。
注意:确保设备IP地址和OTA密码正确。
 按照上述操作在工具有没有发现ESP8266 Sketch Data Upload…
  可参考                                                                   https://mc.dfrobot.com.cn/thread-314415-1-1.html

三、第三方库 BGWiFiConfig

BGWiFiConfig 库支持OTA升级,修改官方代码进行测试,测试代码

#include <BGWiFiConfig.h>
BGWiFiConfig wifipw;

void setup() {
Serial.begin(115200);
Serial.println();
//Serial.println("V1.1");//初始版本无此打印信息,升级版本才有此打印信息
wifipw.begin();
wifipw.OTAbegin();
}

void loop() {
char rxBuf[10];
wifipw.Loop();
wifipw.OTALoop();
if( Serial.available() ) //检查串口是否有数据
{
String data = Serial.readStringUntil('\n');//读取数据
Serial.println("Rx:");
Serial.println(data);
std::memset(rxBuf,0,sizeof(rxBuf));
strcpy(rxBuf,data.c_str());
if(strcmp("wifiClear", rxBuf)==0)
wifipw.clearWiFi();

}
}

先进行配网,重新启动,获取连接网络后的本地地址,网页输入地址,选择需要升级的bin文件即可进行OTA在线升级。