IoT Gateway I.: BLE2MQTT Bridge
vytvorenie vlastného zariadenia IoT Gateway pomocou kompozície kontajnerov, transformácia BLE komunikácie zo zariadení tretích strán a do infraštruktúry Smart Department pomocou protokolu MQTT, základy práce s nástrojom Node-RED
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
Motivácia
IoT Gateway je zariadenie (alebo softvér), ktoré slúži ako most medzi IoT zariadeniami a cloud-om (alebo centrálnym serverom). Je to v podstate sprostredkovateľ, ktorý zabezpečuje komunikáciu medzi rôznymi vrstvami IoT architektúry a rovnako tak aj prepojenie rôznych protokolov.
V projekte Smart Department sa zariadenie IoT Gateway nachádza v každej jednej miestnosti. Na tomto cvičení si pomocou kompozície kontajnerov na vlastnom počítači vytvoríme našu vlastnú implementáciu takéhoto zariadenia, ktoré bude obsahovať vlastný MQTT broker a vytvoríme most medzi komunikačným protokolom MQTT a technológiou BLE.
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
Keďže srdcom celej architektúry Smart Department je komunikačný protokol MQTT, tak v prvom kroku vytvoríme základ kompozície práve so zameraním na tento protokol. Do kompozície totiž vložíme MQTT broker Mosquitto a klienta MQTT Explorer.
Task
Vytvorte si samostatný priečinok gateway/, v ktorej 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/
├── configs/
│ ├── mosquitto/
│ └── mqtt-explorer/
└── compose.yaml
Task
V priečinku gateway/configs/mosquitto/ 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:
# allow annonymous connections
allow_anonymous true
# open listener port
listener 1883
# don't include timestamp in log messages
log_timestamp false
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/config/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/config/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/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:/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.
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 mosquittoIoT 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
Takto to pracuje v OS Linux.
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

