Článok z vlastnej publikácie - Tímový projekt - TUKE 2019/2020 - Vzdialená aktualizácia softvéru na platforme ESP32 - upravený.
Over The Air (OTA) je označenie pre metódy distribúcie nového firmvéru a konfigurácie pre bezdrôtové zariadenia. Výhodou je možnosť distribuovať nový softvér prostredníctvom centrálneho bodu, ktorý dokáže odosielať softvér do všetkých zariadení, ktoré podporujú danú metódu. V praxi sa s OTA stretávame predovšetkým z operačných systémov Windows, Android, či iOS, kedy centrálny bod distribuuje aktualizáciu operačného systému a všetky zariadenia dokážu na aktualizáciu upozorniť používateľa.
Na základe počiatočnej konfigurácie zariadenia je možné aktualizáciu stiahnuť a nainštalovať okamžite, alebo po jej potvrdení od používateľa. Metódy vzdialenej aktualizácie softvéru si našli uplatnenie aj v IoT (Internet of Things) odvetví. Inteligentné zariadenia je taktiež možné vzdialene aktualizovať, napríklad cez LAN sieť, internet s využitím centrálneho bodu, alebo inou implementáciou podporujúcou OTA.
Platforma ESP32 sa taktiež radí k IoT platformám, ktoré podporujú vzdialenú aktualizáciu softvéru. Nakoľko sa dá programovať v rôznych jazykoch (Wiring [Arduino], ESP-IDF, MicroPython, Lua, Node.Js a ďalších), vyhotovil som krátky prehľad možnosti OTA metód v jazyku Wiring (Arduino) a ESP-IDF (Espressif IoT Development Framework).
ESP32 má k dispozícii flash pamäť, ktorá môže byť prispôsobená podľa potreby pre akúkoľvek aplikáciu. V prípade využívania OTA sa cez Partition tables implementuje do flash pamäte jej rozdelenie podľa pravidiel v tejto tabuľke. Štandardne bez OTA sa využíva pamäť pre program - factory_app o veľkosti 1MB a 3MB sú vyhradené pre SPIFFS sektor (Prípad Arduino IDE).
ESP32 má štandardne 4MB flash pamäť, existujú aj 8MB/16MB verzie. Vo väčšine prípadov s využitím OTA sa do flash pamäte pridajú partície pre OTA_1, OTA_2, OTA_DATA, pričom OTA_1,2 partície majú v ESP-IDF veľkosť 1MB. Pre OTA_DATA je štandardne vyhradený priestor o veľkosti 2kB. Partition table je opísaná jednoduchým .csv súborom. Prípadne existujú aj partition tables pre max app, kedy je takmer celá flash pamäť vyhradená iba pre hlavnú - factory_app.
Partícia OTA_DATA je zodpovedná za to, ktorá partícia bude aktuálne bootovateľná, obsahuje jej názov. Ak je partícia prázdna, nabootuje sa factory app. V prípade, že factory app neexistuje (prípad Arduino core s OTA partíciami), nabootuje sa OTA_0. OTA_DATA partícia je prepísaná pri aktualizácii softvéru pred bootovaním a reštartom ESP32.
OTA v Arduino IDE
Príklady implementácii v jazyku Wiring obsahujú možnosť aktualizovať softvér cez LAN sieť prostredníctvom OTA sieťového portu priamo z Arduino IDE. Pre príklad aktualizácie softvéru cez LAN sieť - Basic OTA sa vyžaduje, aby používateľ, ktorý program do zariadenia nahráva bol v rovnakej sieti, ako ESP32. Údaje o WiFi sieti sú nastavené v zdrojovom kóde a sú súčasťou príkladu.
Prvý krát musí byť OTA program nahratý do ESP32 fyzicky prostredníctvom USB kábla (alebo programátora). Aby bolo možné následne nahrať aktualizovaný program do ESP32 cez OTA metódu, vyžaduje sa, aby mal používateľ nainštalovaný jazyk Python, ktorý riadi celý proces aktualizácie (nahrávania nového programu cez sieť) do ESP32. Po prvotnom nahratí OTA príkladu sa v Arduino IDE v časti Nástroje → Porty zobrazí okrem COM portov aj sieťový port, prostredníctvom ktorého je možné pristúpiť na ESP32 a nahrávať skrz neho nový program.
Sieťový port je v tvare esp32-MAC_ADRESA at IP_ADRESA, prípadne je možné definovať Hostname prostredníctvom mDNS služby, ktorú je možné taktiež na ESP32 spustiť a sieťový port sa zobrazí v tvare: HOSTNAME at IP_ADRESA.
Nový program je možné po úspešnej aktualizácii nahrať priamo z vývojového prostredia Arduino IDE. Je nutné dodať, že nový program musí taktiež obsahovať OTA časť predchádzajúceho programu, ak chce používateľ do budúcna program opäť aktualizovať. V prípade nahratia akéhokoľvek programu bez OTA časti sa program nahrá, spustí bez možnosti ďalšej aktualizácie (OTA nie je obsiahnutá v programe).
ESP32 vždy príjme nový program prostredníctvom OTA aktualizácie aj v prípade nahratia duplicitného (rovnakého) programu. V programe je možné spustiť aj ďalšie funkcionality, napríklad zvolenie špecifického OTA portu, overenie aktualizácie od overeného zdroja prostredníctvom vopred známeho hesla, alebo jeho hashu v md5 formáte. Druhým spôsobom možnosti aktualizovať softvér je využitie OTA Web Updater príkladu.
Principiálne funguje tak, že sa ESP32 pripojí do WiFi siete a spustí jednoduché webové rozhranie na webovom serveri na HTTP porte, na ktorý je možné pristúpiť prostredníctvom prehliadača. Pristupovať je možné na IP adresu ESP32, alebo cez doménové meno, ktoré je možné nastaviť cez mDNS službu - na obrázku doménové meno esp32webupdate.
Tu však platí, že v prípade HTTP portu je adresa webstránky v tvare domenové_meno.local pre jej správne načítanie v prehliadači. Súčasťou webového rozhrania je formulár, prostredníctvom ktorého je možné nahrať binárny súbor nového programu a tým aktualizovať softvér. Binárny súbor je možné vygenerovať v Arduino IDE a uložiť ho pre jeho neskoršie nahratie prostredníctvom formulára.
Aj tu platí, že pre budúcu aktualizáciu musí nový súbor okrem novej časti programu obsahovať aj OTA Web Updater. Prvý krát sa program nahráva prostredníctvom USB kábla / programátora. Formulár príjme akýkoľvek binárny súbor, aj duplicitný. Pre vyššiu bezpečnosť je možné využiť login formulár nad pôvodným nahrávacím formulárom. Výhodou je aj možnosť pripojiť sa na ESP32 aj z inej siete, internetu v prípade, že ESP32 funguje na verejnej IP adrese.
Pokročilejšie implementácie OTA sú obsiahnuté vo frameworku ESP-IDF, ku ktorým je možné použiť aj rôzne ďalšie vývojárske nástroje, ktoré umožňujú spustiť hardvérové i softvérové zabezpečovacie mechanizmy pre integritu firmvéru.
Integritu je možné zabezpečiť vloženým digitálnym podpisom do binárky firmvéru, jeho overením na úrovni Bootloadera pri bootovaní, alebo už pri samotnom prebrazí aktualizácie. OTA v ESP-IDF využíva Remote aktualizácie - distribuované vzdialeným serverom, z ktorého si ESP32 dostupný firmvér stiahne.
ESP-IDF obsahuje mechanizmy pre overenie verzie firmvéru a v prípade, že je totožná ako verzia existujúceho - bežiaceho softvéru, nezmení sa boot príznak aj v prípade, že je obsahovo aktualizácia iná.