Problem Set #6: The Messages and Topics in MQTT
alebo o organizácii a štruktúre tém a prenášaných správ pomocou komunikačného protokolu MQTT
Komunikačný protokol MQTT je hlavným komunikačným protokolom v architekúre projektu Smart Department. Používa sa na komunikáciu medzi všetkými vrstami architektúry, pričom jednotlivé správy sa odosielajú vo formáte JSON.
Ako je možné vidieť na obrázku vyššie, celá architektúra je hierarchická. V každej miestnosti je na zariadení IoT Gateway spustený samostatný MQTT broker, pričom každý jeden z nich je taktiež prepojený s MQTT broker-om v cloud-e pomocou mechanizmu MQTT bridge. Vďaka nemu MQTT broker-y v jednotlivých miestnostiach posielajú dáta do cloud-u a prihlásia sa na odber dát z cloud-u, ktoré sú určené nim.
Štruktúra tém sa preto líši na zariadeniach IoT Gateway od zariadenia Mother. Ich podoba je opísaná v nasledujúcom texte.
Zástupné hodnoty v témach
V témach sa budú nachádzať zástupné hodnoty (placeholders), ktorých význam je uvedený v nasledujúcej tabuľke:
| zástupná hodnota | význam | príklad |
|---|---|---|
<department> |
názov oddelenia/katedry | kpi |
<room> |
názov miestnosti | caprica |
<device_id> |
jedinečný identifikátor zariadenia | 123 |
<student_id> |
jedinečný identifikátor študenta | ab123cd |
<service_id> |
jedinečný názov/identifikátor služby | notifier |
<device_type> |
typ zariadenia | thsensor |
<action> |
akcia, ktorá sa vykoná nad zariadením | set |
<topic_prefix> |
prefix témy | gw, kpi/caprica |
The Things: Zariadenia prvej vrstvy
Zariadenia prvej vrstvy sa budú pripájať ku zariadeniu IoT Gateway. Obecný tvar témy zariadenia je:
<topic_prefix>/<device_type>/<device_id>/<action>
Hodnota <topic_prefix> bude konštantne
gw/.
Napríklad téma, cez ktorú bude zariadenie thsensor s
identifikátorom bc23dd publikovať svoje údaje, bude vyzerať
takto:
gw/thsensor/bc23dd/data
V nasledujúcej tabuľke sa nachádzajú témy akcií, ktoré je možné vykonať cez protokol MQTT v zariadení:
| téma | význam |
|---|---|
gw/<device_type>/<device_id>/data |
(namerané) údaje zo zariadenia |
gw/<device_type>/<device_id>/status |
aktuálny stav zariadenia |
gw/<device_type>/<device_id>/set |
zmena nastavení zariadenia |
gw/<device_type>/<device_id>/cmd |
príkaz na zmenu správania zariadenia |
V prípade, ak potrebujete zabezpečiť OTA aktualizácie, použite na to
akciu ota. Tvar tém sa nachádza v nasledujúcej tabuľke:
| téma | význam |
|---|---|
gw/<device_type>/<device_id>/ota/# |
OTA aktualizácia |
Ak vaše zariadenie bude komunikovať s nejakou službou, použite prefix
service/. Tvar tém sa nachádza v nasledujúcej tabuľke:
| téma | význam |
|---|---|
service/<service_id>/# |
komunikácia so službou |
IoT Gateway: Zoznam pravidiel pre MQTT bridge
Úlohou zariadenia IoT Gateway je pomocou mechanizmu MQTT bridge komunikovať so vzdialeným MQTT brokerom. Zoznam pravidiel pre MQTT bridge sa nachádza v nasledujúcej tabuľke:
| smer | vzor | lok. prefix | vzdial. prefix | význam |
|---|---|---|---|---|
out |
+/+/data |
gw/ |
<department>/<room>/ |
(namerané) údaje zariadenia |
out |
+/+/status |
gw/ |
<department>/<room>/ |
stav zariadenia |
in |
+/+/cmd |
gw/ |
<department>/<room>/ |
vzdialený príkaz na ovládanie zariadenia |
in |
+/+/set |
gw/ |
<department>/<room>/ |
zmena aktuálnej konfigurácie zariadenia |
in |
+/+/ota/# |
gw/ |
<department>/<room>/ |
manažment OTA |
out |
+/# |
service/ |
service/ |
odosielanie správ do služby |
in |
+/# |
service/ |
service/ |
prijímanie správ zo služby |
out |
+/+/metrics/+ |
gw/ |
<department>/<room>/ |
metriky zariadenia |
Mother: Zoznam ACL
pre používateľa student
Aby nemohol hocikto posielať na MQTT broker hocičo, obsahuje MQTT broker na serveri Mother aj zoznam prístupových práv, tzv. ACL. Každá položka ACL pozostáva zo vzoru témy a typu prístupu, pričom typ prístupu môže byť:
read- čítaniewrite- zápisreadwrite- čítanie a zápisdeny- klient nemá povolené ani publikovať ani odoberať správy z tejto témy
Zoznam prístupových práv sa nachádza v tabuľke nižšie:
| vzor | právo |
|---|---|
+/+/+/+/data |
readwrite |
+/+/+/+/status |
readwrite |
+/+/+/+/set |
readwrite |
+/+/+/+/cmd |
readwrite |
+/+/+/+/ota/# |
readwrite |
+/+/metrics/+ |
read |
service/+/# |
readwrite |
The Things: Odosielanie (nameraných) dát zo zariadenia
Zariadenie bude namerané údaje odosielať do témy s akciou
/data. Samotná správa bude vyzerať nasledovne:
{
"dt": "2024-10-29T20:09:35Z",
"metrics": [
{
"dt": "2024-10-29T20:00:00Z",
"name": "temperature",
"value": 23.4,
"units": "metric"
}
]
}Čas a dátum či už odoslania správy alebo jednotlivých meraní je odosielaný v reťazcovej podobe naformátovanej pomocou štandardu ISO 8601. Na reprezentáciu času sa používa vždy štandard UTC.
Pod kľúčom metrics sa nachádza zoznam meraní, kde každé
je reprezentované samostatným JSON dokumentom. Tento dokument
reprezentuje meranie príslušnej veličiny v konkrétny čas. To je dôležité
vtedy, keď do jednej správy zabalíte viacero meraní tej istej
veličiny alebo veličín súvisiacich s predmetom merania (napr.
hodnota GPS sa skladá zo zemepísnej šírky a dĺžky, senzor zrýchlenia
vracia hodnoty v troch osiach, a pod.).
Príklad meraných veličín a ich prípustných hodnôt jednotiek ako aj typ hodnôt, je uvedený v nasledujúcej tabuľke.
| name | units | value |
|---|---|---|
temperature |
metric | imperial | standard |
float |
humidity |
percent |
int |
The Things: Odosielanie informácií o stave zariadenia
Každé zariadenie bude mať špecifickú tému s akciou
/status, v ktorej sa bude nachádzať aktuálny stav
zariadenia. Hlavne informácia o tom, či zariadenie pracuje. Do tejto
témy bude zapísaná aj posledná vôľa zariadenia.
V prípade, že zariadenie pracuje, bude v stave online a
správa bude vyzerať nasledovne:
{
"status": "online"
}V opačnom prípade bude zariadenie v stave offline. V tom
prípade bude správa vyzerať nasledovne:
{
"status": "offline"
}Poznámka
Táto správa by mala mať príznak retain, aby o stave
zariadenia vedeli v prípade potreby ďalšie zariadenia.
The Things: Zmena vlastností zariadenia
Počas behu zariadenia bude možné meniť jeho konfiguráciu, čím bude
možné ovplyvniť správanie zariadenia. Na to bude slúžiť téma s akciou
/set.
Správa bude odrážať podobu konfiguračného súboru. Naraz je samozrejme možné zmeniť viacero hodnôt, čo znamená, že je možné naraz poslať novú podobu celého konfiguračného súboru.
Príklad
{
"update_interval": 30,
"ntp_host": "ntp.tuke.sk"
}The Things: Ovládanie zariadenia
V prípade, že zariadenie predstavuje akčný člen, akým je napríklad
žiarovka, bude možné jej na diaľku posielať príkazy na jej ovládanie. To
môže znamenať jej zapnutie, vypnutie, zmenu jasu, nastavenie farby,
prehratie efektu a pod. Na to bude slúžiť téma s akciou
/cmd.
Príklad správy:
{
"cmd": "set_color",
"params": "red"
}Zdroje
Pri navrhovaní tém a formátu správ sme sa inšpirovali najmä z týchto zdrojov:
- Breaking Down MQTT Sparkplug Payload Structures in IIoT Messaging
- Unified Namespace (UNS) Essentials
- What is Unified Namespace (UNS) and Why Does it Matter?
- Introduction to MQTT Sparkplug
- Zigbee2MQTT - Zigbee to MQTT bridge, get rid of your proprietary Zigbee bridges
- MQTT Topic Tree Design best practices, tips & examples