Das MQTT-Protokoll (Message Queuing Telemetry Transport) wird seit vielen Jahren verwendet. Aufgrund des explosionsartigen Wachstums des Internet der Dinge ist es jetzt besonders relevant: Sowohl Verbraucher- als auch Industriegeräte implementieren verteilte Netzwerke und Edge-Computing, und Geräte mit kontinuierlicher Datenübertragung gehören zum Alltag des Lebens.
Dies bedeutet, dass leichte, offene und erschwingliche Protokolle im Laufe der Zeit noch wichtiger werden. Dieser Artikel bietet einen konzeptionellen Einblick in MQTT: wie es funktioniert, wie es jetzt verwendet wird und wie es in Zukunft verwendet wird.
Kleine Einführung
MQTT ist ein Publisher-Subscriber-basiertes Messaging-Protokoll (Pub / Sub). Die erste Version im Jahr 1999 wurde
von Andy Stanford-Clark von IBM und Arlene Nipper von Cirrus Link veröffentlicht. Sie betrachteten MQTT als eine Möglichkeit, die Kommunikation zwischen Maschinen in Netzwerken mit begrenzter Bandbreite oder unvorhersehbarer Kommunikation aufrechtzuerhalten. Eine der ersten Optionen für seine Verwendung bestand darin, den Kontakt zwischen Fragmenten der Pipeline untereinander und mit den zentralen Verbindungen über Satelliten sicherzustellen.
Angesichts der rauen Betriebsbedingungen ist das Protokoll klein und leicht. Es ist ideal für Geräte mit geringem Stromverbrauch und begrenzter Akkulaufzeit. Dazu gehören jetzt die allgegenwärtigen Smartphones und die ständig wachsende Anzahl von Sensoren und angeschlossenen Geräten.
Somit ist MQTT zu einem Protokoll für das Streaming von Daten zwischen Geräten mit begrenzter CPU-Leistung und / oder Akkulaufzeit sowie für Netzwerke mit teurer oder geringer Bandbreite, unvorhersehbarer Stabilität oder hoher Latenz geworden. Deshalb ist MQTT als ideales Fahrzeug für IoT bekannt. Es basiert auf dem TCP / IP-Protokoll, es gibt jedoch einen MQTT-SN-Zweig für die Arbeit über Bluetooth, UDP, ZigBee und andere IoT-Netzwerke als TCP / IP.
MQTT ist nicht das einzige Echtzeit-Pub / Sub-Messaging-Protokoll seiner Art, hat sich jedoch bereits in verschiedenen Umgebungen verbreitet, die von der Kommunikation von Maschine zu Maschine abhängen. Zu seinen Kollegen zählen das
Web Application Messaging Protocol , das
Streaming Text-Oriented Messaging Protocol und das
Alternative Message Queuing Protocol .
MQTT ist die logische Wahl für Entwickler, die Anwendungen mit zuverlässiger Funktionalität und umfassender Kompatibilität mit Geräten und Anwendungen erstellen möchten, die mit dem Internet verbunden sind, einschließlich Browsern, Smartphones und IoT-Geräten.
Wie MQTT funktioniert: Die Grundlagen
Das auf MQTT basierende Kommunikationssystem besteht aus einem Publisher-Server, einem Broker-Server und einem oder mehreren Clients. Der Herausgeber benötigt keine Einstellungen für die Anzahl oder den Standort der Abonnenten, die Nachrichten empfangen. Darüber hinaus müssen Abonnenten nicht auf einen bestimmten Herausgeber einstellen. Es können mehrere Nachrichtenbroker im System vorhanden sein.

