Martin Weissenböck

Was ist ... MQTT?

img

MQTT ist ein Protokoll, das zur Übertragung geringer Datenmengen, zum Beispiel von Messstationen, entwickelt wurde. Ursprünglich war MQTT die Abkürzung für Message Queueing Telemetry Transport, seit der Version 3.1.1 gilt MQTT als Eigenname. Die aktuellen Versionen sind 3.1.1 und 5. Geringe Datenmengen, keine extremen Anforderungen an die Übertragungsgeschwindigkeit, einfach zu implementieren: deshalb ist MQTT für das Smart Home (die Haus-Automatisierung) oder allgemeiner für das Internet-of-Things (IoT) sehr gut geeignet. MQTT kann als inoffizieller Standard für das IoT angesehen werden.

Wie die Signale übermittelt werden, ist für das MQTT-Protokoll unwichtig. Nachrichten werden mittels TCP/IP - das Protokoll, über das auch unsere Internetanfragen laufen - übertragen. Dafür sind die Ports 1883 (unverschlüsselt) und 8883 (verschlüsselt) reserviert.

Auf der Webseite der MQTT-Organisation sind alle technischen Details dokumentiert. Von HiveMQ gibt es das kostenlose eBuch MQTT Essentials (englisch).

Was erwartet Sie in diesem Beitrag?

Sie werden…


Ein im Text weist darauf hin, dass in der Langversion an der Stelle mehr Text, ein Programmcode oder eine detaillierte Anleitung zu finden ist. Die Langversion kann über den Link und den QR-Code am Ende des Beitrags abgerufen werden.

Die Grundlagen

Jedes MQTT-Netzwerk hat genau einen Server, auch Broker oder central hub genannt. Häufig wird im Smart Home dazu ein Raspberry oder ein kleiner Linux-Desktoprechner verwendet. Da dieser Rechner ständig eingeschaltet sein muss, sollte auf den Energiebedarf geachtet werden.

Alle anderen Mitglieder des Netzwerks sind Clients. Jeder Client muss vorerst beim Server registriert werden. Die Registrierung heißt pairing, oft übersetzt mit anlernen. Clients tauschen keine Nachrichten direkt untereinander aus, vielmehr geht alles immer über den Server (Broker):

Aufbau einer Nachricht

Nachrichten bestehen aus einem Thema (Topic) und einem Nachrichteninhalt (Payload).

Bei der Ausgabe werden die Einträge nach dem Schlüsselbegriff oft alphabetisch sortiert.

Übertragen einer Nachricht

Ein Client kann Nachrichten an den Server senden, etwa wenn sich eine Messgröße (wie etwa die Raumtemperatur) ändert oder wenn der Client aufgefordert wird, etwas zu melden. In den Tasmotaeinstellungen kann eingestellt werden, in welchen Abständen der Client seinen Status meldet.

Dieses Senden von Nachrichten heißt publish (veröffentlichen).

Beispiel einer Nachricht (vereinfacht):

Das bedeutet: in einem Smart Home ist im Bad der Temperatursensor Temp installiert und der meldet eine relative Feuchtigkeit von 42.63% und eine Temperatur von 24.00°C

Beispiel einer echten Nachricht :

Die tatsächliche Meldung wurde mit dem Programm JSON Beautifier "verschönert" und sieht so aus

Das bedeutet: in dieser Smart Home Steuerung wird zigbee2mqtt verwendet und deshalb beginnen alle Topics mit zigbee2mqtt Im Erdgeschoß (EG) im Raum SR ist der Temperatursensor TempS02 und der meldet eine relative Feuchtigkeit von 42.63% und eine Temperatur von 20,99°C

Da war doch die Rede von kurzen Nachrichten. Ganz schön gesprächig, so ein einfacher Temperatursensor!

Erklärungen zu einigen ausgewählten Zeilen:

