MQTT

Aus besserwiki.de

Message Queuing Telemetry Transport (MQTT) ist ein offenes Netzwerkprotokoll für Machine-to-Machine-Kommunikation (M2M), das die Übertragung von Telemetriedaten in Form von Nachrichten zwischen Geräten ermöglicht, trotz hoher Verzögerungen oder beschränkter Netzwerke. Entsprechende Geräte reichen von Sensoren und Aktoren, Mobiltelefonen, Eingebetteten Systemen in Fahrzeugen oder Laptops bis zu voll entwickelten Rechnern.

Das MQTT-Protokoll ist auch unter älteren Namen wie „WebSphere MQTT“ (WMQTT), „SCADA-Protokoll“ oder „MQ Integrator SCADA Device Protocol“ (MQIsdp) bekannt.

Die Internet Assigned Numbers Authority (IANA) reserviert für MQTT die Ports 1883 und 8883. MQTT-Nachrichten können mit dem TLS-Protokoll verschlüsselt werden.

Interessant ist, dass ein MQTT-Server („Broker“) die gesamte Datenlage seiner Kommunikationspartner hält, und so als Zustands-Datenbank benutzt werden kann. So ist es möglich, kleine unperformante MQTT-Geräte mit einem MQTT-Broker zu verbinden, wobei die Geräte Daten einsammeln und/oder Befehle entgegennehmen, während ein komplexes Lagebild nur auf dem MQTT-Broker entsteht und hier oder durch einen leistungsfähigen Kommunikationspartner ausgewertet werden kann. Stelleingriffe können so von einer oder mehreren leistungsfähigen Instanzen an den MQTT-Broker übermittelt und auf die einzelnen Geräte verbreitet werden. Dadurch eignet sich MQTT sehr gut für Automatisierungslösungen und findet im Bereich IoT durch die einfache Verwendung große Verbreitung.

MQTT
Mqtt-hor.svg
MQTT-Logo
StatusVeröffentlicht
Jahr gestartet1999
Letzte Version5.0
7. März 2019
OrganisationOASIS
AusschussTechnischer Ausschuss OASIS Message Queuing Telemetry Transport
RedakteureAndrew Banks (IBM), Ed Briggs (Microsoft), Ken Borgendale (IBM), Rahul Gupta (IBM)
Verwandte StandardsMQTT-SN
Websitemqtt.org

MQTT (ursprünglich ein Initialismus für MQ Telemetry Transport) ist ein leichtgewichtiges Publish-Subscribe-Netzwerkprotokoll von Maschine zu Maschine. Es ist für Verbindungen mit entfernten Standorten konzipiert, die über Geräte mit eingeschränkten Ressourcen oder begrenzter Netzwerkbandbreite verfügen. Es muss über ein Transportprotokoll laufen, das geordnete, verlustfreie, bidirektionale Verbindungen ermöglicht - in der Regel TCP/IP. Es handelt sich um eine offene OASIS-Norm und eine ISO-Empfehlung (ISO/IEC 20922).

Geschichte

Andy Stanford-Clark (IBM) und Arlen Nipper (damals für Eurotech, Inc. tätig) verfassten die erste Version des Protokolls im Jahr 1999. Es wurde zur Überwachung von Ölpipelines innerhalb des industriellen SCADA-Kontrollsystems verwendet. Ziel war es, ein Protokoll zu entwickeln, das bandbreiteneffizient und leichtgewichtig ist und wenig Batteriestrom verbraucht, da die Geräte über eine Satellitenverbindung verbunden waren, die damals extrem teuer war.

Historisch gesehen stammt das "MQ" in "MQTT" von der IBM MQ-Produktlinie (damals "MQSeries"), wo es für "Message Queue" steht. Das Protokoll bietet jedoch Publish-and-Subscribe-Messaging (keine Warteschlangen, trotz des Namens). In der von IBM als Version 3.1 veröffentlichten Spezifikation wurde das Protokoll als "MQ Telemetry Transport" bezeichnet. In späteren Versionen, die von OASIS veröffentlicht wurden, wird das Protokoll nur noch als "MQTT" bezeichnet, obwohl das technische Komitee selbst den Namen "OASIS Message Queuing Telemetry Transport Technical Committee" trägt. Seit 2013 steht "MQTT" für nichts mehr.

