MQTT avagy INTRAnet of things – egyszerűen

MQTT protocol example without QoS
Example of an MQTT connection (QoS 0) with connect, publish/subscribe, and disconnect. The first message from client B is stored due to the retain flag.
Az MQTT egy nagyon egyszerű kommunikációs platform annak minden bájával és bajával. Bája az egyszerűsége, baja az, hogy minimális biztonsággal rendelkezik.

NE RAKJ MQTT ESZKÖZT INTERNETRE

Ha egy rossz indulatú IoT kütyü kerül fel az MQTT szerverre, akkor egyrészt el tudja olvasni az összes többi eszköz üzenetét, másrészt bármelyiknek parancsokat is tud küldeni. Amennyiben az eszköz a parancs végrehajtására képes, úgy nem fogja megkérdezni, hogy a másik eszköz jogosult-e arra, hogy neki ezt a parancsot végrehajtásra elküldje.

Mi az MQTT?

Az MQTT egyébként nem friss találmány, 1999 óta használják gép-gép közötti kommunikációra (M2M), és 2013 óta szabvány. A titkosítás mentes kommunikáció alapértelmezett módban a 1883 porton zajlik, SSL-en keresztüli titkosított kommunikácó a 8883-on. Az MQTT szervernél a csatlakozás történhet felhasználó azonosításával vagy anélkül.

Az MQTT protokollal üzeneteket küldhetünk a szerverre, illetve ezekre az üzenetekre feliratkozni tudunk. A kütyük összekapcsolódnak az általad megadott MQTT szerverrel, és az általad megadott topicon keresztül kommunikálnak. A topic egy szöveges forma, ami több szintből állhat, a szinteket “/” jel választja el egymástól. Különböző praktikák vannak arra, hogy mi a legjobb topic szerkezet, ami lehet:

/temperature/szoba/emelet/ház
/ház/emelet/szoba/temperature

formájú. Ennek szerintem a legnagyobb jelentősége a feliratkozásokban van. A feliratkozásnál két speciális karakter van, az egyik a “+”, ami egy topic szintet tesz tetszőlegessé, a másik a “#”, ami kizárólag a feliratkozás utolsó karaktereként használhat “innen bármi állhat” jelentésben.

Ha a példában szereplő többszintes házunkban fel akarunk iratkozni a hőmérséklet értékekre, akkor azt a következőképpen lehetne megoldani

/ház/+/+/temperature
/temperature/#

Fontos: a topic case-sensitive, a /Temperature és a /temperature két különböző topicot jelent!

Mivel a “#” minden nélkül is állhat a feliratkozásban, ezért bármelyik kütyü bármikor képes figyelemmel kísérni az összes publikált üzenetet. Ez röviden azt jelenti, hogy ha egy rossz indulatú IoT kütyü kerül fel az MQTT szerverre, akkor egyrészt el tudja olvasni az összes többi eszköz üzenetét, másrészt bármelyiknek parancsokat is tud küldeni. Amennyiben az eszköz a parancs végrehajtására képes, úgy nem fogja megkérdezni, hogy a másik eszköz jogosult-e arra, hogy neki ezt a parancsot végrehajtásra elküldje. Ebből kiindulva én egyébként sem szeretem az “Internet of Things” kifejezést, mert ki akarja minden cuccát egy védhetetlen hálózatra kirakni… maradjon csak minden szépen a helyi hálózaton, az Intraneten belül!

Mosquitto és az MQTT.fx

Okosotthon környezetben a legelterjettebb megvalósítása egy MQTT szervernek az Eclipse Mosquitto, ami az összes nagy operációs rendszerre letölthető bináris verzióval rendelkezik, vagy a C könyvtárból magunknak fordíthatjuk bárhova. A bináris verziók a szerver megvalósítás mellett két CLI (command line) klienst is tartalmaznak, a mosquitto_pub és a mosquitto_sub programokat – ezáltal az MQTT szerverrel publikálni és feliratkozni is lehet bármelyik operációs rendszerből – amivel nem csak tesztelni lehet, de arra is jó, hogy maga a számítógépünk is egy M2M rendszer eleme legyen, és MQTT üzenetek alapján futtasson le különböző programokat.

A Mosquitto csomag maga elég arra, hogy a hálózaton zajló teljes kommunikációt a kiépítés ideje alatt felügyelni tudjuk, illetve alkalmas arra, hogy tesztüzeneteket küldjünk a rendszerbe. Az MQTT.fx egy olyan MQTT kliens, aminek telepítője elérhető különböző Linux platformokra, MacOS-re és Windowsos gépekre is. Használatával nem csak üzeneteket tudunk a rendszerbe küldeni, illetve feliratkozni, hanem a Mosquitto prarancssoros változatánál jóval szélesebb körű információt kaphatunk az MQTT kommunikációról egy felületen – legyen szó az MQTT bróker (szerver) állapotáról, illetve a szerveren keresztül zajló MQTT kommunikácó logjairól.

MQTT az okosotthonban

Egyes okosotthon eszközök MQTT protokollon keresztül kommunikálnak, ezért egy saját MQTT bróker (pl. mosquitto) szükséges, ha ilyen eszközöket akarunk használni. A teljesség igénye nélkül MQTT-t használnak a különféle Sonoff és Shelby termékek, számos készen kapható szenzor, minden ami Tasmota Firmware-t futtat, és a legtöbb saját készítésű ESP32/Wemos D1/ESP8266 megoldások is.

Az MQTT bróker feladata kizárólag az üzenetek fogadása és szórása. Az üzenetek feldolgozása, például hogy mi történik akkor, ha egy eszköz által küldött állapot adott értékre változik, tehát az okosotthon lényegi része, egy másik szoftverben történik – ez lehet igény szerint FHEM, Dolomitz, NodeRED, OpenHAB, Home Assistant vagy más, tetszőleges szoftver.