arduino esp32服务器 OTA升级

#include <WiFi.h>
#include <HTTPClient.h>
#include <ESP32httpUpdate.h>
#include <Arduino_JSON.h>
//#include <EEPROM.h>
/根据实际修改/
const char* wifi_ssid = “WDT-LINK”; // WIFI名称,区分大小写,不要写错
const char* wifi_password = “13770594783”; // WIFI密码

// 特别重要,升级依据!!!
// 设置当前代码版本 格式 1_0_0
char* version = “1_0_5”;
//远程固件链接,只支持http
const char* baseUpdateUrl = “http://192.168.0.75:8080/OTA/”;
const char* updateJson = “http://192.168.0.75:8080/OTA/esp32_update.json”;
#define LED1 8
#define LED2 21
int LINK_Wifitime = 0;
char Wififlag = 0;

// esp32_update.json
// {
// “version”:“1_0_1”
// }

/根据实际修改/
int need_ota_update = 0;
int i = 0;
String jsonBuffer;
// 获取远程 json 升级文件
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
String payload = “”;
//连接目标网址
http.begin(client, serverName);
//发送HTTP站点请求
int httpCode = http.GET();
if (httpCode > 0) {
Serial.printf(“[HTTP] GET… code: %d\n”, httpCode);
payload = http.getString();
} else {
Serial.printf(“[HTTP] GET… failed, error: %s\n”, http.errorToString(httpCode).c_str());
}

http.end(); //关闭连接
//返回获得的数据用于Json处理
return payload;
}

// 依据json文件中版本号与本地版本号,判断是否需要进行更新
void isOrNotNeedUpdate() {
// 获取远程的升级 json ,判断内部版本与本地是否相同,判断是否需要升级
jsonBuffer = httpGETRequest(updateJson);
Serial.println(jsonBuffer);
//将解析的Json对象值储存在Jsonu缓冲区中
JSONVar myObject = JSON.parse(jsonBuffer);
Serial.println(myObject);
// Serial.println(myObject[“version”]);
const char* ota_version = myObject[“version”];
// Serial.println(ota_version);

Serial.println(“—”);

Serial.print("远程版本: ");
Serial.println(ota_version);

Serial.print("本地版本: ");
Serial.println(version);
// char * 与 const char * 比较
// 判断远程版本与本地版本是否相同
if (String(version) == String(ota_version)) {
need_ota_update = 0;
Serial.println(“无需升级。。。”);
} else {
need_ota_update = 1;
Serial.println(“需要升级。。。”);
Serial.print(“OTA 升级地址为:”);
Serial.println(ota_version);
// 升级的完整链接, 例如:http://example.cn/esp32/esp32_1_0_1.bin
String fullUpdateUrl = String(baseUpdateUrl) + “OTAupdate.ino” + “.bin”;
Serial.println(String(fullUpdateUrl));
// 获取远程 bin 文件进行升级
t_httpUpdate_return ret = ESPhttpUpdate.update(fullUpdateUrl);
Serial.println(ret);
switch (ret) {
case HTTP_UPDATE_FAILED:
Serial.printf(“HTTP_UPDATE_FAILED Error (%d): %s\n”, ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println(“HTTP_UPDATE_NO_UPDATES”);
break;
case HTTP_UPDATE_OK:
Serial.println(“HTTP_UPDATE_OK”);
break;
default:
Serial.println(ret);
}
}
need_ota_update = 0;
}

void WiFILINK() {
LINK_Wifitime = 0;
Wififlag = 1;
WiFi.begin(wifi_ssid, wifi_password); //连接wifi
while ((WiFi.status() != WL_CONNECTED) && (LINK_Wifitime < 20)) { //等待连接wifi 连接20次连不上退出,不然程序就停在这!
delay(500);
LINK_Wifitime++;
Serial.print(“.”);
}
if (LINK_Wifitime > 15) {
Wififlag = 0;
}
// WiFi正常 调用判断是否需要升级函数
if (Wififlag == 1) {
isOrNotNeedUpdate();
} else {
Serial.print(“WiFi Connection ERR,”);
}
}

void setup() {
Serial.begin(115200); //波特率115200
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
Serial.print(“Connection WIFI”);
WiFILINK();
}

void loop() {
// 主程序
Serial.println(i);
i++;
Serial.println(version);
digitalWrite(LED2, LOW);
digitalWrite(LED1, HIGH);
delay(1000);
digitalWrite(LED2, HIGH);
digitalWrite(LED1, LOW);
delay(1000);
}

ESP32是一种具有低功耗的WiFi和蓝牙双模片,它可广泛应用于物联网项目中。而Arduino是一款开源的电子原型平台,提供简单易用的软件和硬件。在ESP32Arduino的结合下,可以实现蓝牙OTA(Over-The-Air)功能,即通过无线方式对固件进行升级。 蓝牙OTA是一种方便且灵活的升级方式,不需要使用USB或串口进行连接,使得固件升级更加简便。使用ESP32 Arduino库,我们可以轻松地在ESP32上实现蓝牙OTA功能。 要使用蓝牙OTA功能,首先需要确保ESP32正常连接到蓝牙设备上。可以使用ESP32的BluetoothSerial库来简化蓝牙串口通信。然后,我们需要准备新的固件文件并将其传输到ESP32。可以使用ESP32的WirelessUpdate库,该库提供了OTA功能所需的基本函数和方法。 在传输固件文件期间,我们需要确保蓝牙连接的稳定性和数据传输的完整性。可以在代码中使用一些检查和验证机制,如CRC校验,以确保固件的正确传输。 最后,需要在ESP32上配置OTA服务器的相关参数,如服务器的IP地址和固件文件的位置。一旦配置完成,ESP32就可以通过蓝牙连接到OTA服务器,并根据指令进行固件升级。 总结起来,ESP32 Arduino蓝牙OTA功能是一种方便且灵活的固件升级方式,可以通过无线方式进行升级,而不需要使用USB或串口连接。通过使用ESP32 Arduino库和WirelessUpdate库,我们可以轻松地在ESP32上实现蓝牙OTA功能,并通过蓝牙连接到OTA服务器进行固件升级。这为物联网项目的开发和维护提供了便利和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值