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

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.

Smart Department: Architektúra

Ciele

  1. naučiť sa základy práce s nástrojom docker compose

  2. naučiť sa základy tvorby kompozície kontajnerov

  3. 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.

Eclipse Mosquitto Logo

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

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

Task

Spustite vytvorenú kompozíciu.

Súbor s kompozíciou je možné spustiť príkazom:

$ docker compose up

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.

MQTT Explorer

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.

Rež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/

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.

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 123 pomocou protokolu UDP
  • politiku na reštartovanie kontajnera nastavte na hodnotu always
  • pridajte premennú prostredia NTP_SERVERS s hodnotou pool.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 chronyc priamo zo spusteného kontajneru:

    $ docker compose exec chrony \
        chronyc -h localhost tracking
  • pomocou 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)

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.

Theengs Gateway Logo

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_HOST a 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.

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.

Node-RED: Prvé spustenie

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@ble alebo LYWSD03MMC@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.

Node-RED: Prichádzajúce správy z chytrého zariadenia

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, alebo
  • function - výslednú podobu správy je možné zostaviť priamo pomocou jazyka JavaScript.

Príklad takéhoto flow-u môže vyzerať takto:

Node-RED: Transformácia dát pomocou šablóny

Task

Výslednú správu pošlite do správnej témy na lokálny IoT Gateway.

Výsledný flow bude vyzerať takto:

Node-RED: Kompletný flow pre spracovanie dát z chytrého senzora

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

  1. 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.

  2. Upravte konfiguráciu MQTT brokera tak, aby bolo spojenie šifrované.

Ďalšie zdroje

  1. Docker Compose - Docker Compose is a tool for defining and running multi-container applications.
  2. docker-compose cheatsheet - ťahák pre používanie docker compose