ESP8266或者ESP32 有一個問題,就是在上傳程序在開發(fā)板中里面的程序聯(lián)網(wǎng)IP是固定;
1、如果你的MQTT服務(wù)器換 ip、端口、域名等情況那么開發(fā)板將無法連接MQTT服務(wù)。
2、如果業(yè)務(wù)需求有變更需要在開發(fā)板原有的基礎(chǔ)增加一些功能,而這些開發(fā)板已經(jīng)上線部署在各的自動售賣機,那如果按照傳統(tǒng)方法,是不是要跑遍每個智能物聯(lián)網(wǎng)設(shè)備,拿根數(shù)據(jù)線連接電腦重新上傳燒錄程序???
所以這時候就需要進行OTA熱更新,類似于手機自動更新系統(tǒng)功能,自動獲取版本,并且下載安裝包在主板里,然后系統(tǒng)升級成功。
具體步驟流程
1、需要把 編譯后更新包,掛在服務(wù)器上,目的是能夠下載
比如我把下面的代碼熱更新到開發(fā)板里
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <MD5Builder.h>
// GPIO 5 D1
#define LED 5
#define JDQ D0 //繼電器
// WiFi
const char *ssid = "yang1"; // Enter your WiFi name
const char *password = "872332847"; // Enter WiFi password
// MQTT Broker
const char *mqtt_broker = "172.20.10.2";
const char *topic = "esp8266";
const char *mqtt_username = "admin";
const char *mqtt_password = "admints";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// Set software serial baud to 115200;
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(JDQ, OUTPUT);
digitalWrite(JDQ, HIGH);
// connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
//connecting to a mqtt broker
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public emqx mqtt broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(1000);
}
}
// publish and subscribe
client.publish(topic, "hello emqx");
client.subscribe(topic);
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i]; // convert *byte to string
}
Serial.print(message);
// 解析JSON數(shù)據(jù)
DynamicJsonDocument jsondoc(1024);
deserializeJson(jsondoc, message);
JsonObject obj = jsondoc.as<JsonObject>();
String type = obj["type"];
String value = obj["msg"];
//LED
if (type == "LED") {
if (value == "ON") {
digitalWrite(LED, LOW);
digitalWrite(LED_BUILTIN, LOW);
}
if (value == "OFF") {
digitalWrite(LED, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
}
}
//繼電器
if (type == "JDQ") {
if (value == "ON") {
digitalWrite(JDQ, LOW);
}
if (value == "OFF") {
digitalWrite(JDQ, HIGH);
}
}
//digitalWrite(LED, LOW);
/*
if (value == "on") {
digitalWrite(LED, LOW);
digitalWrite(LED_BUILTIN, LOW);
} // LED on
if (value == "off") {
digitalWrite(LED, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
} // LED off
*/
Serial.println();
Serial.println("-----------------------");
}
void loop() {
client.loop();
}
把以上代碼編譯成二進制文件以上編譯成二進制文件,接下來我們掛在服務(wù)器上面,能夠下載就行
下面以最簡單的方式,方便演示直接掛在iis 默認文件下面看一下是否能下載
2、需要使用 #include <ESP8266httpUpdate.h>
熱更新庫
3、上傳程序String upUrl = "http://172.20.10.2/ad/sketch.bin"; //更新包地址 也就是剛剛部署在iis上面的bin文件
文章來源:http://www.zghlxwxcb.cn/news/detail-645611.html
#include <ESP8266WiFi.h>
#include <ESP8266httpUpdate.h>
/******需要修改的地方****************/
#define wifi_name "yang1" //WIFI名稱,區(qū)分大小寫,不要寫錯
#define wifi_password "872332847" //WIFI密碼
//固件鏈接,在巴法云控制臺復(fù)制、粘貼到這里即可
String upUrl = "http://172.20.10.2/ad/sketch.bin"; //更新包地址
/**********************************/
/*
* 主函數(shù)
*/
void setup() {
Serial.begin(115200); //波特率115200
WiFi.begin(wifi_name, wifi_password); //連接wifi
while (WiFi.status() != WL_CONNECTED) { //等待連接wifi
delay(500);
Serial.println("Connecting to WiFi..");
}
updateBin(); //開始升級
}
/**
* 循環(huán)函數(shù)
*/
void loop() {
}
//當(dāng)升級開始時,打印日志
void update_started() {
Serial.println("CALLBACK: HTTP update process started");
}
//當(dāng)升級結(jié)束時,打印日志
void update_finished() {
Serial.println("CALLBACK: HTTP update process finished");
}
//當(dāng)升級中,打印日志
void update_progress(int cur, int total) {
Serial.printf("CALLBACK: HTTP update process at %d of %d bytes...\n", cur, total);
}
//當(dāng)升級失敗時,打印日志
void update_error(int err) {
Serial.printf("CALLBACK: HTTP update fatal error code %d\n", err);
}
/**
* 固件升級函數(shù)
* 在需要升級的地方,加上這個函數(shù)即可,例如setup中加的updateBin();
* 原理:通過http請求獲取遠程固件,實現(xiàn)升級
*/
void updateBin(){
Serial.println("start update");
WiFiClient UpdateClient;
ESPhttpUpdate.onStart(update_started);//當(dāng)升級開始時
ESPhttpUpdate.onEnd(update_finished); //當(dāng)升級結(jié)束時
ESPhttpUpdate.onProgress(update_progress); //當(dāng)升級中
ESPhttpUpdate.onError(update_error); //當(dāng)升級失敗時
t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient, upUrl);
Serial.println(ret);
Serial.println("測試2");
switch(ret) {
case HTTP_UPDATE_FAILED: //當(dāng)升級失敗
Serial.println("[update] Update failed.");
break;
case HTTP_UPDATE_NO_UPDATES: //當(dāng)無升級
Serial.println("[update] Update no Update.");
break;
case HTTP_UPDATE_OK: //當(dāng)升級成功
Serial.println("[update] Update ok.");
break;
}
}
連接開發(fā)板上傳程序這時候開發(fā)板上面的程序就會自動更新到我們剛剛部署編譯成二進制bin文件文章來源地址http://www.zghlxwxcb.cn/news/detail-645611.html
到了這里,關(guān)于ESP8266 OTA(無線遠程升級)熱更新的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!