Vzdialená aktualizácia zariadenia

o zmene nastavení na diaľku, o diaľkovom ovládaní zariadenia, o aktualizácii zariadenia na diaľku

Motivácia

Skratka OTA (z angl. Over-The-Air) v oblasti Internetu vecí označuje aktualizáciu na diaľku. Táto funkcionalita umožňuje meniť alebo vylepšovať softvér zariadenia bez potreby fyzického zásahu.

Aktualizácia na diaľku však neznamená iba nahratie nového firmvéru. V praxi je možné týmto spôsobom aktualizovať aj aplikačný softvér, konfiguračné nastavenia, bezpečnostné kľúče, certifikáty, či iné systémové komponenty. Vďaka OTA tak môžu byť zariadenia v teréne udržiavané aktuálne, bezpečné a funkčne rozšíriteľné aj po ich nasadení.

V rámci tohto cvičenia si ukážeme, ako možno proces OTA aktualizácie implementovať a otestovať aj na našom chytrom zariadení.

Diagram stavov: konceptuálny diagram stavov chytrého senzora

Postup

Stav OTA

V tomto kroku rozšírime správanie chytrého senzora o nový stav s názvom OTA. Práve v tomto stave bude prebiehať aktualizácia zariadenia na diaľku, vždy keď to bude potrebné.

Zariadenie do stavu OTA prejde po úspešnom odoslaní nameraných hodnôt na MQTT broker a pred prechodom do režimu spánku. Dôvodom je, že proces aktualizácie môže byť časovo náročnejší a je preto vhodné ho vykonávať iba vtedy, keď zariadenie dokončilo svoju hlavnú činnosť. Takto sa minimalizuje riziko prerušenia bežnej prevádzky.

Aktualizácia sa bude realizovať pomocou správ prijímaných cez protokol MQTT. Po vstupe do stavu OTA sa zariadenie prihlási na odber správ z určených tém a po ukončení stavu sa z nich odhlási.

Aby bolo možné prijaté správy spracovať, musí mať zariadenie vytvorenú tzv. callback funkciu – funkciu, ktorá sa automaticky vykoná vždy, keď zariadenie prijme novú MQTT správu. V tejto funkcii sa následne môže overiť obsah správy a rozhodnúť o tom, či sa má spustiť proces aktualizácie alebo vykonať iná akcia.

V tomto kroku vykonajte nasledujúce úlohy:

  1. Vytvorte nový stav OTA a začleňte ho do existujúceho stavového automatu zariadenia.

  2. Implementujte jednoduchú callback funkciu pre MQTT klienta, ktorá sa vykoná po prijatí správy.

  3. Pri vstupe do stavu OTA sa prihláste na odber týchto tém:

    • <department>/<room>/<device/type>/<device id>/settings - téma pre vzdialenú konfiguráciu
    • <department>/<room>/<device/type>/<device id>/command - téma pre vzdialené ovládanie
  4. Pri odchode zo stavu OTA sa z týchto tém odhláste.

  5. Pomocou metódy .check_msg() overte, či zariadenie prijalo novú správu. Ak správa dorazí, callback funkcia sa automaticky vykoná a zariadenie ju spracuje.

Vzdialená konfigurácia

Jednou z kľúčových vlastností inteligentných zariadení je ich schopnosť aktualizovať svoje nastavenia na diaľku bez potreby manuálneho zásahu používateľa. Na tento účel využijeme špeciálnu MQTT tému v tvare:

<department>/<room>/<device/type>/<device id>/settings

Prostredníctvom tejto témy bude zo servera (alebo aplikácie určenej na konfiguráciu zariadenia) odosielaná nová alebo aktualizovaná konfigurácia zariadenia.

Konfigurácia sa prenáša vo forme JSON dokumentu, kde jednotlivé kľúče predstavujú konkrétne položky v nastaveniach zariadenia – teda zodpovedajúce atribúty triedy Settings, ktoré sa následne ukladajú do súboru settings.json.

Príklad takejto správy môže vyzerať nasledovne:

{
  "measurement_interval": 30,
  "units": "metric"
}

V tomto prípade zariadenie po prijatí správy prečíta jednotlivé kľúče, porovná ich s aktuálnymi nastaveniami a podľa potreby hodnoty aktualizuje.

