Komunikácia pomocou prokolu MQTT

organizácia tém, štruktúra správ, zmena konfigurácie zariadenia a jeho ovládanie na diaľku pomocou protokolu MQTT

Motivácia

Ciele

  • naučiť sa ovládať chytré zariadenie pomocou protokolu MQTT

  • naučiť sa prijímať správy cez MQTT protokol

  • porozumieť významu príznaku retain pri odosielaní MQTT správ

  • naučiť sa zabezpečiť OTA aktualizáciu zmenou konfigurácie zariadenia

Postup

Komunikačný protokol MQTT je hlavným komunikačným protokolom v architekúre projektu Chytrá katedra. Používa sa na komunikáciu medzi všetkými vrstami architektúry, pričom jednotlivé správy sa odosielajú vo formáte JSON.

Smart Department: Architektúra

Na tomto cvičení zabezpečíme odosielanie nameraných údajov zo senzoru, ako aj príjem správ na zmenu konfigurácie zariadenia.

Viac informácií o organizácii tém, ako aj formáte správ sa nachádza na stránke The Messages and Topics in MQTT.

Odosielanie nameraných dát

Vytváraný chytrý senzor bude odosielať informácie o nameraných veličinách teploty a vlhkosti do dvoch samostatných tém - každú nameranú veličinu zvlášť. V tomto kroku zabalíme namerané údaje do potrebného JSON formátu a odošleme ich do príslušnej témy na MQTT broker.

Task

V stave PublishData zabaľte namerané údaje o teplote do slovníka podľa špecifikácie.

Do zoznamu meraní zabaľte všetky merania, ktoré máte uložené v súbore s meraniami. Nezabudnite na to, že tento súbor odstránite až po tom, čo merania úspešne odošlete.

Task

Odošlite zabalené merania z teplomera pomocou MQTT protokolu.

Pre odoslanie použite metodu nad objektom klienta .publish(). Táto metoda má dva parametre:

  • topic - téma, kam bude správa odoslaná, a
  • message - samotná správa vo formáte JSON dokumentu.

Tvar témy je uvedený v špecifikácii. Ako identifikátor zariadenia použite svoj jedinečný univerzitný login. Príkkladom témy pre teplomer, ktorý sa nachádza na katedre kpi v miestnosti hyperion môže byť tento: kpi/hyperion/temperature/ab123cd.

Pred odoslaním nezabudnite objekt správy (slovník) previesť na JSON dokument (reťazec) pomocou funkcie json.dumps().

Task

Po úspešnom odoslaní odstráňte súbor s meraniami z flash pamäte.

Task

Overte správnosť svojej implementácie.

Svoju implementáciu môžete overiť spustením aplikácie MQTTExplorer na uzli mother na tejto adrese. Následne overte, či správu po odoslaní uvidíte v príslušnej téme.

Task

Rozšírte svoju implementáciu aj pre odoslanie meraní o vlhkosti a svoje riešenie overte.

Riadenie zariadenia cez MQTT

Naše zariadenie však budeme chcieť na diaľku aj ovládať - budeme chcieť zmeniť jeho nastavenia, čím dôjde k zmene jeho správania. Napríklad budeme chcieť zmeniť interval meraní alebo pred presunom do inej WiFi siete mu pošleme aktualizovanú konfiguráciu s informáciami pre prihlásenie do tejto siete.

Tomuto procesu hovoríme OTA aktualizácia. Tá totiž nepredstavuje len aktualizáciu aplikácie alebo celého firmvéru, ale rovnako tak umožňuje zariadeniu aktualizovať jeho konfiguráciu. A presne to zabezpečíme v tomto kroku.

V tomto prípade sa teda prihlásime na odber správ, ktoré budú prichádzať na tému zariadenia s postfixom /set. Aby sme zabezpečili príjem a spracovanie správy, tak musíme:

  1. Vytvoriť tzv. callback funkciu, ktorá ošetrí prijatú správu.
  2. Nastaviť MQTT klientovi túto callback funkciu, aby vedel, akú funkciu má zavolať pri prijatí správy.
  3. Prihlásiť sa na odber správ prichádzajúcich do témy zariadenia s postfixom /set.
  4. Skontrolovať, či pre zariadenie nie sú k dispozícii nové správy.

Task

Vytvorte callback funkciu, ktora osetri prijatie spravy od MQTT.

Túto funkciu vytvoríme mimo triedy stavu PublishData. A bude mať dva parametre:

  • topic - názov témy, v ktorej bola správa prijatá
  • message - správa, ktorá bola prijatá

Jej jednoduchá podoba môže vyzerať napríklad takto:

def on_message(topic: bytes, message: bytes):
    print(f'Message "{message}" received in topic "{topic}"')

Task

Nastavte objektu klienta callback funkciu na vytvorenú funkciu on_message() pomocou metódy .set_callback().

Callback funkciu zaregistrujeme pre MQTT klienta veľmi jednoducho:

client.set_callback(on_message)

Task

Prihláste sa na odber témy pre zmenu konfigurácie zariadenia.

Táto téma bude vychádzať z názvu témy, do ktorej zariadenie publikuje svoje údaje, ale bude mať postfix /set. Prihlásiť sa môžete zavolaním metódy .subscribe() nad objektom MQTT klienta.

Task

Po odoslaní nameraných dát zo senzora brokeru overte, či pre vaše zariadenie nie sú k dispozícii nové správy.

Toto overenie zabezpečíme zavolaním metódy .check_msg() nad objektom MQTT klienta.

Task

Overte vytvorenú implementáciu odoslaním správy do príslušnej témy.

Svoju implementáciu môžete overiť spustením aplikácie MQTTExplorer na uzli mother na tejto adrese. Pri odosielaní správy nezabudnite, že musí mať nastavený príznak retain.

Task

Rozšírte funkcionalitu funkcie on_message() tak, aby aktualizovala podobu vašej konfigurácie. Svoju implementáciu následne overte.

Aktuálna podoba funkcie on_message() neurobí s prijatou správou nič. Preto ju aktualizujte a zabezpečte, aby došlo k aktualizácii konfigurácie vášho zariadenia. Nezabudnite ju samozrejme uložiť do súboru.

Pred odchodom z cvičenia…

Ďalšie úlohy

  1. V prípade akýchkoľvek problémov nezabudnite prejsť do stavu Error a reprezentovať vzniknutú chybu potrebným blikaním.

Ďalšie zdroje