Im Jahr 2013 reichte IBM MQTT v3.1 beim OASIS-Spezifikationsgremium mit einer Charta ein, die sicherstellte, dass nur geringfügige Änderungen an der Spezifikation akzeptiert werden konnten. Nachdem die OASIS die Wartung des Standards von IBM übernommen hatte, wurde Version 3.1.1 am 29. Oktober 2014 veröffentlicht. Ein umfangreicheres Upgrade auf MQTT Version 5, das mehrere neue Funktionen hinzufügt, wurde am 7. März 2019 veröffentlicht.

MQTT-SN (MQTT for Sensor Networks) ist eine Variante des Hauptprotokolls, die auf batteriebetriebene eingebettete Geräte in Nicht-TCP/IP-Netzwerken wie Zigbee ausgerichtet ist.

Seit 2013 wird MQTT über die Organization for the Advancement of Structured Information Standards (OASIS) als Protokoll des Internet der Dinge standardisiert.

Überblick

Das MQTT-Protokoll definiert zwei Arten von Netzwerkeinheiten: einen Nachrichtenbroker und eine Anzahl von Clients. Ein MQTT-Broker ist ein Server, der alle Nachrichten von den Clients empfängt und dann die Nachrichten an die entsprechenden Zielclients weiterleitet. Ein MQTT-Client ist ein beliebiges Gerät (von einem Mikrocontroller bis hin zu einem vollwertigen Server), auf dem eine MQTT-Bibliothek läuft und das über ein Netzwerk mit einem MQTT-Broker verbunden ist.

Die Informationen werden in einer Hierarchie von Themen organisiert. Wenn ein Herausgeber neue Daten zu verteilen hat, sendet er eine Kontrollnachricht mit den Daten an den angeschlossenen Broker. Der Broker verteilt die Informationen dann an alle Clients, die sich für dieses Thema angemeldet haben. Der Verleger muss keine Daten über die Anzahl oder den Standort der Abonnenten haben, und die Abonnenten müssen ihrerseits nicht mit Daten über die Verleger konfiguriert sein.

Wenn ein Broker eine Nachricht zu einem Topic empfängt, für das es keine aktuellen Abonnenten gibt, verwirft der Broker die Nachricht, es sei denn, der Publisher der Nachricht hat die Nachricht als zurückbehaltene Nachricht gekennzeichnet. Eine aufbewahrte Nachricht ist eine normale MQTT-Nachricht, bei der das Flag "retained" auf "true" gesetzt ist. Der Broker speichert die letzte zurückgehaltene Nachricht und die entsprechende QoS für das ausgewählte Topic. Jeder Client, der ein Topic-Muster abonniert, das mit dem Topic der zurückbehaltenen Nachricht übereinstimmt, erhält die zurückbehaltene Nachricht unmittelbar nach dem Abonnieren. Der Broker speichert nur eine aufbewahrte Nachricht pro Thema. Dies ermöglicht es neuen Abonnenten eines Themas, den aktuellsten Wert zu erhalten, anstatt auf die nächste Aktualisierung durch einen Herausgeber zu warten.

Wenn sich ein Verlags-Client zum ersten Mal mit dem Broker verbindet, kann er eine Standardnachricht einrichten, die an die Abonnenten gesendet wird, wenn der Broker feststellt, dass der Verlags-Client unerwartet die Verbindung zum Broker unterbrochen hat.

Clients interagieren nur mit einem Broker, aber ein System kann mehrere Broker-Server enthalten, die Daten auf der Grundlage der aktuellen Themen ihrer Abonnenten austauschen.

