При разработке распределённых IoT-устройств — будь то метеостанция, система автополива или сеть датчиков в лесу — рано или поздно возникает задача: «Как обновить прошивку, не выезжая на место?»
Ответ — FOTA (Firmware Over The Air) или SOTA (Software Over the Air). Это механизм, позволяющий ESP32 скачивать новую прошивку по Wi-Fi и перезапускаться с ней. Особенно полезно, если устройство:
- Установлено в труднодоступном месте (крыша, дерево, подвал).
- Работает в герметичном корпусе.
- Требует частой настройки или доработки логики.
Например, чтобы подстроить параметры автополива на даче, не нужно везти контроллер в Москву — достаточно, чтобы устройство имело доступ к локальной сети с сервером обновлений.
Как это работает?
- На веб-сервере (даже на Raspberry Pi) размещаются два файла:
firmware.bin— скомпилированная прошивка.version.txt— текстовый файл с номером версии (например,1.3).
- ESP32 при старте (или по таймеру) проверяет
version.txt. - Если версия на сервере новее — скачивает
firmware.binи прошивает себя. - При успешной прошивке — перезагружается. При ошибке — остаётся на старой версии.
Пример кода для ESP32 (Arduino Core)
Подключите библиотеки:
#include <WiFi.h> #include <HTTPClient.h> #include <Update.h>
Константы (укажите свои):
#define FW_VERSION "1.0" const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASS"; const char* versionURL = "http://iot-hub.local/firmware/version.txt"; const char* firmwareURL = "http://iot-hub.local/firmware/firmware.bin";
Функция проверки обновления:
bool checkForUpdate() {
HTTPClient http;
http.begin(versionURL);
int code = http.GET();
if (code == 200) {
String remoteVer = http.getString().substring(0, 3); // берём "1.3"
http.end();
return remoteVer.toFloat() > FW_VERSION.toFloat();
}
http.end();
return false;
}
Функция OTA-обновления:
void performOTA() {
WiFiClient client;
t_httpUpdate_return ret = httpUpdate.update(client, firmwareURL);
switch (ret) {
case HTTP_UPDATE_OK:
Serial.println("✅ Обновление успешно. Перезагрузка...");
ESP.restart();
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("ℹ️ Нет обновлений.");
break;
default:
Serial.printf("❌ Ошибка OTA: %d\n", ret);
break;
}
}
Основной цикл (упрощённо):
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
if (checkForUpdate()) {
Serial.println("📡 Найдена новая версия — запуск OTA...");
performOTA();
} else {
Serial.println("🚀 Запуск основной логики...");
// Ваша логика: чтение датчиков, управление насосом и т.п.
}
}
void loop() {
// Основная работа устройства
}
Требования к серверу
Достаточно простого веб-сервера с двумя файлами:
/firmware/version.txt→ содержит только:1.3/firmware/firmware.bin→ бинарный файл из Arduino IDE (экспорт через «Sketch → Export compiled Binary»)
Сервер может быть:
- Локальный Raspberry Pi с Apache/Nginx.
- Обычный ПК с Python HTTP-сервером (
python3 -m http.server 80). - Хостинг с PHP (даже на shared-хостинге).
Важно
- ESP32 должен быть подключён к питанию во время OTA — обновление от батареи рискованно.
- Не используйте OTA в критических системах без fallback-механизма (Arduino OTA его уже включает).
- Для HTTPS потребуется сертификат или отключение проверки (небезопасно).
Заключение
OTA превращает «умное устройство» в эволюционирующее. Вы больше не привязаны к USB-кабелю и физическому доступу. Особенно ценно для систем, развёрнутых в полевых условиях — будь то дача, лес или промышленный объект.
А теперь — ни одного выезда ради перепрошивки! 😉
Комментарии
Пока нет комментариев. Будьте первым!