MQTT bietet eine Möglichkeit, eine Hierarchie von Kommunikationskanälen zu erstellen - eine Art Zweig mit Blättern. Immer wenn der Verlag neue Daten zur Verteilung an Kunden hat, wird der Nachricht ein Hinweis zur Zustellungskontrolle beigefügt. Clients auf höherer Ebene können jede Nachricht empfangen, während Clients auf niedrigerer Ebene Nachrichten empfangen können, die sich nur auf einen oder zwei grundlegende Kanäle beziehen, „Zweige“ am Ende der Hierarchie. Dies erleichtert den Informationsaustausch zwischen zwei Byte
und 256 Megabyte .
Ein Beispiel dafür, wie Sie den Client für die Verbindung über den
MQTT-Broker konfigurieren können:
var options = { keepalive: 60, username: 'FIRST_HALF_OF_API_KEY', password: 'SECOND_HALF_OF_API_KEY', port: 8883 }; var client = mqtt.connect('mqtts:mqtt.ably.io', options);
Alle vom MQTT-Broker veröffentlichten oder empfangenen Daten werden im Binärformat codiert, da MQTT ein Binärprotokoll ist. Dies bedeutet, dass Sie die Nachricht interpretieren müssen, um den ursprünglichen Inhalt zu erhalten. So sieht es mit Ably und JavaScript aus:
var ably = new Ably.Realtime('REPLACE_WITH_YOUR_API_KEY'); var decoder = new TextDecoder(); var channel = ably.channels.get('input'); channel.subscribe(function(message) { var command = decoder.decode(message.data); });
MQTT-Broker können manchmal Nachrichten sammeln, die sich auf Kanäle beziehen, die keine aktuellen Abonnenten haben. In diesem Fall werden die Nachrichten abhängig von den Anweisungen in der Kontrollnachricht entweder verworfen oder gespeichert. Dies ist in Fällen nützlich, in denen neue Teilnehmer möglicherweise den zuletzt aufgezeichneten Datenpunkt benötigen, anstatt auf den nächsten Sendevorgang zu warten.
Es ist bemerkenswert, dass MQTT Sicherheitsanmeldeinformationen im Klartext überträgt, da sonst Authentifizierungs- oder Sicherheitsfunktionen nicht unterstützt werden.
Hier kommt das SSL-Framework ins Spiel , das dazu beiträgt, übertragene Informationen vor dem Abfangen oder sonstigen Manipulieren zu schützen.
Darüber hinaus können Sie in MQTT die Ably-Authentifizierung für Token verwenden, wenn Sie Ihren API-Schlüssel überhaupt nicht an den tatsächlichen MQTT-Client weitergeben möchten (bei MQTT ohne SSL sind Token erforderlich, um die Übertragung von API-Schlüsseln im Klartext zu verhindern). Beispiel für eine Token-Authentifizierung:
var options = { keepalive: 60, username: INSERT_TOKEN_HERE, password: '', port: 8883 }; var client = mqtt.connect('mqtts:mqtt.ably.io', options); client.subscribe("[mqtt]tokenevents", { client.end(); options.username = NEW_TOKEN; client = mqtt.connect('mqtts:mqtt.ably.io', options); });
MQTT-Funktionalität: tieferes Eintauchen
Laut IBM hat MQTT die folgenden Eigenschaften:
- Neutral zum Nachrichteninhalt
- Ideal für verteilte Eins-zu-Viele-Kommunikation und getrennte Anwendungen
- Ausgestattet mit der LWT-Funktion (Letzter Wille und Testament, „Letzter Wille und Testament“), um die Parteien über eine abnormale Trennung des Kunden zu informieren
- Verlässt sich für grundlegende Kommunikationsaufgaben auf TCP / IP
- Entwickelt, um Nachrichten mit den Vorlagen "höchstens einmal", "mindestens einmal" und "genau einmal" zu übermitteln.
Ein Mitglied des MQTT-Systems kann gleichzeitig die Rolle des Herausgebers, Verbrauchers oder beider Rollen übernehmen.
Eines der charakteristischen Merkmale von MQTT ist das einzigartige Verständnis der Kanäle: Jeder von ihnen wird als Dateipfad behandelt, zum Beispiel:
channel = "user/path/channel"
Kanäle stellen sicher, dass jeder Kunde Nachrichten erhält, die für ihn bestimmt sind. Durch die Behandlung von Kanälen als Dateipfade führt MQTT alle Arten nützlicher Kommunikationsfunktionen aus, einschließlich des Filterns von Nachrichten basierend darauf, wo - auf welcher Ebene oder in welchem Zweig - Clients den Dateipfad abonnieren.
MQTT-Nachrichtenformat
Schauen Sie sich die beiden Komponenten an, aus denen jede MQTT-Nachricht besteht:
- Byte 1 : Enthält den Nachrichtentyp (Verbindungsanforderung des Clients, Abonnementbestätigung, Ping-Anforderung usw.), ein Duplizierungsflag, Anweisungen zum Speichern von Nachrichten und Informationen zur Dienstgüte (Quality of Service, QoS).
- Byte 2 : Enthält Informationen zur verbleibenden Nachrichtenlänge, einschließlich der Nutzdaten und aller Daten im Header einer optionalen Variablen.
Das QoS-Flag in Byte 1 verdient besondere Aufmerksamkeit, da es der von MQTT unterstützten Variablenfunktionalität zugrunde liegt. QoS-Flags enthalten die folgenden Werte, basierend auf der Absicht und Dringlichkeit der Nachricht:
- 0 = nicht mehr als einmal: Der Server wird ausgelöst und vergisst. Nachrichten können verloren gehen oder dupliziert werden.
- 1 = mindestens einmal: Der Empfänger bestätigt die Lieferung. Nachrichten können dupliziert werden, die Zustellung ist jedoch garantiert
- 2 = genau einmal: Der Server liefert. Nachrichten kommen genau einmal ohne Verlust oder Vervielfältigung an
Schauen wir uns an, wie die verschiedenen QoS-Ebenen in IoT-Geräten und anderen Anwendungen verwendet werden.
Wo kann ich MQTT verwenden?
Da IoT-Anwendungen jetzt in großem Umfang implementiert werden, hat sich MQTT als offene, einfache und skalierbare Möglichkeit herausgestellt, verteilte Computer- und IoT-Funktionen für eine breitere Anwenderbasis bereitzustellen - sowohl auf dem Verbraucher- als auch auf dem Industriemarkt.
Wie oben erwähnt, ist MQTT ein leichtes Messaging-Protokoll, das für nicht vertrauenswürdige Netzwerke und Geräte mit Einschränkungen hinsichtlich Stromversorgung und CPU entwickelt wurde. Dies bedeutet jedoch nicht, dass die Verbindung mit potenziellem Paketverlust die einzige Anwendung ist. MQTT bietet verschiedene Serviceebenen für verschiedene Arten von IoT-Infrastrukturen, von der wiederholten Datenerfassung bis zur Verwaltung von Industriemaschinen:
- Umgebungssensordaten : Wie bereits erwähnt, unterstützt MQTT das Nachrichtenübermittlungsmodell „nicht mehr als einmal“. In Netzwerken mit teilweiser Abdeckung oder hoher Latenz bedeutet dies, dass Informationen verloren gehen oder dupliziert werden können . In Bereichen, in denen Fernsensoren Daten in festgelegten Intervallen aufzeichnen und übertragen, ist dies kein Problem, da regelmäßig neue Messwerte empfangen werden. Sensoren in entfernten Umgebungen sind normalerweise Geräte mit geringem Stromverbrauch, was MQTT zur idealen Lösung für IoT-Sensoren mit einer relativ niedrigen Datenübertragungspriorität macht.
- Maschinenleistungsdaten : um schnell auf Probleme zu reagieren und Ausfallzeiten zu vermeiden. Beispielsweise muss eine Windkraftanlage die aktuellen Leistungsindikatoren garantiert an lokale Teams liefern, noch bevor diese Informationen das Rechenzentrum erreichen. In solchen Situationen stellt die Zustellung von Nachrichten „mindestens einmal“ sicher, dass die entsprechenden Spezialisten von den erforderlichen Spezialisten unverzüglich bemerkt werden, auch wenn sie als Duplikate eintreffen. Dies ist wichtig für die Maschinenkommunikation mit höherer Priorität.
- Abrechnungssysteme : Es gibt noch vorrangigere und genauere Nachrichten, die korrekt verarbeitet werden müssen. In Geschäftssituationen, in denen das Duplizieren von Datensätzen nicht akzeptabel ist, einschließlich in Abrechnungssystemen, ist das QoS-Flag „genau einmal“ nützlich. Dies eliminiert die Verdoppelung oder den Verlust von Paketen in Abrechnungs- oder Abrechnungssystemen, verringert die Anzahl der Anomalien und unnötigen Widersprüche, wie vereinbart.
Wann sollte MQTT nicht verwendet werden?
Entwickler haben eine große Auswahl an Protokollen zum Entwerfen und Bereitstellen von bidirektionalen IoT-Kommunikationskanälen, einschließlich MQTT, HTTP,
CoAP ,
WebSockets (sofern die CPU / Batterie dies zulässt) und anderen. Ob MQTT die beste Wahl ist, hängt von der Hardware und der Aufgabe der Anwendung ab.
Das MQTT-Protokoll wurde für Umgebungen mit extrem geringer Bandbreite entwickelt und kann sehr unflexibel sein, um jedes Byte zu speichern. Beispielsweise definiert die Spezifikation nur fünf Fehlermeldungen, mit denen der Server die Verbindung ablehnen kann (z. B. einen ungültigen Benutzernamen / ein ungültiges Kennwort oder eine nicht akzeptable Version des Protokolls). Wenn der Server auf einen anderen Fehler hinweisen möchte, hat er kein Glück. Schlimmer noch, wenn nach dem Starten der Verbindung ein Fehler auftritt, gibt es überhaupt keinen Mechanismus, um einen Fehler zu melden. Der Server kann nur mit den Schultern zucken und die TCP-Verbindung abrupt beenden, sodass der Client keine Ahnung hat, warum er sie abgebrochen hat (und ohne eine absichtliche Trennung von einem vorübergehenden Netzwerkproblem zu unterscheiden). Für Leute, die an flexiblere und einfacher zu debuggende (wenn auch weniger sparsam in Bezug auf die Bandbreite) Pub / Sub-Protokolle gewöhnt sind, mag ein solcher spartanischer Ansatz ein wenig primitiv erscheinen.
MQTT wird häufig zusammen mit HTTP bezeichnet. Daher führte Google eine Studie durch, in der die Antwortzeit, das Verkehrsaufkommen und andere für Entwickler wichtige Attribute verglichen wurden. MQTT belegte in Google-Tests den ersten Platz, jedoch
nur unter Bedingungen, unter denen die Verbindung zum Senden mehrerer Nutzdaten
wiederverwendet werden kann .
HTTP und MQTT sind aufgrund des relativ geringen Datenverkehrs, des geringen Batterie- und Speicherbedarfs eine gute Wahl für IoT-Anwendungen.
CoAP ist ein weiteres Protokoll, das häufig mit MQTT für die Entwicklung von IoT-Systemen verglichen wird. Sie sind ähnlich, aber es gibt spürbare Unterschiede. MQTT ist ein Viele-zu-Viele-Protokoll, während CoAP im Grunde ein Eins-zu-Eins-Protokoll für die Kommunikation zwischen einem Server und einem Client ist. Gleichzeitig bietet CoAP Funktionen für Metadaten, Ermittlung und Inhaltsverhandlung, über
die MQTT nicht verfügt .
In Fällen, in denen Clients nur Daten empfangen sollen, sind vom
Server gesendete Ereignisse ebenfalls eine geeignete Option.
So richten Sie MQTT schnell ein
Das MQTT-Repository auf GitHub verfügt über
eine umfangreiche Liste von Open Source-MQTT-Bibliotheken in verschiedenen Sprachen. Im Folgenden finden Sie zwei Beispiele für die Anpassung mithilfe des Open Source-MQTT-Brokers, der JavaScript-Bibliothek und der .NET-Bibliothek.
Eclipse Mosquitto - Open Source MQTT Broker
Eclipse Mosquitto ist ein Open Source Message Broker (EPL / EDL), der die MQTT-Protokolle Version 5.0, 3.1.1 und 3.1 implementiert. Mosquitto ist leicht und für alle Geräte geeignet: von Single-Board-Computern mit geringem Stromverbrauch bis hin zu vollwertigen Servern.
MQTT.js
MQTT.js ist eine
Clientbibliothek für das MQTT-Protokoll, die in JavaScript für Node.js und einem Browser geschrieben wurde. Hier ist ein Beispiel für das Senden einer Nachricht mit MQTT.js:
var mqtt = require('mqtt') var client = mqtt.connect('mqtt://test.mosquitto.org') client.on('connect', function () { client.subscribe('presence', function (err) { if (!err) { client.publish('presence', 'Hello mqtt') } }) }) client.on('message', function (topic, message) {
MQTTnet
MQTTnet ist eine leistungsstarke .NET-Bibliothek, die sowohl den Client als auch den MQTT-Server (Broker) bereitstellt.
Installation des MQTT-Clients:
Nachdem Sie die MQTT-Clienteinstellungen konfiguriert haben, können Sie eine Verbindung herstellen. Der folgende Code zeigt, wie eine Verbindung zum Server hergestellt wird:
Eingehende Nachrichten empfangen:
client.UseApplicationMessageReceivedHandler(e => { Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###"); Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}"); Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}"); Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}"); Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}"); Console.WriteLine(); Task.Run(() => client.PublishAsync("hello/world")); });
Post Veröffentlichung:
var message = new MqttApplicationMessageBuilder() .WithTopic("MyTopic") .WithPayload("Hello World") .WithExactlyOnceQoS() .WithRetainFlag() .Build(); await client.PublishAsync(message);
Weitere Beispiele finden Sie in der
MQTTnet-Dokumentation und im Wiki .
Anbieter für Unternehmen verfügen
über handelsübliche MQTT-Server für skalierbares Messaging zwischen mobilen Anwendungen, Industriemaschinen und einer Vielzahl anderer IoT-Anwendungen. In diesem
Handbuch erfahren Sie, wie Sie MQTT über einen Broker auf Unternehmensebene verwenden.
Was ist mit Skalierung?
Bei der Skalierung von MQTT sind zwei Überlegungen zu berücksichtigen: 1) Ist dies das richtige Protokoll? 2) Unabhängig von der Wahl des Protokolls, welche Infrastruktur- und Netzwerkfunktionen erforderlich sind, um den erhöhten Datenverkehr zwischen Geräten mit MQTT zu bewältigen.
Lightweight Machine-to-Machine (LWM2M) ist ein weiteres Protokoll, das mit MQTT auf Unternehmensebene verwendet werden kann. Im Vergleich zu MQTT ist es manchmal
besser für langfristige IoT-Systeme geeignet . MQTT ist ideal für einen mühelosen Testlauf von IoT geeignet, während das LWM2M Funktionen für eine langfristige, vielseitige Infrastruktur bietet. LWM2M bietet außerdem überlegene Geräteverwaltungstools wie Verbindungsüberwachung, Firmware-Updates und Remote-Geräteaktionen. Für Unternehmen mit einer großen Anzahl nicht verwalteter Geräte, die große Datenmengen an eine zentrale Plattform senden, ist LWM2M die beste Wahl. Wir sprechen jedoch von umfangreichen IoT-Bereitstellungen, sodass MQTT normalerweise mehr als eine angemessene Option ist. Darüber hinaus ist MQTT häufiger und wird breiter unterstützt.
Nun zu den Möglichkeiten der Infrastruktur. Beim Laden von Servern ist die Anzahl der gleichzeitigen Verbindungen selten ein Engpass. Die meisten guten MQTT-Server / Broker unterstützen Tausende von gleichzeitigen Verbindungen. Wie hoch ist jedoch die Arbeitslast, die zum Verarbeiten und Beantworten von Nachrichten erforderlich ist, nachdem der MQTT-Server die tatsächlichen Daten empfangen hat? In der Regel gibt es alle möglichen Probleme, z. B. Lesen und Schreiben in und aus der Datenbank, Integration in den Server, Verteilung und Verwaltung von Ressourcen für jeden Client usw. Sobald ein Computer die Last nicht mehr bewältigt, müssen Sie zusätzliche Server hinzufügen. Denken Sie also an den Lastenausgleich, die Nachrichtensynchronisierung zwischen Clients, die mit verschiedenen Servern verbunden sind, den allgemeinen Zugriff auf den Clientstatus, unabhängig von der Verbindungszeit oder dem spezifischen Server, mit dem der Client verbunden ist - der Produktliste zhaetsya und es geht weiter.
Solche Probleme verdienen einen separaten Artikel, und viele Informationen finden Sie im Engineering-Bereich
unseres Blogs . Lesen Sie insbesondere den Artikel über
einige der Komplexitäten bei der Wartung einer umfangreichen Echtzeit-Messaging-Infrastruktur .
Wie ist die aktuelle Situation mit MQTT?
Im April 2019 veröffentlichte OASIS MQTT v5.0 als offiziellen Standard. OASIS ist ein gemeinnütziges Konsortium aus 600 Mitgliedsorganisationen und
5.000 Einzelmitgliedern .
Version 5.0 enthält eine Reihe
neuer Funktionen , die für Entwickler von Echtzeitsystemen von Interesse sein sollten. Diese neuen Funktionen sind abwärtskompatibel mit aktuellen Versionen von MQTT. Unter ihnen:
- Verbesserte Fehlerberichterstattung : Rückkehrcodes können jetzt darüber informieren, dass Daten aus irgendeinem Grund nicht übertragen werden. Optionale Zeichenfolgen werden unterstützt, um den Grund anzugeben. Sie helfen bei der Verbesserung der Fehlerbehebungsdiagnose.
- Abonnements freigeben : Um die Last auszugleichen, können Abonnements auf der empfangenden Seite von mehreren Clients gemeinsam genutzt werden.
- Nachrichteneigenschaften : Version 5.0 führt Metadaten als Teil des Nachrichtenkopfs ein. Es kann dem Endbenutzer zusätzliche Informationen übermitteln oder einige der anderen unten aufgeführten Funktionen erleichtern.
- Kanalalias : Publisher können Kanäle durch numerische Kennungen ersetzen, um die Anzahl der zu sendenden Bytes zu verringern.
- Ablaufdatum der Nachricht: Nachrichten können zum automatischen Löschen markiert werden, wenn das System sie nicht innerhalb eines bestimmten Zeitraums zustellen kann.
Eine vollständige Liste der neuen MQTT 5.0-Funktionen finden Sie in
Anhang C des offiziellen Standards.
Zusätzlich zu den vielen Consumer-Geräten und -Diensten auf dem Markt hat MQTT Verwendung in Unternehmensinfrastrukturen
aller Formen und Größen gefunden . Dies sind Smartphones und Tablets, Energieüberwachungssysteme, medizinische Geräte, Ölplattformen und Bohrinseln, die Automobil- und Luftfahrtindustrie sowie Sensoren und Bildverarbeitungssysteme, die in den Bereichen Materialtransport, Bauwesen, Lieferkette, Einzelhandel und vielem mehr eingesetzt werden.
MQTT und Ably
MQTT ist ein beliebtes, weit verbreitetes und relativ ausgereiftes Protokoll. Es eignet sich hervorragend für
viele Echtzeitanwendungen und nicht nur für die Bereitstellung von IoT. Da die Produktion und der Verbrauch von Echtzeitdaten jedoch weiterhin
exponentiell zunehmen , ist MQTT möglicherweise nicht immer das richtige Protokoll, um Ihre Streaming-Anforderungen zu erfüllen. Befolgen Sie unseren Abschnitt
Echtzeitkonzepte, um Informationen zu anderen Protokollen und deren Anpassung an Ihre Situation zu erhalten.
Ably bietet einen
Broker und einen MQTT-Protokolladapter mit Übersetzung in das eigene Protokoll von Ably in beide Richtungen, sodass Sie sich in vorhandene Systeme und Verbindungen integrieren können. Es werden WebSockets, HTTP, SSE, gRPC (in Entwicklung), STOMP, AMQP und andere Protokolle zum Organisieren einer verteilten Echtzeit-Messaging-Infrastruktur unterstützt. Es gibt über 40 SDK-Client-Bibliotheken und Unterstützung für proprietäre Echtzeitprotokolle.