IoT Gateway do každej domácnosti
vytvorenie vlastného zariadenia IoT Gateway pomocou kompozície kontajnerov, transformácia komunikácie zo zariadení tretích strán do infraštruktúry Smart Department pomocou protokolu MQTT, základy práce s nástrojom Node-RED, MQTT bridge
Videá pre cvičenie
Upozornenie
Predtým, ako prídete na cvičenie, tak:
je potrebné mať lokálne nainštalovaný Docker
je potrebné zvládať základy práce s technológiou Docker
prineste si vytvorený chytrý senzor teploty a vlhkosti, ktorý sme vytvorili počas predchádzajúcich cvičení
stiahnite si nasledujúce Docker obrazy: eclipse-mosquitto, smeagolworms4/mqtt-explorer, cturra/ntp, nodered/node-red, theengs/gateway
nainštalujte si na svoj chytrý telefón aplikáciu nRF Connect (Google Play) (App Store)
Motivácia
IoT Gateway zohráva kľúčovú úlohu v celej architektúre Smart Department. Zabezpečuje totiž komunikáciu medzi jednotlivými vrstvami IoT systému a zároveň umožňuje prepojenie rôznych komunikačných protokolov. V našom prípade sprostredkúva komunikáciu medzi nami vytvorenými chytrými senzormi a serverom Mother, ku ktorému majú prístup vaše služby a môžu tak získané dáta ďalej spracovávať. Prostredníctvom vašich klientskych aplikácií je navyše možné tieto chytré zariadenia ovládať aj na diaľku.
Cieľom cvičenia je vytvoriť si vlastné zariadenie typu IoT Gateway na vlastnom počítači. Jeho funkcionalita bude pozostávať z viacerých služieb, ktoré budú spúšťané prostredníctvom kompozície kontajnerov.
Jadrom IoT Gateway bude MQTT broker Mosquitto. Na zabezpečenie komunikácie s brokerom pridáme do kompozície webovú aplikáciu MQTT Explorer. Súčasťou riešenia bude aj Node-RED, ktorý bude predstavovať jediné programátorské rozhranie dostupné na zariadení IoT Gateway.
A to samozrejme nie je všetko. Zabezpečíme prepojenie so serverom Mother v režime MQTT bridge, spustíme kontajner, ktorý poskytuje aktuálny čas pomocou protokolu NTP a ukážeme si aj to, ako do infraštruktúry pripojiť zariadenia, ktoré komunikujú pomocou iných protokolov než TCP/IP ako napríklad Bluetooth alebo Zigbee.
Ciele
naučiť sa základy práce s nástrojom
docker composenaučiť sa základy tvorby kompozície kontajnerov
naučiť sa základy práce s aplikáciou Node-RED
Postup
The MQTT Broker
Hlavným komunikačným protokolom v architektúre Smart Department je MQTT. Používa sa na komunikáciu medzi zariadeniami a službami, ktoré sa nachádzajú na rozličných vrstvách architektúry. Presne preto ako prvú službu do kompozície zariadenia IoT Gateway pridáme MQTT, ktorý bude srdcom celého riešenia.
V našom prípade použijeme MQTT broker Mosquitto s otvoreným zdrojovým kódom. Ukážeme si, ako ho pridať do kompozície a ako vytvoriť súbor so základnou konfiguráciou.
Task
Vytvorte si samostatný priečinok gateway/, v ktorom sa
bude nachádzať kompozícia pre lokálne zariadenie IoT
Gateway.
V priečinku gateway/ vytvorte nasledovnú štruktúru
priečinkov a súborov:
gateway/
├── compose.yaml
└── configs/
└── mosquitto/
└── config/
Task
V priečinku gateway/configs/mosquitto/config/ vytvorte
súbor mosquitto.conf, ktorý bude obsahovať počiatočnú
konfiguráciu pre službu Mosquitto.
MQTT broker Mosquitto nakonfigurujeme tak, aby sa naň bolo možné pripájať anonymne. To zabezpečíme pomocou nasledujúceho konfiguračného súboru:
# don't include timestamp in log messages
log_timestamp false
# allow annonymous connections
allow_anonymous true
# open listener port
listener 1883
Poznámka
Ak by sme chceli, aby bolo pripojenie k MQTT brokeru
zabezpečené prihlasovacím menom a heslom, musíme vytvoriť súbor, v
ktorom sa bude nachádzať zoznam používateľov s ich heslami. Tento súbor
je možné vytvoriť z vnútra kontajnera pomocou príkazu
mosquitto_passwd nasledovne:
$ mosquitto_passwd -b -c /mosquitto/passwd username passwordNásledne je potrebné upraviť a rozšíriť konfiguračný súbor o tieto riadky:
# disable anonymous connections
allow_anonymous false
password_file /mosquitto/passwd
Task
Vytvorte súbor pre kompozíciu compose.yaml a pridajte do
neho konfiguráciu pre spustenie kontajnera s MQTT brokerom Mosquitto.
O konfigurácii kontajnera musí platiť:
- kontajner spustite z obrazu eclipse-mosquitto
- kontajner komunikuje na porte
1883 - do priečinku kontajnera
/mosquitto/config/pripojte lokálny priečinok./configs/mosquitto/config/v režime na čítanie - politiku na reštartovanie kontajnera nastavte na hodnotu
always
Súbor s kompozíciou bude následne vyzerať takto:
services:
mosquitto:
image: eclipse-mosquitto
restart: always
ports:
- 1883:1883
volumes:
- ./configs/mosquitto/config:/mosquitto/config:ro
Poznámka
Zväzok, ktorý pripája ku kontajneru mosquitto priečinok
s konfiguráciou, má postfix ro. Ten zabezpečí, že prístup k
uvedenému priečinku má kontajner len na čítanie. Mosquitto totiž pri spustení kontajnera
zmení vlastníka súboru s konfiguráciou na 1883:1883.
Task
Spustite vytvorenú kompozíciu.
Súbor s kompozíciou je možné spustiť príkazom:
$ docker compose upPoznámka
Pre testovacie účely je dobré príkaz spúšťať takto:
$ docker compose up || docker compose down --volumesPo nekorektnom ukončení kompozície (napr. stlačením kláves
Ctrl+C) dôjde k ukončeniu kompozície. Vďaka prepínaču
--volumes sa taktiež odstránia všetky anonymné zväzky.
Preto vždy dobre zvážte použitie tohto prepínača.
MQTT Explorer
Aktuálne sa v našej kompozícii nachádza MQTT broker Mosquitto. To je síce skvelé, ale aj tak nemáme šajnu o tom, aké správy cez neho vlastne prechádzajú. Takže - potrebujeme MQTT klienta, pomocou ktorého budeme vedieť správy čítať, ale ich aj posielať.
Na výber máme viacero aplikácií. Niektoré z nich pracujú v prostredí príkazového riadku, čo nemusí vyhovovať každému používateľovi. Preto kompozíciu rozšírime o webového MQTT klienta s názvom MQTT Explorer, ktorý ponúka prehľadné webové rozhranie. Prostredníctvom webového prehliadača tak budeme môcť komunikáciu nie len sledovať, ale aj odosielať vlastné správy.
Task
V priečinku gateway/configs/ vytvorte samostatný
priečinok mqtt-explorer/, v ktorom sa bude nachádzať
konfigurácia webového MQTT klienta MQTT Explorer.
Výsledná štruktúra priečinkov a súborov bude vyzerať nasledovne:
gateway/
├── compose.yaml
└── configs/
├── mosquitto/
│ └── config/
│ └── mosquitto.conf
└── mqtt-explorer/
Task
Rozšírte súbor s kompozíciou o kontajner s MQTT klientom MQTT Explorer.
O konfigurácii kontajnera musí platiť:
- kontajner spustite z obrazu smeagolworms4/mqtt-explorer
- kontajner komunikuje na porte
4000 - do priečinku kontajnera
/mqtt-explorer/config/pripojte lokálny priečinok./configs/mqtt-explorer/ - politiku na reštartovanie kontajnera nastavte na hodnotu
always
Task
Pomocou klienta MQTT Explorer sa pripojte na lokálne spustený MQTT broker Mosquitto.
MQTT Explorer je spustený na
lokálnom porte 4000. Ak teda otvoríte prehliadač na adrese
http://localhost:4000, v prehliadači
sa zobrazí jeho používateľské rozhranie. Pre pripojenie sa k lokálnemu
MQTT brokeru spustenému v kompozícii stačí, ak do poľa
Host zadáte názov služby mosquitto tak, ako je
uvedený v súbore s kompozíciou.
Poznámka
Pri diagnostikovaní problémov vám pomôže sledovať aj log správy,
ktoré produkuje MQTT broker. Tie viete vidieť vo výstupe
príkazu docker compose up, ale jeho súčasťou sú log správy
zo všetkých služieb. Ak chcete zobrazovať správy len zo služby
mosquitto, tak v priečinku, kde sa nachádza súbor s
konfiguráciou kompozície docker-compose.yaml spustite
príkaz:
$ docker compose logs mosquittoRežim MQTT Bridge
MQTT bridge je mechanizmus, ktorý umožňuje prepojenie dvoch (alebo viacerých) MQTT brokerov tak, aby si medzi sebou automaticky vymieňali správy z vybraných tém. Používa sa na preposielanie dát medzi lokálnym a vzdialeným brokerom bez nutnosti priameho pripojenia klientov.
V tomto kroku upravíme konfiguráciu lokálneho MQTT Mosquitto tak, aby sa dokázal pripojiť k MQTT brokeru Mother. Lokálny broker bude preposielať vybrané správy na vzdialený broker Mother a zároveň prijímať správy zo vzdialeného brokera späť.
Týmto spôsobom sú pripojené k serveru Mother všetky
zariadenia IoT Gateway v miestnostiach. Rovnako tak sa do
infraštruktúry môžete pripojiť so svojimi laptopmi a počítačmi. V tomto
prípade budú vaše domáce zariadenia posielať správy do špeciálnej témy s
prefixom v tvare household/ab123cd, kde
ab123cd je váš jedinečný študentský identifikátor.
Task
Vytvorte priečinok gateway/configs/mosquitto/certs/ a
uložte doň CA certifikát, ktorý bude
použitý na overenie zabezpečenej komunikácie medzi lokálnym a vzdialeným
MQTT brokerom.
Task
Rozšírte konfiguračný súbor mosquitto.conf o nastavenie
umožňujúce pripojenie k vzdialenému MQTT brokeru v režime
bridge.
Nastavenia pre zabezpečenie vzdialeného pripojenia k MQTT brokeru sa nachádzajú nižšie. Obsahujú všekty potrebné voľby spolu s konfiguráciou mapovania správ, ktoré sa budú na vzdialený broker odosielať, ako aj tých, ktoré sa z neho budú prijímať.
# bridge configuration
connection household-to-mother
address mother.fei.tuke.sk:8883
clientid ab123cd@household
# TLS settings
bridge_cafile /mosquitto/certs/ca.crt
bridge_insecure true
bridge_tls_version tlsv1.2
# authentication
remote_username student
remote_password dgRk9cQ8sU4fCO
# forwarding messages from local gw to mother
topic +/+/data out 0 gw/ household/ab123cd/
topic +/+/status out 0 gw/ household/ab123cd/
# forwarding messages from mother to local gw
topic +/+/set in 0 gw/ household/ab123cd/
topic +/+/cmd in 0 gw/ household/ab123cd/
topic +/+/ota/+ in 0 gw/ household/ab123cd/
# topics for services
topic +/# in 0 service/ service/
topic +/# out 0 service/ service/
Upozornenie
Nezabudnite nahradiť identifikátor ab123cd svojim
jedinečným študentským identifikátorom.
Poznámka
Poslené riadky súboru začinajúce konfiguračnou direktívou
topic definujú správanie pri preposielaní správ medzi dvoma
brokermi. Preposielané budú len tie správy, ktoré zodpovedajú
príslušnému vzoru (z angl. pattern).
Napr. v prípade konfigurácie
topic +/+/data out 0 gw/ household/ab123cd/
bude platiť, že ak sa posiela správa na lokálny MQTT broker do témy:
gw/thsensor/xiaomi/data
bude na vzdialený MQTT broker doručený do témy:
household/ab123cd/thsensor/xiaomi/data
Význam jednotlivých častí konfigurácie pri odosielaní správ na
vzdialený broker (smer out) je nasledovný:
topic +/+/data out 0 gw/ household/ab123cd/
│ │ │ │ │
│ │ │ │ └─ Vzdialený prefix (pridá sa na serveri)
│ │ │ └────── Lokálny prefix (odstráni sa z pôvodnej témy)
│ │ └────────── QoS level (0, 1 alebo 2)
│ └────────────── Smer: out = z lokálneho na vzdialený
└──────────────────────── Pattern: len témy zodpovedajúce danému vzoru
Pre viac informácií o konfigurácii si zobrazte manuálovú stránku
pre súbor mosquitto.conf.
Task
Otestuje správnosť upravenej konfigurácie.
Otestovať správanie môžete pomocou ľubovoľného MQTT klienta. Stačí, ak pošlete správu na lokálny MQTT broker zodpovedajúcu príslušnému vzrou a overíte, či sa objavila na vzdialenom MQTT brokeri.
Rovnako overte aj prípad, kedy je správa poslaná na vzdialený MQTT broker. Vtedy overte, či je doručená v správnej téme na lokálnom brokeri.
Poznámka
Nezabudnite v konfigurácii kompozície namapovať pre MQTT broker Mosquitto aj priečinok s certifikátmi.
IoT Gateway ako NTP server
Jedným z odporúčaných postupov, ako zvýšiť bezpečnosť IoT riešení, je vytvoriť pre inteligentné zariadenia samostatnú a izolovanú (WiFi) sieť. Tento princíp sa uplatňuje aj pri zariadeniach typu IoT Gateway, ktoré sú súčasťou infraštruktúry Smart Department - každá z týchto brán vytvára vlastný WiFi prístupový bod.
Izolácia tejto siete však zároveň znamená, že chytré zariadenia nemajú priamy prístup k internetu. Samotná absencia internetového pripojenia by nemusela predstavovať problém, avšak naše zariadenia potrebujú synchronizovať systémový čas s niektorým NTP serverom. Keďže sa k internetu nedokážu pripojiť, nebudú schopné vykonať časovú synchronizáciu.
V tomto kroku preto rozšírime kompozíciu služieb o kontajner, ktorý bude poskytovať synchronizáciu času prostredníctvom NTP protokolu. Chytré zariadenia tak získajú možnosť aktualizovať čas aj v rámci lokálnej siete, podobne ako je to bežné napr. pri domácich WiFi smerovačoch.
Task
Do kompozície kontajnerov pridajte konfiguráciu pre spustenie kontajnera pre službu Chrony.
Chrony je univerzálna implementácia protokolu NTP (Network Time Protocol). Dokáže synchronizovať systémový čas pomocou NTP serverov, ale taktiež môže fungovať ako server a partner pre NTPv4 (RFC 5905) a poskytovať časovú službu ďalším počítačom v sieti.
O konfigurácii kontajnera pre službu Chrony bude platiť nasledovné:
- kontajner spustite z obrazu cturra/ntp
- NTP server komunikuje na porte
123pomocou protokoluUDP - politiku na reštartovanie kontajnera nastavte na hodnotu
always - pridajte premennú prostredia
NTP_SERVERSs hodnotoupool.ntp.org
Task
Overte vytvorenú kompozíciu.
Overiť fungovanie spusteného NTP servera si vyžaduje inštaláciu nástrojov, ktoré zrejme nemáte. S nástrojmi, ktoré máme, však môžeme kontrolu urobiť napr. takto:
nastaviť IP adresu NTP servera na vytvorenom chytrom zariadení a overiť výsledok
využitím klienta
chronycpriamo zo spusteného kontajneru:$ docker compose exec chrony \ chronyc -h localhost trackingpomocou jazyka MicroPython (za predpokladu, že ste pripojení na rovnakej sieti)
>>> import ntpdate >>> ntpdate.host = "IOT_GATEWAY_IP_ADDRESS" >>> ntpdate.settime() >>> time.localtime() (2025, 12, 3, 17, 23, 19, 3, 305)Poznámka
Nezabudnite, že výsledná hodnota bude v zóne UTC.
Brána BLE -> MQTT
IoT zariadenia často využívajú rôzne komunikačné technológie, ako sú Zigbee, Bluetooth, Thread, Matter a ďalšie. Jednou z hlavných úloh zariadení typu IoT Gateway je preto sprostredkovať komunikáciu medzi týmito špecializovanými protokolmi a štandardnými sieťovými protokolmi používanými na internete.
Keďže minipočítače Raspberry Pi aj notebooky sú vybavené modulom pre technológiu Bluetooth, v tomto kroku rozšírime kompozíciu služieb o bránu Theengs Gateway. Tá zabezpečí prevod komunikácie z protokolu Bluetooth Low Energy (BLE) do protokolu MQTT, čím umožní jednoduchú integráciu BLE zariadení do infraštruktúry Smart Department.
Task
Rozšírte súbor s kompozíciou o kontajner Theengs Gateway.
O konfigurácii kontajnera musí platiť:
- kontajner spustite z obrazu theengs/gateway
- namapujte do kontajnera rovnakú cestu k zbernici D-Bus,
ktorej umiestnenie je
/var/run/dbus - politiku na reštartovanie kontajnera nastavte na hodnotu
always - pridajte do kontajnera premennú prostredia
MQTT_HOSTa nastavte jej hodnotu na názov kontajnera alebo služby, ktorá poskytuje MQTT broker
Task
Otestujte upravenú kompozíciu.
Theengs Gateway síce neobsahuje žiadne používateľské rozhranie, ale priamo posiela dáta z chytrých zariadení do MQTT brokera prostredníctvom protokolu MQTT. Výsledok je teda možné vidieť v príslušnej téme pomocou aplikácie MQTT Explorer.
Upozornenie
Ak na vašom počítači nemáte BLE modul, ktorý vie počúvať BLE
komunikáciu alebo z rozličných dôvodov vám táto komunikácia nefunguje
(napr. ak používate OS Windows), môžete simulovať existenciu
TH Senzoru od spoločnosti Xiaomi označovaného ako
LYWSD03MMC. Vytvorte si jednoduchý flow, ktorý napr. každých
10s bude posielať nasledovný JSON dokument do témy
gw/theengs/devices/A4C138EA6483:
{
"name": "ATC_EA6483",
"id": "A4:C1:38:EA:64:83",
"rssi": -58,
"brand": "Xiaomi",
"model": "TH Sensor",
"model_id": "LYWSD03MMC/MJWSD05MMC_ATC",
"type": "THB",
"tempc": 24.6,
"tempf": 76.28,
"hum": 35,
"batt": 80,
"volt": 2.929,
"mac": "A4:C1:38:EA:64:83"
}Potom môžete pokračovať ďalej nasledujúcimi krokmi a úlohami.
Transformácia dát pomocou aplikácie Node-RED
Síce sme do MQTT brokera na zariadení IoT Gateway dostali dáta z BLE zariadení v okolí, formát dát nezodpovedá dátam, ktoré používame v projekte Smart Department. Preto ich potrebujeme transformovať do požadovanej formy.
Na transformáciu nebudeme vytvárať vlastné skripty, ale použijeme nástroj Node-RED. V tomto kroku rozšírime kompozíciu o tento nástroj a rovnako tak danú transformáciu vytvoríme.
Task
Do kompozície kontajnerov pridajte konfiguráciu pre spustenie kontajnera s aplikáciou Node-RED.
O konfigurácii kontajnera pre aplikáciu Node-RED bude platiť nasledovné:
- kontajner spustite z obrazu nodered/node-red
- aplikácia komunikuje na porte
1880 - politiku na reštartovanie kontajnera nastavte na hodnotu
always - vytvorte pomenovaný zväzok
nodered, ktorý pripojíte do kontajnera k priečinku/data/
Task
Otestujte upravenú kompozíciu.
Node-RED komunikuje na porte
1880, takže ak otvoríte prehliadač na adrese http://localhost:1880, otvorí sa vám
používateľské rozhranie aplikácie.
Task
V nástroji Node-RED vytvorte flow, ktorým sa prihlásite na odber dát z BLE chytrého senzora prostredníctvom MQTT protokolu.
Flow vytvorte prepojením výstupu uzla mqtt in s uzlom
debug.
Uzol mqtt in nastavte nasledovne:
- kartu pre flow premenujte na názov BLE chytrého senzora s
postfixom komunikačnej technológie, napríklad
ATC_2A3868@blealeboLYWSD03MMC@ble - pridajte konfiguráciu pre MQTT broker, ktorý je v našom
prípade spustený v kontajneri
mosquitto - téma, do ktorej sa prihlásite, nech je téma, do ktorej sú publikované údaje z chytrého BLE zariadenia
- typ výstupu z chytrého BLE senzora nastavte na JSON objekt
Task
Overte správnosť fungovania vášho flow-u.
Ak je všetko správne nastavené, zariadenie sa pripojí k MQTT brokeru a v bočnom paneli Debug sa začnú zobrazovať nové správy z chytrého senzora.
Task
Pomocou vhodných uzlov transformujte správy, ktoré posiela Theengs Gateway do formátu správ, ktoré používame v projekte Smart Department.
Transformáciu správ je možné zabezpečiť viacerými uzlami, napr.:
change- pomocou tohto uzla je možné vyskladať výslednú podobu správy bez nutnosti programovania,template- tento uzol umožňuje vytvoriť šablónu výslednej správy, do ktorej je možné vložiť údaje odoslané senzorom, alebofunction- výslednú podobu správy je možné zostaviť priamo pomocou jazyka JavaScript.
Poznámka
V prípade, že nebudete chcieť časové značky vytvárať priamo pomocou
JavaScript-u, tak si môžete doinštalovať uzol node-red-contrib-moment.
Príklad takéhoto flow-u môže vyzerať takto:
Task
Výslednú správu pošlite do správnej témy na lokálny IoT Gateway.
Výsledný flow bude vyzerať takto:
Task
V nastaveniach pripojenia k MQTT brokeru pre dáta z chytrého
senzora nastavte aj tému pre /status a rovnako tak aj
poslednú vôľu.
Potrebné nastavenia nájdete vo vlastnostiach pripojenia k MQTT brokeru v karte Messages.
Ďalšie úlohy
Ak chcete mať pre svoju kompozíciu aj pekné používateľské webové rozhranie, môžete vyskúšať nietkorý z aplikačných dashboardov, ako je napr. Homepage. Ten je použitý aj na jednotlivých zariadeniach IoT Gateway.
Upravte konfiguráciu MQTT brokera tak, aby bolo spojenie šifrované.
Ďalšie zdroje
- Docker Compose - Docker Compose is a tool for defining and running multi-container applications.
- docker-compose
cheatsheet - ťahák pre používanie
docker compose