Eine minimale MQTT-Kontrollnachricht kann bis zu zwei Byte an Daten umfassen. Eine Kontrollnachricht kann bei Bedarf fast 256 Megabyte an Daten enthalten. Es gibt vierzehn definierte Nachrichtentypen, die verwendet werden, um einen Client mit einem Broker zu verbinden und die Verbindung zu trennen, um Daten zu veröffentlichen, den Empfang von Daten zu bestätigen und die Verbindung zwischen Client und Server zu überwachen.

MQTT basiert auf dem TCP-Protokoll für die Datenübertragung. Eine Variante, MQTT-SN, wird über andere Transportwege wie UDP oder Bluetooth verwendet.

MQTT sendet Verbindungsnachweise im Klartextformat und enthält keine Maßnahmen zur Sicherheit oder Authentifizierung. Dies kann durch die Verwendung von TLS gewährleistet werden, um die übertragenen Informationen zu verschlüsseln und gegen Abfangen, Änderung oder Fälschung zu schützen.

Der standardmäßige unverschlüsselte MQTT-Port ist 1883. Der verschlüsselte Port ist 8883.

MQTT-Broker

Der MQTT-Broker ist eine Software, die auf einem Computer (vor Ort oder in der Cloud) läuft und entweder selbst entwickelt oder von einem Drittanbieter gehostet wird. Es gibt sowohl Open-Source- als auch proprietäre Implementierungen.

Der Broker fungiert als Poststelle. MQTT-Clients verwenden keine direkte Verbindungsadresse des Empfängers, sondern die Betreffzeile "Topic". Jeder, der ein Topic abonniert, erhält eine Kopie aller Nachrichten für dieses Topic. Mehrere Clients können ein Topic von einem einzigen Broker abonnieren (one to many capability), und ein einzelner Client kann Abonnements für Topics bei mehreren Brokern registrieren (many to one).

Jeder Client kann sowohl Daten produzieren als auch empfangen, indem er sie veröffentlicht und abonniert, d. h. die Geräte können Sensordaten veröffentlichen und gleichzeitig Konfigurationsinformationen oder Steuerbefehle empfangen (MQTT ist ein bidirektionales Kommunikationsprotokoll). Dies hilft sowohl beim Austausch von Daten als auch bei der Verwaltung und Steuerung von Geräten. Ein Client kann nicht dieselben Daten an eine Reihe von Themen senden, sondern muss mehrere Nachrichten an den Broker senden, wobei jede Nachricht ein einzelnes Thema enthält.

Mit der MQTT-Broker-Architektur werden die Client-Geräte und die Server-Anwendung entkoppelt. Auf diese Weise wissen die Clients nichts von den Informationen des jeweils anderen. MQTT verwendet TLS-Verschlüsselung mit durch Benutzernamen und Passwort geschützten Verbindungen. Optional kann die Verbindung eine Zertifizierung in Form einer Zertifikatsdatei erfordern, die ein Client bereitstellt und mit der Kopie des Servers abgleichen muss.

Im Falle eines Ausfalls können die Broker-Software und die Clients automatisch auf einen redundanten/automatischen Backup-Broker umschalten. Backup-Broker können auch so eingerichtet werden, dass sie die Last der Clients auf mehrere Server vor Ort, in der Cloud oder eine Kombination aus diesen verteilen.

Der Broker kann sowohl Standard-MQTT als auch MQTT für konforme Spezifikationen wie Sparkplug unterstützen. Dies kann mit dem gleichen Server, zur gleichen Zeit und mit den gleichen Sicherheitsstufen erfolgen.

Der Broker speichert alle Sitzungsinformationen, wenn das Gerät ein- und ausgeschaltet wird, in einer Funktion namens "persistent sessions". In diesem Zustand speichert ein Broker sowohl die Verbindungsinformationen für jeden Client, die Themen, die jeder Client abonniert hat, als auch alle Nachrichten für ein Thema mit einer QoS von 1 oder 2.

