Jste zde

IoT MQTT prakticky v automatizaci - 1.díl - úvod

MQTT představuje jednoduchý způsob nenáročného přenosu malého množství dat prostřednictvím běžné TCP/IP internetové sítě. Je tedy ideální pro moderní domácí i průmyslové IoT systémy. Proto jej začínají podporovat i programovací funkce průmyslových HMI a PLC.

Internet of Things (IoT) je v poslední době skloňovaný ve všech směrech a to i v průmyslových aplikacích. Mezi představitele IoT je zahrnován i komunikační protokol MQTT. V několika dílech seriálu bych chtěl MQTT ukázat hlavně z praktického pohledu použití, včetně konkrétní ukázky přenosu z průmyslových HMI zařízení, které již také začínají MQTT protokol aktivně podporovat.

Dříve než se pustíme do praktického hraní s MQTT komunikací, je dobré mít alespoň nějaké základní teoretické informace.

Co je MQTT?

MQTT (MQ Telemetry Transport) je jednoduchý a nenáročný M2M / "Internet of Things" komunikační protokol. Původně byl navržen v IBM, ale dnes za ním stojí konsorcium "Eclipse foundation" a před nedávnem proběhla standardizace OASIS.

MQTT je ve svém principu založen na předávání zpráv mezi klienty prostřednictvím centrálního serveru – brokeru. Ten funguje něco jako "novinář", který přijímá zprávy od poskytovatele zpráv (tzv. publisher) a ty následně předává k přečtení jednomu či více čtenářům, kteří o ně mají zájem (tzv. subscribers). Jeden broker (novinář) může mít mnoho různých poskytovatelů zpráv (publishers) a mnoho čtenářů (subscribers), přičemž čtenářům předává jen ty zprávy, k nimž se každý ze čtenářů přihlásil k odběru. V reálu pak publisher i subscriber je stvořeny elektronickými jednotkami v podobě MQTT klientů, kteří jsou společně připojeny na  jednu MQTT server jednotku (MQTT broker). Teoreticky každý klient může být současně publisher (generátor / poskytovatel zpráv) i subscriber (příjemce, odběratel zpráv), ale dost často bývají tyto funkce rozděleny. Publisher obvykle reprezentuje nějaký snímač či měřící jednotka, která vysílá naměřeného hodnoty na broker (server), zatímco subscriber obvykle tvoří nějaká řídící jednotka, která hodnoty odebírá (přijímá) a dále s nimi pracuje  nebo je zobrazuje.

 

Základní funkční schéma MQTT komunikace a příklad přenosu hodnoty teploty ze snímačů do HMI.

Struktura MQTT přenosu zpráv

Přenášené zprávy jsou tříděny do tzv. témat (topic). Každá zpráva patří právě do jednoho tématu, přičemž témata definuje přímo generátor zpráv, tedy publisher. Subscriber pak musí předem znát "jméno (označení)" téma, aby se mohlo přihlásit u brokeru k jeho odběru. Jen k tématům, ke kterým se subscriber přihlásí, dostává (jsou mu brokerem přeposílána). Subscriber nemusí znát umístění ani komunikační adresu publisheru. Musí jen znát komunikační adresu (umístění) brokeru. Témata jsou hierarchická a oddělená lomítky.

Například „snímač 3 v kanceláři 2, v prvním patře v budově 2“ může mít topic „budova2/patro1/kancelar2/snimac3“, „snímač 5 v kanceláři 5, v prvním patře v budově 2“ může mít topic „budova2/patro1/kancelar5/snimac5“  nebo třeba teplotu vzduchu ve skleniku 3 pana Vojáčka lze označit jako „Vojáček/sklenik3/teplota-vzduch“.

Témata jsou v MQTT reprezentovány v podobě řetězce v UTF-8 kódování, takže i pojmenování s diakritikou není problém. Hierarchie témat není nijak pevně dána a záleží jen na aplikaci a návrhu programátora. Jak správně navrhnout hierarchii může však být i netriviální úloha. Ne vždy je totiž ta nejsprávnější struktura ta „přirozená“. Důležité je už v rámci těchto úvah rozmyslet datový model a rozhraní – tedy vhodné uspořádání tak, aby bylo možné přihlásit takové topics, které logicky patří k sobě.

 

Příklad přenosu naměřených hodnot senzorů v různých tématech (topics).

Obsah zpráv

Samotný obsah zpráv není nijak definovaný. Jsou jím prostě nějaká binární data, která mají být přenesena. Nejčastěji se používá formát (způsob zápisu) dat JSON (JavaScript Object Notation), BSON (Binary JSON) nebo textové zprávy. Ale v zásadě to mohou být data libovolného formátu, protože broker (server) tyto data nijak neposuzuje a nepracuje s nimi, jen je přeposílá. Záleží tak čistě jen na příjemci dat (subscriberu), aby je "pochopil".

Velikost zprávy je pak v aktuální verzi protokolu omezena na necelých 256 MB, ale vzhledem k zaměření "Internet of Things" bývá většina zpráv mnohem menší. MQTT tak minimalizuje množství přenášených dat, což byl od začátku cíl. Proto se velmi hodí pro přenos jen občasných, na rychlost přenosu méně náročných, informací a hodnot, což je právě ideální pro účel IoT.

