ITcoDe.Uz ← Maqolalar

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.

Bakhrullo Nasrulloyev2026-08-14~7 daqiqa

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:

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:

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.

ESP32OTAFirmwareIoTXavfsizlik