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ávnauč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.
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á, amessage
- 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:
- Vytvoriť tzv. callback funkciu, ktorá ošetrí prijatú správu.
- Nastaviť MQTT klientovi túto callback funkciu, aby vedel, akú funkciu má zavolať pri prijatí správy.
- Prihlásiť sa na odber správ prichádzajúcich do témy zariadenia s
postfixom
/set
. - 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}"')
Upozornenie
Názov témy ako aj samotná správa nie sú reťazcami, ale postupnosťou bytov. Preto pred ďalšou prácou ich nezabudnite previesť na reťazce, resp. správu previesť na slovník.
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)
Upozornenie
Táto registrácia sa musí vykonať ešte pred pripojením, resp. pred prihlásením sa na odber tém. Ak v momente prihlasovania sa nebude callback funkcia nastavená, dôjde k vyvolaniu výnimky.
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.
Upozornenie
Prihlásiť sa na odber môžete ale až potom, ako ste sa pripojili k MQTT brokeru. Ak to urobíte ešte pred pripojením, k prihláseniu sa samozrejme nedôjde.
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
.
Upozornenie
Ak vaše zariadenie správu nedostane, problémom môže byť to, že pred
zavolaním metódy .check_msg()
zariadenie na chvíľu
pozastavte zavolaním funkcie sleep()
z modulu
time
. Stačí, aby zariadenie zaspalo len na
100ms.
0.1)
sleep( client.check_msg()
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…
Upozornenie
Ak máte požičanú dosku Raspberry Pi Pico WH od cvičiaceho, tak pred odchodom z cvičenia prosím:
- zmažte obsah Flash pamäte mikrokontroléra nahratím fimrvéru flash_nuke.uf2
- nahrajte na mikrokontrolér najnovší firmvér
Ďalšie úlohy
- V prípade akýchkoľvek problémov nezabudnite prejsť do stavu
Error
a reprezentovať vzniknutú chybu potrebným blikaním.
Ďalšie zdroje
- Smart Department: The Messages and Topics in MQTT.
- MicroPython Chapters: Práca s protokolom MQTT