Vzdialené ovládanie

Aj keď v prípade chytrého senzora nie je nevyhnutné mať implementovanú funkcionalitu vzdialeného ovládania, ide o veľmi užitočnú vlastnosť, ktorá rozširuje možnosti zariadenia. Vďaka nej je možné zariadenie na diaľku riadiť, testovať alebo identifikovať bez potreby fyzického prístupu.

Zariadenie bude schopné prijať príkaz na diaľku ako správu odoslanú prostredníctvom MQTT protokolu v téme:

<department>/<room>/<device/type>/<device id>/command

Samotná správa bude mať štruktúru JSON dokumentu s dvomi hlavnými kľúčmi:

  • command - samotný príkaz (jednoslovný textový reťazec), a
  • params - voliteľný zoznam parametrov, ktoré môžu byť podľa potreby oddelené čiarkou alebo medzerou.

Príkladom jednoduchého príkazu môže byť optická identifikácia zariadenia, napríklad bliknutím LED diódy. Takýto príkaz môže byť reprezentovaný správou:

{
  "command": "blink"
}

V prípade potreby je možné do správy pridať aj parametre, napríklad:

{
  "command": "blink",
  "params": "3 fast"
}

Na reprezentáciu správ môžete využiť model Command z balíka models, ktorý zjednoduší prácu s prijatými údajmi.

Pokročilejším a univerzálnejším prístupom je implementácia jednoduchého parsera príkazov, ktorý:

  • rozpozná názov príkazu,
  • rozdelí a spracuje jeho parametre,
  • dokáže príkaz automaticky vykonať alebo vráti jeho inštanciu.

Takto navrhnutý parser bude možné opätovne použiť aj v iných častiach systému – napríklad:

  • pri vzdialenom ovládaní cez MQTT,
  • vo webovom rozhraní zariadenia,
  • alebo pri komunikácii cez sériovú linku, kde používateľ získa prístup k jednoduchému servisnému terminálu.

Vzdialená aktualizácia aplikácie

Existencia kvalitného a bezpečného mechanizmu OTA aktualizácií softvéru zariadenia, je jedna z kľúčových vlastností moderných systémov Internetu vecí.

Mechanizmus aktualizácie pomocou A/B partícií

Pred odchodom z cvičenia…

Ďalšie úlohy

  1. V niektorých prípadoch môže byť konfiguračný súbor zariadenia hierarchicky štruktúrovaný. To znamená, že hodnota niektorého kľúča v JSON dokumente môže byť ďalším vnoreným objektom. Aby vaše riešenie bolo univerzálnejšie, upravte implementáciu vzdialenej konfigurácie tak, aby umožňovalo nastaviť hodnoty aj vo vnorených štruktúrach.

    Príklad kľúča, pomocou ktorého je možné nastaviť heslo do WiFi siete, môže vyzerať takto:

    {
      "network.wifi.password": "new.password"
    }
  2. Pre chytrý senzor, ktorý väčšinu času prespí a zobudí sa len na krátky okamih, je funkcionalita vzdialeného ovládania pomerne zbytočná. O to viac však môže byť použiteľná funkcionalita servisného terminálu, kedy sa používateľ v roli administrátora bude môcť k zariadeniu pripojiť pomocou sériovej linky a bude môcť so zariadením komunikovať formou príkazov. Rovnakú funkcionalitu môže ponúknuť aj webové rozhranie, čím si skúsený používateľ môže pripraviť sadu príkazov na nastavenie zariadenia a jednoducho ju spustiť.

    Tým pádom sa javí ako výhodné vytvoriť jednoduchý parser, ktorý dokáže rozpoznať zadaný príkaz a prípadne ho aj rovno vykonať. Túto funkcionalitu následne budete vedieť použiť na minimálne na týchto miestach:

    • v prípade vzdialeného ovládania cez protokol MQTT,
    • v admin webovom rozhraní, a
    • v prípade špeciálneho stavu, kedy sa zapne servisný terminál.

Ďalšie zdroje

  1. MicroPython Chapters: Práca s protokolom MQTT

  2. Aktualizácie zariadení