Die wichtigsten Vorteile von MQTT-Brokern sind:

  1. Eliminiert anfällige und unsichere Client-Verbindungen
  2. Einfache Skalierung von einem Gerät auf Tausende
  3. Verwaltet und verfolgt alle Client-Verbindungszustände, einschließlich der Sicherheitsanmeldeinformationen und Zertifikate
  4. Geringere Netzbelastung ohne Beeinträchtigung der Sicherheit (Mobilfunk- oder Satellitennetz)

Nachrichtentypen

Verbinden

Beispiel für eine MQTT-Verbindung (QoS 0) mit Connect, Publish/Subscribe und Disconnect. Die erste Nachricht von Client B wird aufgrund des Retain-Flags gespeichert.

Wartet auf den Aufbau einer Verbindung mit dem Server und stellt eine Verbindung zwischen den Knoten her.

Trennen der Verbindung

Wartet darauf, dass der MQTT-Client seine Arbeit beendet und die TCP/IP-Sitzung getrennt wird.

Veröffentlichen

Kehrt sofort zum Anwendungsthread zurück, nachdem die Anforderung an den MQTT-Client übergeben wurde.

Version 5.0

Im Jahr 2019 hat OASIS den offiziellen MQTT 5.0-Standard veröffentlicht. Version 5.0 enthält die folgenden wichtigen neuen Funktionen:

  • Reason Codes: Acknowledgements unterstützen jetzt Rückgabecodes, die einen Grund für einen Fehler angeben.
  • Gemeinsam genutzte Abonnements: Ermöglichen einen Lastausgleich zwischen den Clients und verringern so das Risiko von Lastproblemen.
  • Ablauf der Nachricht: Nachrichten können mit einem Verfallsdatum versehen werden und werden gelöscht, wenn sie nicht innerhalb dieses Zeitraums zugestellt werden.
  • Themen-Alias: Der Name eines Themas kann durch eine einzelne Zahl ersetzt werden

Qualität der Dienstleistung

Für jede Verbindung zum Broker kann ein Dienstgütemaß (QoS) angegeben werden. Diese sind in aufsteigender Reihenfolge des Overheads klassifiziert:

  • Höchstens einmal - die Nachricht wird nur einmal gesendet und der Client und der Broker unternehmen keine weiteren Schritte, um die Zustellung zu bestätigen (fire and forget).
  • Mindestens einmal - die Nachricht wird vom Absender mehrmals wiederholt, bis er eine Bestätigung erhält (acknowledged delivery).
  • Genau einmal - Sender und Empfänger führen einen zweistufigen Handshake durch, um sicherzustellen, dass nur eine Kopie der Nachricht empfangen wird (assured delivery).

Dieses Feld hat keinen Einfluss auf die Handhabung der zugrunde liegenden TCP-Datenübertragungen; es wird nur zwischen MQTT-Sendern und -Empfängern verwendet.

Anwendungen

Mehrere Projekte implementieren MQTT, zum Beispiel:

  • OpenHAB, die Open-Source-Softwareplattform für Hausautomatisierung, enthält eine MQTT-Anbindung.
  • Die Open Geospatial Consortium SensorThings API-Standardspezifikation hat eine MQTT-Erweiterung im Standard als zusätzliche Nachrichtenprotokollbindung. Sie wurde in einem IoT-Pilotprojekt des US-Ministeriums für Heimatschutz demonstriert.
  • Node-RED unterstützt MQTT mit TLS-Knoten ab der Version 0.14.
  • Home Assistant, die Open-Source-Softwareplattform für Hausautomatisierung, ist MQTT-fähig und bietet ein Mosquitto-Broker-Add-on.
  • ejabberd unterstützt MQTT ab der Version 19.02.
  • Die Eclipse Foundation verwaltet eine Sparkplug-Protokollspezifikation, die mit MQTT kompatibel ist. Es baut auf MQTT auf und fügt Anforderungen hinzu, die für industrielle Echtzeitanwendungen erforderlich sind.

Sicherheit

Die Sicherheit des MQTT-Protokolls wurde im Jahr 2020 von einigen italienischen Forschern gefährdet, die langsame DoS-Angriffe auf dieses Protokoll durchführten (siehe CVE-2020-13849).

Implementierungen