MQTT - What to know about it?

Aus Laub-Home Wiki

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:

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