Github:https://github.com/Emily-Loving/esp32-s3-ota-http.git
CSDN:https://www.bilibili.com/video/BV1crpi6hEeC/
1. 什么是OTA升级
OTA(Over-The-Air,空中升级)是指设备通过无线网络下载新固件并完成自我更新的能力。对于大量部署在户外的ESP32-S3设备而言,如果不能远程升级,每一次固件更新都需要拆机、接线、烧录,维护成本极高。借助OTA,开发者可以直接把新版本固件推送到设备端,实现远程迭代和问题修复。
ESP32-S3作为乐鑫推出的高性能Wi-Fi和BLE芯片,内置完整的OTA支持。它既可以使用Arduino框架快速实现局域网升级,也可以基于ESP-IDF实现带HTTPS校验和失败回滚的工业级方案。
2. ESP32-S3 OTA升级方案选择
在此项目中,我选择的是HTTP OTA:基于ESP-IDF的ota组件,下发固件。可以用自家或者办公室的路由器(sta),注意一定要有2.4GHz,否则就连不上;也可以使用esp32自带的热点,详情见代码。
void loop() { web_server_loop(); // 处理HTTP请求 }3.HTTP OTA
以下是部分wifi代码
void wifi_init(void) { WiFi.mode(WIFI_STA); String c_str_ssid = String(WIFI_STA_SSID); if (c_str_ssid.length() > 0 && c_str_ssid != "YourWiFiSSID") { Serial.printf("[WiFi] STA connecting to '%s' ...\n", WIFI_STA_SSID); WiFi.begin(WIFI_STA_SSID, WIFI_STA_PASSWORD); uint32_t u32_start = millis(); while (WiFi.status() != WL_CONNECTED) { if (millis() - u32_start > WIFI_STA_TIMEOUT_MS) { Serial.println("[WiFi] STA timeout, switch to AP mode."); break; } delay(500); Serial.print("."); } Serial.println(); if (WiFi.status() == WL_CONNECTED) { s_e_wifi_mode = OWM_STA; s_st_ip = WiFi.localIP(); Serial.printf("[WiFi] STA connected, IP: %s\n", s_st_ip.toString().c_str()); return; } } else { Serial.println("[WiFi] STA SSID not configured, skip to AP mode."); } //STA 失败 回退到AP模式 WiFi.mode(WIFI_AP); String c_str_ap_ssid = wifi_make_ap_ssid(); bool b_ok; String c_str_ap_pass = String(WIFI_AP_PASSWORD); if (c_str_ap_pass.length() > 0) { b_ok = WiFi.softAP(c_str_ap_ssid.c_str(), c_str_ap_pass.c_str()); } else { b_ok = WiFi.softAP(c_str_ap_ssid.c_str()); } if (b_ok) { s_e_wifi_mode = OWM_AP; s_st_ip = WiFi.softAPIP(); Serial.printf("[WiFi] AP mode, SSID: '%s', IP: %s\n", c_str_ap_ssid.c_str(), s_st_ip.toString().c_str()); } else { s_e_wifi_mode = OWM_NONE; Serial.println("[WiFi] AP start FAILED!"); } }4. OTA失败回滚与双分区机制
ESP32的Flash中通常划分出两个OTA应用分区,例如ota_0和ota_1。初始化的时候,软件会帮你弄好,不会像stm32那样麻烦。这也是我喜欢esp32的一个点。
End
这个小项目,我借助了ai。ai并非让我觉得不用去学习知识,而是让我在没有顾虑的环境下探索电子。加油呀,各位电子人