一、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在线升级。