MQTT.fx: Grafisches Werkzeug zum MQTT-Debugging

3 Kommentare

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.

mqttfx_gui_main

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.

mqttfx_detached_tabs

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.

mqttfx_connectionprofiles_1

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.

mqttfx_connectionprofiles_2

Verbindung zum Broker

Für eine Brokerverbindung wird das gewünschte Profil gewählt, und ein Klick auf „Connect“ startet den Verbindungsaufbau.mqttfx_connect Der Verbindungsindikator am rechten Fensterrand zeigt dann den Status an:

Grün für „verbunden“, Schloss offen: keine Verbindungsverschlüsselung:

mqttfx_connected_secured_small

Schloss geschlossen: TLS/SSL

mqttfx_connected_unsecured_small

Statt der Verbindung über ein gewähltes Profil kann auch eine Ad-hoc-Verbindung unter Angabe von Brokeradresse und -port hergestellt werden.

mqttfx_connect_ad-hoc

„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.

mqttfx_subscribe_topiccolor

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:

mqttfx_publish_clipboard_1

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.

mqttfx_publish_clipboard_2

„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.

mqttfx_scripts_execution

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.

mqttfx_scripts_fountain-script

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.

mqttfx_scripts_drop-down

Beim Start der Anwendung wird das „scripts“-Verzeichnis ausgewertet, und Skripte können dann ausgewählt und ausgeführt werden.

mqttfx_scripts_folder

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.

mqttfx_broker_status

„Log“

Das Tab „Log“ zeigt die Logging-Konsole an, auf der alle MQTT.fx-Aktionen aufgezeichnet werden:

mqttfx_log

„Check for Updates“

Automatisch beim Start oder über das Menü kann nach bereitgestellten neuen MQTT.fx-Versionen gesucht werden:

mqttfx_check-updates

mqttfx_updates-available

mqttfx_updates-load

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

 

 

Jens Deters

Etwa 25 Jahre ist es her, dass Jens Deters mit dem Home-Computing begonnen hat. Damals zogen ihn Computer in ihren Bann, und die letzten 15 Jahren hatte er verschiedenste Rollen im IT- und Telekommunikationsumfeld inne (Software Entwickler, Trainer, Berater, Projekt- und Produktmanager). Heute arbeitet er bei codecentric als Senior IT Consultant. Er schreibt regelmäßig über seine Projekte (www.jensd.de, www.mqttfx.org) und trägt zur JavaFX- und IoT-Community bei. Jens ist Mitglied des NetBeans Dream Teams.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentare

  • 6. Januar 2016 von Richard Amschild

    Hallo Herr Deters, beim installieren von MQTT.fx (mqttfx-1.0.0-64bit.deb) unter xubuntu erhielt ich folgende Fehlermeldung vom Software-Center: „Dieses Paket ist von schlechter Qualität. Lintian check results for /home/gerald/junk/downloads/mqttfx-1.0.0-64bit.deb:
    E: mqttfx: maintainer-address-malformed Jens Deters “

    Habe es aber trotzdem installiert, macht abgesehen von der Meldung einen guten ersten Eindruck.

    • Jens Deters

      6. Januar 2016 von Jens Deters

      Vielen Dank, das freut mich!
      Ja, an der Linux-Paketqualität muss ich noch etwas arbeiten, das wird sich mit den nächsten Releases verbessern!

  • 6. Januar 2016 von Richard Amschild

    … obwohl: den Speicherort der Konfigurationsdateien möchte ich mir noch selber aussuchen können. Ansonsten läuft es prima. Danke!

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.