IoT
ESP32 uchun OTA: qurilmani ochmasdan dasturini yangilash
Plata avtomobil torpedosi ostiga o'rnatilgan. Har kichik tuzatish uchun uni chiqarib olish, USB ulash va qayta yig'ish — bu bir soatlik ish. OTA buni bir daqiqaga aylantiradi.
OTA nima qiladi
ESP32 xotirasi ikkita dastur bo'limiga bo'linadi. Bittasida joriy dastur ishlaydi, ikkinchisi bo'sh turadi. Yangilash paytida yangi kod bo'sh bo'limga yoziladi, keyin yuklash bayrog'i almashtiriladi va plata qayta yuklanadi.
Muhim jihat: yozish paytida eski dastur ishlab turadi. Agar yuklash yarmida uzilsa, plata eski versiya bilan qayta ishga tushadi. Bu xavfsizlikning asosiy mexanizmi.
Xotira talabi. Ikkita bo'lim degani — dasturingiz flesh xotiraning yarmidan katta bo'lmasligi kerak. 4 MB li ESP32 da har bo'limga taxminan 1.9 MB to'g'ri keladi. Loyihangiz shundan oshsa, OTA umuman ishlamaydi.
Eng oddiy usul: ArduinoOTA
Agar plata siz bilan bir Wi-Fi tarmoqda bo'lsa, bu eng tez yo'l:
#include <ArduinoOTA.h>
void setupOTA() {
ArduinoOTA.setHostname("nbcar-dev");
ArduinoOTA.setPassword("kuchli-parol");
ArduinoOTA.onStart([]() {
// yangilash boshlanishida xavfli chiqishlarni tushiramiz
digitalWrite(PIN_START, LOW);
digitalWrite(PIN_LOCK, LOW);
digitalWrite(PIN_OPEN, LOW);
});
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
// qolgan ishlar
}
onStart ichidagi qism e'tibordan chetda qolmasin. Yangilash paytida GPIO holati noaniq bo'lishi mumkin — agar o't oldirish chiqishi ko'tarilib qolsa, avtomobil o'zi ishga tushadi.
Parolni albatta qo'ying. Usiz tarmoqdagi har kim qurilmangizga o'z dasturini yuklashi mumkin.
Masofadan yangilash: HTTP orqali
Avtomobil uydan uzoqda bo'lganda Wi-Fi ishlamaydi. Bunda qurilmaning o'zi serverdan yangi dasturni yuklab oladi.
#include <HTTPUpdate.h>
bool tryUpdate(const String& url) {
WiFiClientSecure client;
client.setCACert(ROOT_CA);
httpUpdate.rebootOnUpdate(false);
t_httpUpdate_return r = httpUpdate.update(client, url);
switch (r) {
case HTTP_UPDATE_OK:
publishState("updated");
delay(1000);
ESP.restart();
return true;
case HTTP_UPDATE_NO_UPDATES:
return false;
default:
Serial.println(httpUpdate.getLastErrorString());
return false;
}
}
rebootOnUpdate(false) — bu men keyinchalik qo'shgan qator. Standart holatda kutubxona darhol qayta yuklaydi va siz natijani bilib olmaysiz. Qo'lda boshqarganda esa avval holatni yuborib, keyin qayta yuklash mumkin.
Versiyani tekshirish
Qurilma har safar butun faylni yuklab olmasligi kerak. Avval kichik JSON tekshiriladi:
{
"version": "1.7.2",
"url": "https://.../nbcar-1.7.2.bin",
"md5": "a3f5...",
"min": "1.5.0"
}
Agar joriy versiya yangisidan past bo'lsa — yangilanadi. min maydoni esa juda eski versiyadan sakrab o'tishni taqiqlaydi, chunki oradagi ma'lumot formati o'zgargan bo'lishi mumkin.
Qachon yangilamaslik kerak
Bu men birinchi versiyada o'ylamagan narsa. Yangilash noto'g'ri paytda boshlansa, muammo tug'iladi:
- Dvigatel ishlab turganda — qayta yuklanish paytida boshqaruv yo'qoladi
- Buyruq bajarilayotganda — tugma bosilgan holatda qotib qolishi mumkin
- Kuchlanish past bo'lganda — yozish yarmida uzilib qolish xavfi
- Signal zaif bo'lganda — yuklash cho'zilib, uzilishi ehtimoli oshadi
bool safeToUpdate() {
if (engineRunning()) return false;
if (active.pin != 255) return false; // tugma bosilgan
if (batteryVolts() < 12.0) return false;
if (signalQuality() < 15) return false;
return true;
}
Shart bajarilmasa, yangilash keyingi qulay paytga qoldiriladi.
Rollback muammosi
Eng qiyin holat: yangi dastur yuklandi, plata qayta ishga tushdi — lekin kodda xato bor va u tarmoqqa ulanmaydi. Endi siz uni masofadan tuzata olmaysiz, chunki OTA ham ishlamaydi.
ESP32 da buning uchun mexanizm bor. Yangi dastur birinchi marta ishga tushganda "sinov" holatida bo'ladi va u o'zini tasdiqlashi kerak:
#include <esp_ota_ops.h>
void confirmBoot() {
// faqat asosiy funksiyalar ishlaganidan keyin chaqiriladi
if (mqttConnected && gsmRegistered) {
esp_ota_mark_app_valid_cancel_rollback();
}
}
Agar dastur belgilangan vaqt ichida o'zini tasdiqlamasa va qayta yuklansa, bootloader avtomatik ravishda eski versiyaga qaytadi. Bu funksiyani ishlatish uchun bo'limlar jadvalida rollback yoqilgan bo'lishi kerak.
Amaliy maslahat. Yangi versiyani avval stoldagi ikkinchi platada sinab ko'ring. Menda alohida "sinov" qurilmasi bor va har chiqarish avval unga boradi. Bu bir necha marta avtomobildagi platani qutqargan.
Xavfsizlik
OTA — bu qurilmaga ixtiyoriy kod yuklash imkoniyati. Agar u himoyalanmagan bo'lsa, tizimingizdagi eng zaif nuqta shu bo'ladi. Minimal talablar:
- Faqat HTTPS, sertifikat tekshiruvi bilan — oddiy HTTP da hujumchi faylni almashtirishi mumkin
- MD5 yoki SHA tekshiruvi — yuklab olingan fayl butunligini tasdiqlash
- Yangilash buyrug'i faqat tasdiqlangan foydalanuvchidan kelishi
- Faylni ochiq manzilda saqlamang, hech bo'lmasa taxmin qilib bo'lmaydigan nom bering
Xulosa
OTA o'rnatilgan qurilma bilan ishlashni butunlay o'zgartiradi: tuzatish endi soatlar emas, daqiqalar oladi. Lekin u xavf ham qo'shadi — noto'g'ri yangilash qurilmani qo'lingiz yetmaydigan holga keltirishi mumkin.
Uchta himoya majburiy: qachon yangilash mumkinligini tekshirish, rollback va sinov qurilmasi.