MQTT – protokol nejen pro IoT
V dnešním článku, kterým navazujeme na minulý díl o síťových protokolech, se zaměříme na MQTT. Co říká o MQTT wikipedia? „Internet věcí vyžaduje obrovskou škálovatelnost v síťovém prostoru, aby zvládl nárůst zařízení. IETF 6LoWPAN se používá k připojení zařízení k IP sítím. S miliardami zařízení, které jsou přidávány do internetového prostoru, hraje IPv6 hlavní roli při řešení škálovatelnosti síťové vrstvy. CoAP od IETF, ZeroMQ a MQTT poskytly odlehčený přenos dat. ‚MQ ‚ v ‚MQTT ‚ pochází z produktové řady IBM MQ řady zpráv: (Message Queuing Telemetry Transport). “
MQTT je tedy jednoduchý centralizovaný protokol sloužící nejčastěji pro použití s nejrůznějšími senzory IoT (Internetu věcí). Lze jej však využít i pro přenos mnoha jiných, například telemetrických dat. Základem je princip typu zveřejnit/odebírat (publish/subscribe). Zařízení s funkcí zveřejnit (publikovat) odesílají zprávy zprostředkovateli (MQTT broker), který na základě přihlášených odběrů provede třídění a přeposlání uživatelům. Klient-uživatel může zároveň publikovat i odebírat.
Celé téma je (jako obvykle) poměrně rozsáhlé, proto se raději opět zaměříme na jeden jednoduchý konkrétní projekt. Mějme dvě zařízení ESP, z nichž jedno bude měřit okolní teplotu a druhé bude tuto teplotu zobrazovat na displeji. Použijeme námi oblíbenou desku s ESP32. Případ, kdy teploměr i displej jsou v jediném zařízení jsme už předváděli několikrát. Co když je ale teploměr v jiné místnosti? Nebo dokonce „na jiné planetě“? Proto každé IoT zařízení budeme uvažovat jako samostatné.
Zdrojové kódy jsou na: github.com/octopusengine/octopuslab
Pro teploměr: examples/mqtt/mqtt-temp.py
Pro displej: examples/mqtt/mqtt-disp7.py
# Fragment kódu, základní inicializace mqtt: from utils.mqtt import MQTT m = MQTT.from_config() # načtení nastavení c = m.client c.set_callback(mqtt_handler) # handler musí být definován c.connect() # připojení
Máme tři základní možnosti volby brokera:
1. MQTT broker třetích stran
Na obrázku vidíte v šedých plochách dvě hlavní IoT zařízení. Teploměr temperat. -> ESP a displej ESP -> display. Umístění brokera B1 naznačuje, že je „kdesi na internetu“. Pro experiment se jeví nejjednodušší zkusit si dostupnou službu nějaké třetí strany. Podotýkáme, že data zde jsou veřejná a tak vám je může kdokoli i změnit. Takže to používejte opravdu jen při prvních pokusech!
Nastavení brokera config/mqtt.json: { "mqtt_broker": "broker.hivemq.com", "mqtt_ssl": 0 }
# Fragment kódu, který pošle teplotu brokerovi: ... temp = ts.get_temp() c.publish("octopus/device/" + esp_id + "/temp1",str(temp)) # topic # Posílání přímo na displej: c.publish("octopus/device/" + dis_id + "/disp7",str(temp)) ...
V této ukázce využíváme přímého spojení jednoho zařízení s druhým, kdy teploměr publikuje data adresovaná konkrétnímu displeji (dis_id). Využíváme unikátního ID každého zařízení – nebo MAC adresy.
Ukázka, jak je příchozí zpráva (teplota 21.3) vidět na webu. (Pro přihlášený odběr octopus/#. Topic určuje „cestu“, # je obdoba hvězdičky v dir *.*.
2. Využití Node Red v lokální síti
Velice praktický nástroj, pro nastavování co a jak se má v MQTT síti provádět, je Node Red. Někdy se mu říká orchestrátor, protože trochu jako dirigent řídí celý MQTT „orchestr zařízení“. Zmíníme základní variantu, ve které máme Node Red nainstalován ve svém počítači. Použili jsme rozšířenou verzi od Hardwaria (dříve Big clown), kde ho nazývají playground (hrací hřiště) a má i další moduly. My využijeme především vestavěný MQTT broker (B2 na obrázku).
Jednoduchým a názorným grafickým způsobem propojujeme jednotlivé bloky, co kam se má posílat. Máme mnohem více možností (použít http requesty, API třetích stran, upravování pomocí funkcí…).
3. Vlastní MQTT broker
Pokud to s IoT myslíte vážně, určitě doporučujeme jít touto cestou. Jednoduchý MQTT broker existuje i pro malý počítač Raspberry Pi (například mosquitto). Jeho instalace i nastavení se nám sem ale nevejde.
Pokud si budete chtít s MQTT seznámit a zkusit si popisovaný příklad nebo podobný, ozvěte se nám na info@octopuslab.cz. Můžeme se domluvit na individuálním workshopu nebo konzultaci. V našem labu máme i většinu modulů, co používáme v ukázkách.
tohle se už asi nevejde, mohlo vy to být v jiném díle (podle zájmu)
ale asi to necháme jen na webu:
Máme například klienty co publikují:
teploměr, klávesnice, čidlo vlhkosti, potenciometr…
a k tomu připojíme klienty, co poslouchají (a vykonávají jim určené příkazy, na základě přijatých dat)
displeje, relé, serva, PWM ovládání LED pásku…
Propojení může být různé – zde se nabízí nejčastější:
teploměr na jednom místě -> displej jinde (kdekoli „na Zeměkouli“)
potenciometr -> natočení serva (třeba u pozice kamery)
čidlo vlhkosti -> relé, které spíná čerpadlo zavlažování
…..
Odkaz na zdrojové kódy:
https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/_examples/mqtt-examples/mqtt-slave.py
Na githubu se MQTT chceme věnovat samostatně a podrobněji zde:
https://github.com/octopusengine/octopusLAB_mqtt