MQTT - What to know about it?
MQTT steht für Message Queuing Telemetry Transport. Dieses Netzwerkprotokoll (Client - Server) dient zur Kommunikation von Machine zu Machine und wird daher sehr gerne im IoT Bereich eingesetzt. Hier funken die vielen IoT Devices (Publisher) ihre Daten direkt zu einem MQTT Broker, der dann wiederum seine Subscriber darüber informiert, das es ein Update gibt. Man kann aber nicht nur Daten auslesen, lässt man ein IoT Device einen Topic subscriben und und via einem Publish, zum Beispiel von einem Smartphone, ihm einen neuen Status geben. So ist es zum Beispiel möglich einen Lichtschalter an und aus zu schalten. Kurz und knapp in einem Schaubild erklärt, sieht das dann so aus:
hier publizieren die beiden Sensoren ihre Daten und geben diese and das Smartphone und Laptop Gerät weiter, da diese das "topic" abonniert haben. Der Lichtschalter hingegen, hat selbst ein Abonnement auf einen "topic" und kann so vom Smartphone, was auf diesen "topic" eine Publizierung macht, ein und ausgeschaltet werden.
Die MQTT Ports
Die Gängigen von IANA festgelegten Ports sind:
- TCP 1883 (MQTT Plain, ohne Verschlüsselung)
- TCP 8883 (MQTT mit TLS Verschlüsselung)
- TCP 9001 (Falls man MQTT über Websockets nutzen möchte)
Das MQTT Protokoll
Beim MQTT Protokoll handelt es sich um ein Client-Server Protokoll, d.h. die Clients senden ihre Informationen an einen sogenannten MQTT Broker. Die Nachricht (topic) ist hierbei hierarchisch aufgebaut. z.B. house/groundfloor/livingroom/temperature
Mit Hilfe der Topic Hierarchie ist es Möglich, z.B im SmartHome Bereich das komplette Zuhause, mit allen Stockwerken, Zimmern und so weiter abzubilden. Dieser Topic wird dann samt Nachrichten Inhalt (z.B.: 21°C) an den MQTT Broker publiziert. Die Clients die dieses Topic abonniert haben (Subscription) bekommen die Nachricht dann vom Broker weitergeleitet.
All diese Nachrichten bestehen immer aus einem Topic und Inhalt oder Status (Payload) und können mittels QoS und "retain" Flag verschickt werden. Dabei gibt es drei QoS Level: 0,1 und 2:
QoS0 = at most once
Die Nachricht wird einmal gesendet und kommt bei Verbindungsunterbrechung möglicherweise nicht an. Deshalb auch "fire and forget" gennant und ist normal auch der Standard Level.
MQTT Client ---- PUBLISH QoS0 ---> MQTT Broker
QoS1 = least once
Die Nachricht wird so lange gesendet, bis der Empfang bestätigt wird (PUBACK), und kann beim Empfänger mehrfach ankommen.
---- PUBLISH QoS1 --->
MQTT Client MQTT Broker
<--- PUBACK ----
QoS2 = exactly once
Hierbei wird sichergestellt, dass die Nachricht auch bei Verbindungsunterbrechung genau einmal ankommt. Dies ist die sicherste aber auch langsamste Möglichkeit über MQTT zu Publizieren. Dies wird durch ein vierteiligen Handshake gewährleistet.
---- PUBLISH QoS2 --->
<--- PUBREC ----
MQTT Client MQTT Broker
---- PUBREL --->
<--- PUBCOMP ----
retain Flag
Das "retain" Flag kann eingesetzt werden, damit immer die Letzte Nachricht auf dem Broker zwischengespeichert wird. Damit ermöglicht man Clients, die erst neu einen Topic abonniert haben oder gerade neugestartet wurden, die letzte Nachricht dennoch lesen zu können.
Topic
Jede Nachricht (Payload) wird bei MQTT einem sogenanntem Topic zugewiesen. Dieser ist hierarchisch aufgebaut und kann via Subscription abonniert werden. Sie ähneln einer Ordnerstruktur auf Filesystem Ebene (house/groundfloor/livingroom/temperature
). Topics können mit dem Zeichen "#" und "+" beim abonnieren kombiniert werden.
- "#" = alles, und was darunter liegt
- "+" = Ähnlich einer Wildcard
Neujahrsansprache/1984/# | Alles der Neujahrsansprache von 1984 |
Neujahrsansprache/+/text/ascii | Die ASCII-Texte aller Neujahrsansprachen |
Neujahrsansprache/+/audio/# | Alle Audio-Formate aller Neujahrsansprachen |
Payload
Payload wird der Nachrichten Inhalt eines Topics genannt. Also zum Beispiel bei einem Temeratursensor, die Temperatur (21°C).
Last-Will Paket
Dies ist eine Art Ausfallsicherheit des MQTT. Es handelt sich hierbei um ein konfigurierbares Paket, das vom Broker gesendet wird, sobald ein Client eine Verbindung unsauber abbricht, zum Beispiel durch Netzwerkfehler. So kann man eine Will-Nachricht an einen Topic schicken, der zum Beispiel die Payload “unreachable” oder “0” hat. Nun werden die Subscriber benachrichtigt, dass der Client unerwartet nicht mehr erreichbar ist.
Der MQTT Broker
Der MQTT Broker, das Backend für MQTT ist für die Verwaltung und den Transfer der Daten verantwortlich. Er verwaltet und speichert das komplette Datenaufkommen:
- Topics
- Abonnenten
- Clients
- Payload
- Retained Messages
- IDs
Das MQTT Protokoll ist sehr schmal gehalten, dennoch sollte man bei einer Vielzahl von Clients auf die Bandbreite des Brokers achten und diese dementsprechend dimensionieren. Da der Broker die zentrale Vermittlungsplattform des MQTT Nachrichtenaustausches darstellt, bricht diese im Falle eines Ausfalles komplett zusammen.
Es gibt eine Ganze Liste an MQTT Brokern, hier einmal ein paar Beispiele:
- Eclipse Mosquitto MQTT
- HiveMQ
- RabbitMQ
- VerneMQ
Der MQTT Client (Subscribe / Publish)
Der "Endnutzer" in der MQTT Kommunikation ist der MQTT Client. Dieser kann Nachrichten (Topics & Payload) senden (Publish) und/oder auch empfangen (Subscribe). Jeder Client wird über die ClientID identifiziert, deshalb sollte diese eindeutig sein. Diese wird auch zum Session Handling verwendet.
Es gibt eine Vielzahl an Möglichkeiten sich als Client am Broker anzumelden. Hier ein paar Beispiele:
- Eclipse Paho MQTT Python Client
- MQTT Explorer (Grafisches Tool für Windows/Linux/MacOS)
- Mosquitto MQTT client (kommt bei der Broker Installation mit)
- Eclipse Paho MQTT Python Client
- Eclipse Paho Java Client
- Eclipse Paho JavaScript Client
Sichere Kommunikation
Die meisten Broker und Clients bringen die Möglichkeit mit den Datentransfer via TLS abzuhandeln. Des Weiteren gibt es auch die Möglichkeit Clients sich via Benutzername und Passwort oder aber sogar mittels Client Zertifikat sich am Broker zu authetifizieren.
Quellen
- https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/
- https://pagefault.blog/2020/02/05/how-to-set-up-persistent-storage-for-mosquitto-mqtt-broker/
- https://mosquitto.org/man/mosquitto-conf-5.html
- http://www.steves-internet-guide.com/into-mqtt-python-client/
- https://www.hivemq.com/blog/mqtt-client-library-paho-python/
- https://de.wikipedia.org/wiki/MQTT