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

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.

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

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.

Eclipse Mosquitto Logo

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

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

Task

Spustite vytvorenú kompozíciu.

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

$ docker compose up

Task

Rozšírte súbor s kompozíciou o kontajner s MQTT klientom MQTT Explorer.

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.

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