ZeileErklärung
2Der Temperatursensor TempS02 im Raum SR im Erdgeschoß (EG) wurde unter zigbee2mqtt angemeldet. Jedes Topic beginnt daher mit zigbee2mqtt
3Bei jeder neuen Übertragung werden bei diesem Sensor auch die alten Werte übermittelt.
5Der Ladezustand der Batterie in Prozent, siehe Zeilen 54 bis 60
6Die relative Luftfeuchtigkeit in Prozent, siehe Zeilen 72 bis 76
7Die Qualität der Funksignale: ein Wert zwischen 0 und 255 , siehe Zeilen 88 bis 94
8Die Temperatur in Grad Celsius. siehe Zeilen 64 bis 68
9Der Ladezustand der Batterie in Millivolt, siehe Zeilen 80 bis 84
21Jahr, Monat, Tag, Stunde, Minute, Sekunde, Millisekunde, Zeitzone
51Exposes: welche Daten stellt das Gerät zur Verfügung? Zeilen 53 bis 94
97Modellbezeichnung
98Beschreibung des Geräts, bis Zeile 130
132supports ota = Kann über das WLAN eine neue Firmware eingespielt werden?
OTA = Over The Air
133Vendor = Verkäufer
135Wenn disabled auf true gestellt wird, nimmt das Gerät nicht an Datenaustausch teil
136Endpoints = Liste aller Parameter, die für die Ein- und Ausgabe verwendet werden können.
157Friendly name: ein Gerät kann über die IEEE-Adresse oder über die frei wählbare "freundliche" Bezeichnung angesprochen werden.
158Die IEEE-Adresse: eindeutig und unveränderlich
161Bezeichnung, die der Hersteller vergibt
162Modell-Bezeichnung
163Kurzadresse, Verwendung statt der IEEE-Adresse
166Gerätetyp
188_msgid = Jede Mitteilung hat eine eindeutige Nummer, die vom Broker vergeben wird

Abonnieren

Ein (anderer) Client kann Nachrichten abonnieren. Das heißt, der Client teilt dem Server über die Mitteilung subscribe (anmelden) mit, dass er Nachrichten zu einem Topic (im Beispiel oben zum Topic "Bad/Temp") bekommen möchte, etwa um den Temperaturwert für die Steuerung der Heizung zu verwenden.

Auch mehrere Topic können auf einmal abonniert werden:

Mit "#" werden alle Topics einer Hierarchieebene und aller folgenden abonniert. mit "+" nur die Topics der jeweiligen Ebene.

Beispiel: "Erdgeschoß/Wohnzimmer/#" abonniert alle Geräte im Wohnzimmer, "Erdgeschoß/#" alle Geräte im Erdgeschoß.. Mit "Erdgeschoß/+/Temp" können alle Temperatursensoren im Erdgeschoß ausgelesen werden.

Note

Über "Erdgeschoß/Deckenlampen/#" können die Deckenlampen nicht ein- oder ausgeschaltet werden: dazu müsste eine Gruppe eingerichtet werden.

Eine Nachrichtenübertragung im Detail

ErklärungClient 1RichtungServer = BrokerRichtungClient 2
Client 1 meldet sich beim Server anCONNECT   
Server bestätigt die Anmeldung (Acknowledge)CONNACK   
Client 2 hat sich schon früher angemeldet und schickt über das Topic "Bad/Temp" den Wert 24°C an den Server   PUBLISH Bad/Temp 24°C
Dabei wird auch retain gesetzt. Der Server merkt sich die Temperatur  24°C retain
Client 1 abonniert die Temperatur im BadSUBSCRIBE Bad/Temp   
Server schickt den letzten (über retain) bekannten TemperaturwertPUBLISH Bad/Temp 24°C24°C  
Client 2 veröffentlicht einen neuen Temperaturwert: 27°C  27°CPUBLISH Bad/Temp 27°C
Der Server merkts sich den aktuellen Wert und schickt ihn an alle Abonnenten weiter.PUBLISH Bad/Temp 27°C27°C  
Client 1 möchte nicht mehr an der Datenübertragung teilnehmen und meldet sich abDISCONNECT   