Přenosový model

Protokol MQTT sám o sobě popisuje jen samotný popis struktury přenášených zpráv, ale nedefinuje způsob přenosu. K tomu využívá běžný TCP/IP protokol, tedy prakticky využívá běžnou lokální LAN ethernetovou i globální WAN internetovou síť. MQTT protokol tvoří tak pouze tzv. aplikační hladinu OSI modelu. Protože MQTT protokol má velmi jednoduchou strukturu a využívá běžné ethernetové komunikační rozhraní, je snadno implementovatelný i do zařízení s „malými“ procesory a rychle se rozšiřuje. Ze stejného důvodu se začíná i rychle implementovat a rozšiřovat v průmyslu, protože implemetace MQTT podpory do firmwaru PLC, které již obsahují TCP/IP rozhraní (Ethernet s RJ-45 konektorem), je poměrně jednoduchá a není nutné nijak modifikovat hardware CPU jednotky.

V souvislosti se samotným přenosem zpráv pak MQTT protokol definuje tři úrovně potvrzování zpráv QoS (Quality of Service):

  •  Nejnižší "QoS 0" znamená, že zpráva je odeslána bez potvrzení a není zaručeno její doručení (at-most-once).

  • Prostřední úroveň "QoS 1" říká, že zpráva je doručena alespoň jednou (at least once).

  • Nejvyšší úroveň "QoS 2" znamená, že každá zpráva je doručena právě jednou (exactly once).

Klient však nemusí podporovat všechny tři uvedené úrovně QoS, protože samotný MQTT protokol to nepožaduje. 

Zabezpečení přenosu a identifikace klientů

 Pro zabezpečení přenášeného obsahu dává MQTT na výběr několik možností. Každá komunikace mezi klientem a brokerem začíná přihlášením klienta (režim "CONNECT").

V přihlašovací sekvenci se využívá identifikace každého klienta pomocí "ClientID" a pak volitelně i pomocí uživatelské jména "Username" a hesla "Password". Pokud nám to dovolují možnosti klienta, je vhodné nastavit "ClientID" jako jednoduchý řetězec, který jej co nejlépe identifikuje. Dále MQTT díky podpoře SSL/TLS umožňuje také přihlášení pomocí klientského SSL certifikátu. Podprovány jsou protokoly TLS v1.2, v1.1 nebo v1.0 s x509 certifikáty. Je důležité si uvědomit, že protokol MQTT je čistě textový, a proto bez použití SSL/TLS bude komunikace zcela nešifrovaná (nebezpečí se týká hlavně přenášeného hesla). Jistou možností je pak i využití vlastních klíčů (pre shared key – PSK), které slouží pro zašifrování komunikace jednotlivých klientů na základě jejich identit.

Podle požadované úrovně šifrování komunikace pak MQTT protokol předepisuje následující TCP kanály:

  • 1883 = MQTT nešifrovaný přenos (unencrypted) - základní a nejběžnější MQTT komunikační kanál, kde komunikace je zcela nešifrovaná (nebezpečí se týká hlavně přenášeného hesla). Po tomto kanálu by tak neměla zasílat žádná citlivá data.

  • 8883 = MQTT šifrovaný přenos (encrypted) - narozdíl od kanálu 1883 jsou data zde šifrována SSL/TLS protokolem a navázání komunikace tak vyžaduje podporu klienta.

  • 8884 = MQTT šifrovaný přenos (encrypted) + certifikát klienta (client certificate) - toto je speciální a nejvyšší úroveň zajištění MQTT komunikace, protože nejen, že jsou data opět šifrována protokolem SSL/TLS, ale klient musí poskytnout i certifikát o autenticitě vydávaný brokerem. Tento kanál však zatím podporuje jen málo veřejných brokerů (např. Mosquitto - server "test.mosquitto.org").

V lokálních LAN sítích (zvnější nepřístupných) lze využívat nešifrovaný přenos v TCP kanále 1883. Přenos dat přes externí broker v rámci WAN sítě (internet) je vhodnější využít šifrovaný SSL/TLS přenos v TCP kanále 8883.

Závěr 1. dílu

MQTT je zajímavý hlavně svojí velkou jednoduchostí a jeho popularitu demonstruje již i rostoucí podpora ze strany průmyslových PLC a HMI panelů. Budoucnost má tak patrně zářivou.

Než se pustíme do praktického hraní s MQTT komunikací, je dobré mít alespoň nějaké základní informace. K tomuto účelu měl přispět tento 1. díl. Více informací si pak již ukážeme na prvních praktických "pokusech" s MQTT přenosem jednoduchých dat v dalším 2. dílu i několika dílech následujících.

Odkazy:

Hodnocení článku: 

Komentáře

Náš (ne)milovaný učitel, nám tuto zadal a četl nám to celou hodinu :| úplně mimo ten chlap, nechápu, že ho nechají učit IoT. AKA učitel INFISu Jan Fiala.