Bereits Ende der 1990er Jahre entwickelte IBM an einem sehr schlanken und einfachen Kommunikationsprotokoll zur Überwachung von Ölpipelines. Aus diesem Bestreben ist MQTT (Message Queue Telemetry Transport) entstanden, das sich nun im Zuge des Internet der Dinge wachsender Beliebtheit erfreut. Ende letzten Jahres ist MQTT in der Version 3.1.1. von der Standardisierungsorganisation OASIS dann auch als offizieller Standard verabschiedet worden.
Für die Nutzung von MQTT in Applikationen stellt z. B. Eclipse Paho in diversen Sprachen aktuelle Client-Implementierungen zur Kommunikation mit den MQTT-Kommunikationszentralen, den so genannten Brokern (z. B. mosquitto, HiveMQ, RabbitMQ, ActiveMQ), zur Verfügung.
Für das Testen und Debugging von MQTT-Kommunikation gibt es zahlreiche Werkzeuge. Das auf JavaFX und Eclipse Paho basierende Tool MQTT.fx wird im folgenden Artikel näher vorgestellt.
MQTT in a Nutshell
Ganz allgemein betrachtet ist MQTT ein asynchrones, TCP-basiertes Client/Broker-Publish/Subscribe-Protokoll. Dabei haben Nachrichten einen nur etwa 2 Byte großen Header, und der Rest ist dann Payload, wobei es keine Rolle spielt, ob dieser z. B. reiner Text oder Binärcode ist.
Eine Message Queue hat einen eindeutigen Namen („topic“). Dabei können Queue-Namen auch mit „/“ getrennt werden und damit Hierarchien abbilden, z. B. „home/outdoors/garden/terrace/lights“. An einer solchen Queue können sich Clients zum Nachrichtenempfang bestimmter Topics anmelden („subscribe“) und Nachrichten, z. B. mit Sensorwerten, die an diese Topics gesandt („publish“) werden, empfangen.
MQTT.fx
Projekte und Systeme, die auf MQTT aufbauen, können optional über die Konsole getestet werden. Der Open Source Broker mosquitto bringt hier beispielsweise die Commandline-Tools „mosquitto_pub“ und „mosquitto_sub“ mit, mit deren Hilfe Nachrichten gesendet und empfangen werden können.
Wer es aber grafisch, komfortabler und wiederverwendbar bevorzugt, kann hier auch die JavaFX-basierte Desktopanwendung MQTT.fx einsetzen, an der ich seit geraumer Zeit beständig arbeite und die ich im Folgenden näher vorstellen möchte.
Bisher stellt MQTT.fx folgende Funktionen zur Verfügung:
- Verbindungsprofile für Brokerverbindungen
- Ad-hoc-Verbindungen
- Security (Benutzername/Passwort, Unterstützung für SSL/TLS)
- Publish und Subscribe mit voller Unterstützung von Wildcard-Pattern und Topic-Historie.
- Ablage für vordefinierte Nachrichten
- Nashorn Engine Scripts: Schnittstelle für geskriptetes „publish“ und „subscribe“
- Auswertung von $SYS-Topics (mosquitto und HiveMQ)
- Logging-Konsole
- Proxy Support
- Native Installationspakete für alle Plattformen
- Regelmäßige Updates/Fehlerbehebungen
- Prüfung auf verfügbare Updates beim App-Start
- „Free as free beer“ (noch nicht OpenSource)
Das Hauptfenster stellt im oberen Bereich Funktionen zur Wahl eines Verbindungsprofils sowie Connect- und Disponent-Buttons bereit.
Für die einzelnen Anwendungsfälle gibt es jeweils Tabs, die sich per Drag & Drop auch vom Hauptfenster in separate Fenster lösen lassen. Damit kann z. B. ein „Publish“-Fenster neben ein „Subscribe“-Fenster gestellt werden. Wird ein solches Fenster geschlossen, kehrt das Tab wieder an seine ursprüngliche Position zurück.
Profile für Brokerverbindungen
Unterschiedliche Setups für Brokerverbindungen werden über Profile definiert und gespeichert.
Diese Profile können jederzeit angepasst und über den vergebenen Namen ausgewählt werden. Damit kann z. B. über zwei Profile derselbe Broker mit und ohne SSL/TLS oder User-Credentials getestet werden.
Der Profileditor kann entweder via „Extras/Connection Profiles“, Tastaturkürzel oder über das Zahnradsymbol neben der Profilauswahl geöffnet werden.
Neben Daten wie Brokeradresse/-port, ClientID und generellen Einstellungen wie „clean session“ oder die MQTT-Version können hier auch Benutzernamen/Passwort, TLS/SSL Settings sowie Proxy- und Last-Will-Daten hinterlegt werden.
Zudem werden jeweils für jedes Profil die benutzten Topics (für Publish/Subscribe) sowie die Nachrichten, die auf der Ablage abgelegt wurden, gespeichert und geladen.
Verbindung zum Broker
Für eine Brokerverbindung wird das gewünschte Profil gewählt, und ein Klick auf „Connect“ startet den Verbindungsaufbau. Der Verbindungsindikator am rechten Fensterrand zeigt dann den Status an:
Grün für „verbunden“, Schloss offen: keine Verbindungsverschlüsselung:
Schloss geschlossen: TLS/SSL
Statt der Verbindung über ein gewähltes Profil kann auch eine Ad-hoc-Verbindung unter Angabe von Brokeradresse und -port hergestellt werden.
„Publish“ und „Subscribe“
Ist die Verbindung zum Broker aufgebaut, kann über Publish und Subscribe dem eigentlichen MQTT-Handwerk nachgegangen werden.
Benutzte Topics werden in der Applikationskonfiguration persistiert und stehen beim nächsten Start der Anwendung im Drop-Down bereit.
Abonnierte Topics werden farbig markiert und empfangene Nachrichten zur leichteren Zuordnung entsprechend der Topicfarbe gekennzeichnet. Die jeweilige Farbe für ein Topic kann bei Bedarf angepasst werden und wird auch in der Konfiguration gespeichert.
Vordefinierte Nachrichten
MQTT.fx bietet die Möglichkeit, Nachrichten inkl. dazugehörigem Topic auf einer Ablage zu speichern (zum Beispiel zum wiederholten Ein- oder Ausschalten von Aktoren).
Über den dort bereitgestellten Button kann die Message dann direkt an das vorgesehene Topic „gepublished“ werden:
Die Ablage kann per Drag & Drop umsortiert und einzelne Einträge umbenannt, die Nachricht geändert und gelöscht werden. Selbstverständlich wird die Ablage auch in der Konfiguration jeweils pro Profil gespeichert.
„Scripts“ – JavaScript via Nashorn Engine ausführen
MQTT.fx hat eine Schnittstelle für geskriptetes Senden von MQTT-Messages. Es ist damit möglich, z. B. das Verschicken von Messdaten echter Sensoren zu simulieren, um zu testen, ob und wie die Daten bei der erfassenden Instanz ankommen und verarbeitet werden.
Genutzt wird dabei die Nashorn Engine, die JavaScript-Programme ausführt und seit Java 8 zu den Bordmitteln gehört. Innerhalb des Scripts kann z. B. mittels des gebundenen mqttManager-Objekts über die bestehende Brokerverbindung „gepublished“ und „subscribed“ werden.
Damit Skripte in der Oberfläche sichtbar sind und zur Ausführung gebracht werden können, müssen diese lediglich im (von der Setup-Routine automatisch angelegten) Skripte-Ordner abgelegt werden…
- OS X:
[USER_HOME]/Library/Application Support/MQTT-FX/scripts - Windows:
[USER_HOME]\AppDataLocal\MQTT-FXscripts - Linux:
[USER_HOME]/MQTT-FX/scripts
…und folgender Namenkonvention entsprechen:
[INDEX]__[NAME].js
Dabei gilt:
- [INDEX] bestimmt die Reihenfolge im Drop-Down-Menu
- „__“ ist der Trenner zwischen Index und Name
- [NAME] ist der Name des Menüeintrags im Drop-Down-Feld der GUI. Dabei werden die einfachen Unterstriche durch Leerzeichen ersetzt.
Beispiel:
01__Switch_Fountain_Test.js
Damit wird dieses Skript dann in der Anwendung im Menü an erster Stelle stehen und „Switch Fountain Test“ heißen. Bei gleichem Index gilt dann übrigens der darauf folgende Name als Reihenfolgekriterium.
Beim Start der Anwendung wird das „scripts“-Verzeichnis ausgewertet, und Skripte können dann ausgewählt und ausgeführt werden.
Folgende Bindings stehen in Skripten zur Verfügung:
- Publish, Subscribe, Unsubscribe:
-
mqttManager.publish(String topic, String messageBody);
-
mqttManager.subscribe(String topicFilter);
-
mqttManager.unsubscribe(String topicFilter);
-
- Action:
-
action.setExitCode(int exitCode);
-
action.setExitCodeOk();
-
action.setResultText(String message);
-
- Konsolenausgabe:
-
output.print(String message);
-
- Logging:
-
logger.debug(String message);
-
logger.info(String message);
-
logger.error(String message);
-
logger.warn(String message);
-
logger.trace(String message);
-
Übrigens: Wenn ein Standard-Editor für die Bearbeitung von *.js-Dateien auf dem Desktop-System definiert ist, kann das Skript einfach durch Edit mit diesem bearbeitet werden. In den Einstellungen kann zudem der Editor zum Bearbeiten von Skripten festgelegt werden.
Änderungen sind sofort bei der nächsten Ausführung wirksam, da die Skripte jeweils vor dem Start immer neu geladen werden.
„Broker Status“: Auswertung von $SYS-Topics
Einige Broker senden über eine $SYS-Topic-Hierarchie eigene Statusinformationen, z. B. Versionsinformationen über das Topic $SYS/broker/version oder die Uptime über $SYS/broker/timestamp. Diese $SYS-Topics variieren etwas je nach Broker. Im Moment werden hier von MQTT.fx die Broker mosquitto und HiveMQ unterstützt.
„Log“
Das Tab „Log“ zeigt die Logging-Konsole an, auf der alle MQTT.fx-Aktionen aufgezeichnet werden:
„Check for Updates“
Automatisch beim Start oder über das Menü kann nach bereitgestellten neuen MQTT.fx-Versionen gesucht werden:
Native Installationspakete für OS X, Windows und Linux
Für alle gängigen OS-Plattformen stehen Installationspakete bereit (dmg, pkg, msi, exe, deb, rpm). Diese Pakete sind mit dem mit JavaFX 2.2 eingeführten „Native Packaging“ erstellt und mit ca. 60 MB (190 MB nach der Installation) relativ groß.
Dabei ist die Größe aber dem Umstand geschuldet, dass die passende Java-Laufzeitumgebung gleich mitgeliefert wird. Somit ist es nicht nötig ein systemweites JRE zu installieren. Alternativ kann auch die ungebündelte Version bezogen werden, die etwa 15 MB umfasst (lauffähig mit JRE 8u45 und neuer).
Nach der Installation richtet die Anwendung beim ersten Start alles Nötige ein, um sofort loslegen zu können: Es wird eine Konfiguration mit Beispiel-Profilen erstellt. Es wird auch der Skripte-Ordner angelegt und ein Demo-Skript bereitgestellt.
Community-Feedback
“MQTT.FX supports AWS IoT and it just works!”,
Jinesh Varia (Lead Technology Evangelist and Manager AWS IoT Team)„We tried out and really like MQTT.fx which is under the Apache 2.0 license and has packages available for Windows, Mac and Linux“,
Limor Fried (aka Lady Ada, Adafruit Industries)„The listed features makes it definitely one of the best choices, when experimenting with MQTT at the moment.“,
HiveMQ – Enterprise MQTT Broker„MQTT.fx is the best MQTT client in my opinion.“,
Vinicius Senger
Download
Aktuelle Installationspakete für Mac OSX, Windows und Linux können von meiner Projektseite www.mqttfx.org geladen werden.
Links
The Seven Best MQTT Client Tools
Desktop MQTT Client for Adafruit.io
Internet der Dinge: Leichtgewichtiges Messaging
Videos
Weitere Beiträge
von Jens Deters
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Jens Deters
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.