Experimente mit MQTT

Dazu benötigen wir einen MQTT-Broker, mindestens einen Client und ein Programm, mit dem wir die PUBLISH- und SUBSCRIBE-Befehle an den Broker senden können

Der Broker: Mosquitto

mosquitto-text-side

Häufig wird Mosquitto eingesetzt: es gibt Versionen für Linux, Mac, Windows und andere. Die Installation wird auf der Mosquitto-Webseite sehr detailliert beschrieben.

Bei mir ist der Mosquitto-Broker unter der Adresse 192.168.12.71 zu finden, die Beispiele sind darauf ausgerichtet. Diese IP-Adresse bitte entsprechend dem eigenen Netz ändern.

Der Client: ESP32

Dann brauchen wir wenigstens ein Gerät, das auf MQTT-Befehle reagiert. Wir können dazu den ESP32 verwenden, der in den PCNEWS 180 beschrieben worden ist. Die Adresse des Brokers muss in Configuration   Configure MQTT eingetragen sein:

tasmota-04

Note

Wer ein Smart Home mit ZigBee und/oder Node-RED aufgebaut hat, findet in der Langversion dieses Beitrags Hinweise, wie damit MQTT-Experimente möglich sind.

Der ESP32 hat (bei mir) die Adresse 192.168.50.1, GPIO2 ist (wie in den PCNEWS 180 beschrieben) als Relais konfiguriert. Um den Zustand des Ausgangs 2 anzuzeigen, wird entweder eine LED angeschlossen oder der Ausgang in der Benutzeroberfläche kontrolliert:

toggle

Das Programm: MQTTX CLI

MQTTX ist nützliches Programm, mit dem alle MQTT-Befehle erprobt werden können und das ohne zusätzlich installierte Programme auskommt. Es wird für verschiedene Betriebssysteme angeboten.

Hier zeige ich den Aufruf über die Windows-Kommandozeile (CLI). Warum über die CLI? Weil damit am besten zu sehen ist, worauf es ankommt!

Jetzt kann es losgehen!

Tip

Die PowerShell verlangt für Zeichenketten in der Kommandozeile einfache Apostrophe - sonst sind in Windows doppelte Apostrophe üblich.

Ein erster Test

Mosquitto bietet einen Testserver an. Können wir den erreichen? Wir geben ein:

mqttx-cli-win-x64.exe pub -h test.mosquitto.org -t 'test/topic' -m 'hallo martin'

und erhalten:

Die Verbindung klappt!

Publish

Beim ESP32 mit der Adresse http://192.168.50.1 ist der Ausgang GPIO2 im Zustand OFF .

Ein Klick auf Information zeigt das Topic dieses ESP32:

Topic

Das Topic zur Steuerung von Tasmota-Komponenten beginnt immer mit cmnd/tasmota_, gefolgt von den letzten 6 Stellen der MAC-Adresse, hier F8:29:14.

MAC Address

Um den Power-(Relay-)Ausgang umzuschalten, ist ein MQTT-Befehl mit dem Topic cmnd/tasmota_F82914/power und dem Payload toggle zu senden:

PS C:\users\martin\Downloads> .\mqttx-cli-win-x64.exe pub -h 192.168.12.71 -p 1883 -t 'cmnd/tasmota_F82914/power' -m 'toggle'

Der Reihe nach:

Absenden! Die Antwort von Mosquitto in der PowerShell

Im Browser wird auf der ESP32-Benutzeroberfläche die Änderung angezeigt. Wer eine LED angeschlossen hat, sieht die Zustandsänderung auch dort.

Details zu den möglichen Formaten des Message (Payload):

