Komunikácia cez MQTT
organizácia tém, typy správ a ich formát
Zariadenia a služby v architektúre Smart Department spolu komunikujú prostredníctvom protokolu MQTT. Aby si navzájom rozumeli, musia dodržiavať spoločné pravidlá – kam správy posielať a ako majú vyzerať. Tieto pravidlá opisuje tento dokument. Je spoločnou dohodou medzi zariadeniami, ktoré správy posielajú, a službami, ktoré ich spracovávajú.
Pripojenie k brokeru
Hlavný MQTT broker architektúry beží na serveri Mother:
- adresa:
mother.fei.tuke.sk - port:
8883 - používateľské meno:
student - heslo:
dgRk9cQ8sU4fCO - šifrovaná komunikácia (TLS): áno
Zariadenia komunikujú pomocou protokolu MQTT vo verzii
3.1.1. Ako identifikátor klienta používajú svoj identifikátor
zariadenia (device_id), ktorý musí byť v rámci brokera
jedinečný.
Organizácia tém
Každá téma, do ktorej zariadenie posiela správy, má tento tvar:
<department>/<room>/<device_type>/<device_id>/<message_type>
Význam jednotlivých úrovní témy je nasledovný:
<department>– katedra, v ktorej sa zariadenie nachádza; pre nás vždykpi,<room>– názov miestnosti, v ktorej je zariadenie umiestnené (pozri zoznam miestností),<device_type>– typ zariadenia, napr.thsensor,<device_id>– jedinečný identifikátor zariadenia,<message_type>– typ správy, napr.dataalebostatus(pozri typy správ).
Organizácia tém vychádza z prístupu Unified Namespace, v ktorom celá organizácia zdieľa jednu hierarchiu tém odrážajúcu jej štruktúru. Úrovne takejto hierarchie sú v priemysle zvyčajne odvodené od normy ISA-95 (podnik, závod, oblasť, výrobná linka, …). V našom prípade ide o katedru, miestnosť a zariadenie.
Príklad témy, do ktorej posiela namerané údaje chytrý senzor teploty a vlhkosti v miestnosti Endor:
kpi/endor/thsensor/ab123cd/data
Prefix tém
Zariadenie samo nevie, kde je nasadené. Prvé tri úrovne témy
<department>/<room>/<device_type> preto
tvoria tzv. prefix tém (<topic_prefix>),
ktorý sa zariadeniu nastaví pri jeho inštalácii. Vďaka tomu je možné to
isté zariadenie použiť v ľubovoľnej miestnosti, ale aj mimo architektúry
Smart Department – napr. doma, kde mu stačí ako prefix samotný
typ zariadenia:
thsensor/ab123cd/data
Základ tém
Prefix tém spolu s identifikátorom zariadenia tvoria tzv. základ
tém (<base_topic>). Je spoločným začiatkom
všetkých tém, do ktorých zariadenie posiela správy:
<department>/<room>/<device_type> / <device_id> / <message_type>
└──────── <topic_prefix> ───────┘
└──────────────── <base_topic> ───────────────┘
Zariadenie tak tému skladá vždy rovnako:
<base_topic>/<message_type>, napr.
kpi/endor/thsensor/ab123cd/data.
Pravidlá zápisu
Pre každú úroveň témy platí:
- obsahuje len malé písmená bez diakritiky, číslice a znak
-, - nesmie byť prázdna (téma teda nesmie obsahovať
//a nesmie začínať ani končiť znakom/), - nesmie obsahovať zástupné znaky
+a#.
Povolené témy
Broker na serveri Mother používa zoznam povolených tém (z
angl. Access Control List, ACL). Prepustí preto len
témy, ktoré dodržiavajú tvar
<department>/<room>/<device_type>/<device_id>/<message_type>,
teda majú päť úrovní a poslednou je povolený typ správy.
Správy do ostatných tém broker zahodí. Zariadenie sa o tom nedozvie,
pretože odoslanie správy skončí bez chyby. Ak správa v klientskej
aplikácii neprichádza, najprv skontrolujte tvar témy. Prefix tém
thsensor z predchádzajúceho príkladu preto na tomto brokeri
nefunguje.
Zoznam miestností
Miestnosti sa v témach označujú svojím názvom:
<room> |
Miestnosť |
|---|---|
abydos |
A536 |
dune |
B529 |
endor |
B526 |
hyperion |
A512 |
kronos |
B524 |
meridian |
B519 |
nyx |
B501 |
romulus |
A534 |
solaris |
A532 |
vulcan |
A514 |
Typy správ
Všetky správy sú vo formáte JSON. Časové údaje sú reťazce vo
formáte podľa normy ISO
8601 v časovom pásme UTC, napr.
"2026-10-30T07:05:00Z".
<message_type> |
Obsah | Kedy sa posiela | QoS | retain |
|---|---|---|---|---|
data |
namerané údaje (telemetria) | po každom meraní | 0 |
nie |
status |
stav zariadenia | po pripojení, pred odpojením a ako posledná vôľa | 1 |
áno |
info |
informácie o zariadení | po pripojení | 1 |
áno |
Telemetria (data)
Správa obsahuje všetky metriky, ktoré zariadenie odosiela naraz. Jej štruktúra je inšpirovaná špecifikáciou Sparkplug B (norma ISO/IEC 20237), ktorá pre priemyselný internet vecí definuje podobu tém a správ nad protokolom MQTT. Aj v nej má správa časovú značku a zoznam metrík, pričom každá metrika má svoj názov, časovú značku a hodnotu. Jedna správa tak môže niesť hodnoty rôznych veličín nameraných v rôznom čase, napr. keď zariadenie merania najprv ukladá a odošle ich až naraz.
Náš formát však so špecifikáciou Sparkplug B nie je kompatibilný. Tá používa vlastnú organizáciu tém a správy kóduje binárne pomocou Protocol Buffers, kým my používame čitateľný formát JSON.
Správa má tieto položky:
| Položka | Typ | Povinná | Význam |
|---|---|---|---|
dt |
reťazec | áno | čas odoslania správy |
metrics |
zoznam | áno | zoznam metrík |
Každá metrika má tieto položky:
| Položka | Typ | Povinná | Význam |
|---|---|---|---|
dt |
reťazec | áno | čas merania |
name |
reťazec | áno | názov metriky, napr. temperature alebo
humidity |
value |
číslo | áno | nameraná hodnota |
units |
reťazec | nie | kód jednotky nameranej hodnoty podľa štandardu SenML,
napr. "Cel" (pozri zoznam
metrík) |
Okrem nameraných veličín môže zariadenie rovnakým spôsobom posielať aj metriky o sebe samom, napr. stav batérie alebo silu signálu WiFi.
Položka units obsahuje vždy kód jednotky, v ktorej je
hodnota uvedená. Kódy jednotiek sú prevzaté zo štandardu SenML
(RFC 8428), ktorý ich definuje v registri organizácie
IANA. Na rozdiel od značiek, ako napr. °C,
obsahujú len znaky ASCII a každá jednotka má práve jeden kód. Odberateľ
tak vie hodnotu správne zobraziť bez toho, aby poznal nastavenia
zariadenia. Metriky, ktoré jednotku nemajú (napr. počet), položku
units neobsahujú.
Príklad správy:
{
"dt": "2026-10-30T07:05:00Z",
"metrics": [
{
"dt": "2026-10-30T07:00:00Z",
"name": "temperature",
"value": 23.4,
"units": "Cel"
},
{
"dt": "2026-10-30T07:00:00Z",
"name": "humidity",
"value": 70,
"units": "%RH"
}
]
}Zoznam metrík
Aby bolo možné porovnávať údaje z rôznych zariadení, používajú zariadenia pre rovnaké veličiny rovnaké názvy metrík a jednotky:
name |
Veličina | units |
|---|---|---|
temperature |
teplota | "Cel" |
humidity |
relatívna vlhkosť | "%RH" |
pressure |
atmosférický tlak | "hPa" |
battery |
stav batérie | "%EL" alebo "V" |
rssi |
sila signálu WiFi | "dBm" |
Teplotu posielajú zariadenia vždy v stupňoch Celzia, pretože pre stupne Fahrenheita štandard SenML kód nedefinuje.
Poznámka
Ak zariadenie meria veličinu, ktorá v zozname nie je, použite pre jej názov rovnaké pravidlá ako pre úrovne tém a jej jednotku vyberte z registra jednotiek štandardu SenML.
Stav zariadenia (status)
Správa informuje o dostupnosti zariadenia. Posiela sa s príznakom
retain, aby sa posledný známy stav zariadenia dozvedel aj
ten, kto sa prihlási na odber neskôr. Má tieto položky:
| Položka | Typ | Povinná | Význam |
|---|---|---|---|
dt |
reťazec | nie | čas zmeny stavu; v poslednej vôli má hodnotu null |
status |
reťazec | áno | stav zariadenia |
Stav zariadenia môže mať tieto hodnoty:
| Stav | Význam | Kto ho posiela |
|---|---|---|
online |
zariadenie je pripojené | zariadenie hneď po pripojení k brokeru |
sleeping |
zariadenie sa korektne odpojilo a spí | zariadenie pred odpojením od brokera |
offline |
spojenie so zariadením sa neočakávane prerušilo | broker ako poslednú vôľu zariadenia |
Príklad správy po pripojení zariadenia:
{
"dt": "2026-10-30T07:05:00Z",
"status": "online"
}Posledná vôľa sa nastavuje už pri pripájaní, preto čas neobsahuje:
{
"dt": null,
"status": "offline"
}Informácie o zariadení (info)
Správa obsahuje informácie o zariadení, ktoré sa menia len zriedka,
napr. po aktualizácii jeho softvéru. Posiela sa s príznakom
retain po pripojení k brokeru. Má tieto položky:
| Položka | Typ | Povinná | Význam |
|---|---|---|---|
dt |
reťazec | áno | čas odoslania správy |
device_type |
reťazec | áno | typ zariadenia, napr. thsensor |
version |
reťazec | áno | verzia softvéru zariadenia |
micropython |
reťazec | nie | verzia firmvéru MicroPython, ak ho zariadenie používa |
ip |
reťazec | áno | IP adresa zariadenia v sieti |
Typ zariadenia je síce súčasťou prefixu tém, ale prefix sa dá
ľubovoľne nastaviť. Položka device_type preto jednoznačne
určuje, o aké zariadenie ide.
Príklad správy:
{
"dt": "2026-10-30T07:05:00Z",
"device_type": "thsensor",
"version": "2026.11",
"micropython": "1.27.0",
"ip": "192.168.1.42"
}Ďalšie zdroje
Eclipse Foundation: Sparkplug - špecifikácia tém a správ MQTT pre priemyselný internet vecí, z ktorej vychádza štruktúra správ s nameranými údajmi
Eclipse Foundation: The Eclipse Foundation Announces Sparkplug as an International Standard - oznámenie o vydaní špecifikácie ako normy ISO/IEC 20237
HiveMQ: Breaking Down MQTT Sparkplug Payload Structures in IIoT Messaging - štruktúra správ v priemyselnom internete vecí
HiveMQ: Implementing Unified Namespace (UNS) With MQTT Sparkplug - prístup Unified Namespace a jeho vzťah k špecifikácii Sparkplug
Wikipedia: ANSI/ISA-95 - norma, od ktorej sa zvyčajne odvodzujú úrovne hierarchie tém