https://www.emqx.com/en/blog/how-to-process-json-hex-and-binary-data-in-mqtt

Subscribe

Nun wollen wir etwas von unserem ESP32 empfangen. Der Prozessor bietet viele Anschlussmöglichkeiten für Peripheriekomponenten. Programme müssen nicht geschrieben werden, alles kann über die Configuration eingestellt werden.

Der ESP32 hat aber auch eine Reihe von Sensoren eingebaut: so kann das Magnetfeld über eine Hallsonde oder die Prozessortemperatur direkt ausgelesen werden. (Das Handbuch weist darauf hin, dass diese Messwerte nicht sehr genau sind.)

Um das Magnetfeld anzeigen zu können, ist über Configuration  Configute Module GPIO36 auf HallEffect1 zu setzen. Nicht vergessen: danach Save anklicken!

Der interne Temperatursensor wird über Tools  Console und den Befehl SetOption146 1 eingeschaltet. Es folgt wieder Tools und Main Menu.

In der Benutzeroberfläche erscheint:

Temperatur und Magnetfeld

Mit subscribe teilen wir dem Broker mit, dass wir diese Daten gerne (regelmäßig, bei jeder Änderung) hätten:

PS C:\users\martin\Downloads\> .\mqttx-cli-win-x64.exe sub -h 192.168.12.71 -t 'tele/tasmota_F82914/SENSOR' -p 1883

Zu den Teilen des Befehls:

Und schon treffen die Antworten ein:

Hier noch einmal die erste Payload etwas übersichtlicher:

Zusammenfassung

MQTT kommuniziert vor allem mit den beiden Befehlen PUBLISH und SUBSCRIBE. Mit MQTTX CLI ist deren Funktion einfach zu erproben.

Für alle wichtigen Programmiersprachen gibt es Programmbibliotheken, um MQTT-Befehle direkt aus Programmen absetzen zu können.

Darüber hinaus gibt es eine große Zahl anderer Programme zur Kommunikation. Hier ein paar Beispiele.

Weitere Programme…

MQTTX

MQTTX (ohne CLI) liefert dieselben Informationen, allerdings mit einer grafischen Benutzeroberfläche. ~~

 

MQTTX

 

MQTT.js

MQTT.js ist eine Programmbibliothek für JavaScript bzw. ab Version 5.0 in TypeScript. Die Bibliothek kann im Browser und in Node.js-Projekten verwendet werden. Dadurch werden auch Anwendungen in JavaScript-basierenden Apps, zum Beispiel Svelte, möglich.

Ferner kann MQTT.js auch über die Kommandozeile verwendet werden. Dazu reicht die Installation mit

Zur Demonstration wird in einem Terminalfenster in dem öffentlich zugänglichen Testserver test.mosquitto.orgein subscript gestartet:

Von einem anderen Fenster wird der Text "Von MQTT.js" mit publish gesendet.

Erfolg — der Text kommt im ersten Fenster an!

Zum Topic hallo998877: Der Testserver kann aus dem gesamten Internet verwendet werden. Um nicht von anderen Nutzern gestört zu werden, sollte ein Topic verwenden, das höchstwahrscheinlich sonst niemand verwendet.

 

MQTT Explorer

 

img

Der MQTT Explorer ist ein weiteres Programm, um Mitteilungen an einen Server zu senden (über publish) oder von dem Server zu empfangen (über subscribe), Die Benutzeroberfläche ist etwas gewöhnungsbedürftig, aber nach kurzer Einarbeitung leicht zu bedienen.

MQTT-Commander-1

 

Die Anmeldeseite zeigt hier den Testserver test.mosquitto.org und meine eigenen Testserver.

Bei den bisher besprochenen Programmen ist es notwendig, schon beim Schreiben eines MQTT-Befehls zu wissen, wie die zu verwendenden Topic heißen. Der MQTT Explorer zeigt dagegen alle Topics, die im Netzwerk erreichbar sind.

In dem Beispiel wird an das Topic Hallo998877 der Text "Von MQTT-Commander" gesendet. Der gesendete Text ist rechts unten zu senden, der empfangene links oben und rechts in der Mitte. Einfach einmal ausprobieren!

MQTT-Commander-2

MQTT und Node-RED

Node-RED ist ein grafischer Werkzeugkasten für die Programmierung von ereignisgesteuerten Abläufen. In einer Smart Home Steuerung treten Signale (Ereignisse) ohne vorhersehbaren Ablauf auf und erfordern daher spezielle Programmiertechniken.

Node-RED kann durch Paletten (Programmpakete) erweitert werden, daher kann die MQTT-Kommunikation zwischen Broker (Server) und Clients in Node-RED implementiert werden. Die einzelnen Funktionen werden in Nodes implementiert und mit einander verknüpft. Das Node-RED-Programm kann gemeinsam mit einem MQTT-Broker (wie etwa Mosquitto) und Zigbee2MQTT auf einem Rechner installiert werden. Noide-RED wird als Webseite über einen beliebigen Browser bedient. Übliche Adresse: http://<Rechner-Adresse>:1880. Bei mir also http://192.168.12.71:1880.

MQTT und Zigbee2MQTT

ZigBee ist ein eigener Funkstandard, der wegen der geringeren Datenmenge weniger störungsanfällig ist. ZigBee-Komponenten bauen darüber hinaus dazu über ZigBee-Router ihr eigenes Mesh-Netzwerk auf und können damit auch große Flächen abdecken. ZigBee-Router sind, vereinfacht gesprochen, jene ZigBee-Komponenten, die ständig (über das Stromnetz) mit Energie versorgt werden und deshalb Signale an andere Komponenten weitergeben können. Das Mesh-Netzwerk wird von ZigBee selbstständig aufgebaut und bei Bedarf, zum Beispiel beim Ausfall einer Komponenten, selbstständig reorganisiert. Viele Komponenten für Smart Homes werden in zwei Varianten, nämlich für ZigBee und WLAN, angeboten. Zigbee2MQTT erlaubt die Verbindung von ZigBee-Geräten über MQTT.

Tip

Ein Topic für ein Gerät, das unter ZigBee2MQTT angemeldet ist, beginnt mit zigbee2mqtt, gefolgt vom friedly name, gefolgt von set oder get -- je nachdem, ob ein Befehl an das Gerät abgesetzt wird oder Daten von dem Gerät angefordert werden.

Beispiel: zigbee2mqtt/Erdgeschoß/Deckenlampe/set

MQTT und HTTP

Eine Gegenüberstellung zeigt die wichtigsten Unterschiede.

   
ErklärungMQTTHTTP
BezeichnungMQTT - inzwischen ein "Eigenname"Hyper Text Transfer Protocol
Datenübertragung mit ...publish, subscriberequest, response
Die Objekte haben...ein Topiceinen URI
Beide übertragen über ...TCPTCP
Beide erlauben eine gesicherte Übertragung über ...TLS mit Benutzernamen und PasswortTLS mit Benutzernamen und Passwort
Der Status der Verbindung ist ...bekanntnicht bekannt
Die Übertragung erfolgt...asynchron, ausgelöst von Ereignissensynchron
Werden Daten in einer Warteschlange zwischengespeichert?Ja, der Broker kann Daten zwischenspeichern, wenn der Client nicht erreichbar istNur über Zusatzprogramme
Länge einer Mitteilungmaximal 256 MBytekein Limit
Verteilung der Mitteilungenvom Broker an vieleeins zu eins
SicherheitDrei Qualitätsstufenmuss bei Bedarf zusätzlich implementiert werden

Quelle: basierend auf Unterlagen von HIVEMQ

Wichtige Begriffe

Connection:

Eine Verbindung zwischen Broker und Client (nach dem Pairing) zum Zweck des Datenaustauschs. Zwei Clients tauschen Daten nie direkt aus, immer nur über den Broker. Da der Broker ja den Überblick hat, entscheidet er selbst, wann Daten gesendet werden. Wenn ein Client etwas senden will, sendet er ein CONNECT-Ansuchen an der Broker. Dieser antwortet mit CONNACK (Connection acknowledge, Verbindung bewilligt).

Friendly name:

Jedes Gerät hat eine eindeutige MAC-Adresse, bestehend aus 12 Hexadezimalziffern und geschrieben beispielsweise als 94:B5:55:F8:29:14 oder 0x94b555f82914. Die Geräte können immer darüber angesprochen werden. Da das aber wenig benutzerfreundlich ist, kann zusätzlich ein friendly name, ein freundlicher Name, angegeben und in der Konfigurationsdatei des Brokers eingetragen werden. Beispiel: "Erdgeschoß/Küche/Deckenlampe".

ISO-Schichtenmodell:

MQTT ist in den Schichten 5-7 angelegt. Darunter (in der Schicht 4) ist TCP, das transmission control protocol und (in der Schicht 3) IP (das internet protocol).

Last will and testament (LWT):

Wenn ein Client eine Verbindung aufbaut, kann er zusätzlich eine Nachricht im Broker hinterlegen, die gesendet wird, wenn die Verbindung unterbrochen wird. Genannt last will and testament, (Letzter Wille und Testament) oder kurz nur will

Pairing:

Bevor eine Verbindung mit CONNECT angefordert werden kann, muss ein neues Gerät angemeldet werden. Der Vorgang heißt pairing, übersetzt oft mit anlernen. Dazu muss einerseits am MQTT Broker das Anlernen aktiviert werden und andererseits das neue Gerät selbst in den pairing-Modus versetzt werden.

Payload:

Der aktuelle Nachrichteninhalt; anders formuliert die Daten, die gesendet oder empfangen werden. Payloads werden häufig als JSON-Zeichenkette geschrieben, da diese Schreibweise sehr leicht (für Menschen) lesbar und (für Programme) analysierbar ist.

Publish:

Der Mechanismus zum Senden von Daten

Publisher, Subscriber:

Clients können als Publisher oder Subscriber verwendet werden. Ein Publisher sendet Daten aus (Beispiel: Temperaturwerte), ein Subscriber empfängt Daten und wertet sie aus (Beispiel: ein Microcontroller, der einen Verbraucher schaltet). Viele Clients sind Publisher und Subscriber zugleich.

Quality of Service (QoS):

Welche Qualität der Datenübertragung ist in einem konkreter Anwendungsfall erforderlich, welche Maßnahmen zur Sicherung werden gefordert? Es gibt die Stufen 0, 1 oder 2.

Retain:

Wenn der aktuelle Zustand eines Clients auf Anforderung nicht übertragen werden kann, wird der letzte Zustand übertragen. Dazu ist natürlich eine Zwischenspeicherung im Broker notwendig. Beispiel: ein batteriebetriebener Temperatursensor schickt -- um Energie zu sparen -- nur dann Daten, wenn sich ein Wert ändert, .

Subscribe:

Der Mechanismus für das Anmelden zum Empfangen von Daten

Subscriber:

Siehe Publisher

Topic:

Übersetzt: Thema. Die Adresse eines Geräts oder einer Funktion eines Geräts als Zeichenkette

WebSocket:

WebSocket baut auf TCP auf und erlaubt eine bidirektionale Verbindung. MQTT-Befehle können in WebSockets "verpackt" werden und damit über HTTP/HTTPS übertragen werden. Das gestattet, MQTT-Befehle über Webbrowser zu senden und zu empfangen.

Zur Langversion

Link und QR-Code: https://pcnews.at/markdown/n181/index.html oder https://t.ly/lblE0

Copyright

by-nc-sa1