Internet of Smoke

Smoke Testing von MQTT-Anwendungen mit MQTT CLI

Till Seeberger

© BePhumirat/Shutterstock.com

Bereits heute kommunizieren Millionen von Endgeräten im Internet of Things über das MQTT-Protokoll miteinander. Die Prognosen, wie viele es in den kommenden Jahren sein werden, überschlagen sich immer wieder. Gegenüber diesem prognostizierten rasanten Wachstum erweist sich die Entwicklung neuer Geräte jedoch oft als langsam. Das kann häufig die Entwicklung weiterer Anwendungen blockieren, die die Daten der Geräte verarbeiten sollen. Um diese Engpässe zu überbrücken, kann das Tool MQTT CLI verwendet werden. Das Kommandozeilenwerkzeug simuliert schnell und einfach Endgeräte und kann so für erste Tests von MQTT-Anwendungen verwendet werden.

Am 21. Oktober 1999 veröffentlichte IBM-Entwickler Andrew Stanford-Clark gemeinsam mit dem heutigen Cirrus-Link-Präsidenten Arlen Nipper die erste Version des Protokolls MQTT. Innerhalb der nächsten zwanzig Jahre konnte sich MQTT als OASIS-Standard, ISO-Standard und letztendlich als der De-facto-Standard für die IoT-Kommunikation etablieren. Denn heute stellen nahezu alle großen Anbieter wie IBM, Microsoft und Amazon MQTT-Verbindungen als standardmäßige Option für IoT-Verbindungen bereit.

Doch die Entwicklung von MQTT hat damit noch lange kein Ende genommen. So veröffentlichte OASIS letztes Jahr den offiziellen MQTT-5-Standard, um der wachsenden Komplexität von Cloudanwendungen beizukommen (Erklärungen zu den MQTT-5-Features finden sich in der Reihe „MQTT 5 Essentials“). Mit dieser Veröffentlichung begann für viele Entwickler ein Umstellungsprozess auf die neue Version. Eine wiederkehrende Herausforderung bei der Entwicklung neuer IoT-Anwendungen besteht darin, Änderungen schnell und umfänglich zu testen. Mit dem Tool MQTT CLI möchte das HiveMQ-Team diese Aufgabe erleichtern, indem es die Implementierung eines vollständigen MQTT-5-Clients übernimmt. Denn mit dem MQTT CLI können diese problemlos erstellt werden, um mit ihnen alle gängigen MQTT-Operationen durchzuführen. Schnell und einfach von der Kommandozeile aus.

MQTT CLI ist ein vollwertiges mit MQTT 5.0 und MQTT 3.1.1 kompatibles Kommandozeilenwerkzeug für MQTT-Clients. Es basiert auf dem HiveMQ MQTT Client API und ist als Open-Source-Projekt unter der Apache-2.0-Lizenz auf GitHub veröffentlicht, wo das Tool vom HiveMQ-Team betreut und gepflegt wird. Grundlegend werden drei Befehle unterstützt: Publish, Subscribe und Shell, mit dem der Shellmodus des Clients gestartet wird, um mehr Kontrolle über die MQTT-Clients zu erhalten. Dieser Artikel skizziert die Nutzung des MQTT CLI, um ein schnelles und unkompliziertes Testen von MQTT-Anwendungen zu ermöglichen.

Installation

MQTT CLI unterstützt alle gängigen Betriebssysteme, da es als Java-Applikation betriebssystemunabhängig ist. Bei der Installation werden die für das jeweilige System üblichen Paketverwaltungsprogramme unterstützt. So kann das CLI für macOS über den Paketmanager Homebrew bezogen und verwaltet werden. Da es sich bei dem Tool um ein Kommandozeilenwerkzeug handelt, wird ein Terminal zur Befehlseingabe benötigt. Unter macOS kann MQTT CLI beispielsweise durch die Eingabe der folgenden Befehle installiert werden:

$ brew tap hivemq/mqtt-cli
$ brew install mqtt-cli

Nach erfolgreicher Installation kann MQTT CLI mit folgendem Befehl auf die neueste Version aktualisiert werden:

$ brew upgrade mqtt-cli

Nun ist der Befehl mqtt über die Kommandozeile zugänglich. Die Version und die aktuelle Umgebung des CLI kann wie folgt überprüft werden:

$ mqtt -V

In der offiziellen Dokumentation finden sich Installationsanweisungen für die anderen unterstützten Betriebssysteme.

Hello, MQTT 5!

MQTT basiert auf dem Publish-/Subscribe-Paradigma. Im Beispiel aus Abbildung 1 publishen Temperaturfühler Daten auf sogenannten Topics zu einem MQTT Broker, der sie an Clients publisht, die jeweils auf das Topic subscribt sind.

Abb. 1: Das Publish-/Subscribe-Paradigma

Abb. 1: Das Publish-/Subscribe-Paradigma

Publish und Subscribe bilden auch die grundlegenden Operationen des MQTT CLI. Um einen Überblick darüber zu gewinnen, welche Operationen mit dem neu gewonnen Befehl mqtt möglich sind, kann die Hilfe des Tools angezeigt werden (Abb. 2).

Abb. 2: Das Hilfsmenü des MQTT CLI

Abb. 2: Das Hilfsmenü des MQTT CLI

Für einen ersten Basistest senden wir eine Nachricht mit MQTT 5 an einen MQTT 5 unterstützenden Broker wie HiveMQ oder Mosquitto. Für die vorgesehenen Testzwecke wird der öffentliche Broker von HiveMQ verwendet, der unter broker.hivemq.com zu erreichen ist:

$ mqtt publish -V 5 -p 1883 -h broker.hivemq.com -t helloTopic -m "Hello, MQTT5"

Mit diesem Befehl wird ein MQTT-5-Client erzeugt, der auf den für MQTT reservierten Port 1883 des Brokers broker.hivemq.com auf das Topic helloTopic die Nachricht „Hello, MQTT5“ veröffentlicht. Da Port und Version voreingestellt sind, kann der Befehl folgendermaßen abgekürzt werden:

$ mqtt pub -h broker.hivemq.com -t helloTopic -m "Hello, MQTT5"

Die erwähnten Voreinstellungen können in der Datei config.properties im Home-Verzeichnis unter .mqtt-cli/ eingesehen und modifiziert werden. Neben des verwendeten Ports und der MQTT-Version lassen sich dort noch weitere Einstellungen wie Host und Debug-Level angeben.

Durch den publish-Befehl wurde die Nachricht „Hello, MQTT5“ an den Broker gesendet, jedoch gab es keinen Client, der eine Subscription auf das Topic des Brokers hatte, weshalb dieser die Nachricht gelöscht hat. Um Nachrichten auch empfangen zu können, kann das subscribe-Kommando des CLI verwendet werden:

$ mqtt sub -h broker.hivemq.com -t helloTopic

Sobald der obige Befehl bestätigt wird, wird ein Client erstellt, der sich auf das Topic helloTopic subscribt, dort eingehende Publishes empfängt und auf dem Terminal ausgibt. Die Konsole wird durch diesen Befehl blockiert. Wird der publish-Befehl nun in einem anderen Terminal erneut ausgeführt, wird die Nachricht „Hello, MQTT5“ in der Konsole des subscribe-Befehls angezeigt. Das subscribe-Kommando kann mit STRG + C beendet werden, wodurch auch die Konsole wieder freigegeben wird.

Analyse einzelner Pakete

MQTT nutzt eindeutig definierte und spezifizierte Pakete zur Kommunikation. Wenn sich eine Anwendung nicht wie erwartet verhält, kann es sehr aufschlussreich sein, sich die Details einzelner MQTT-Pakete anzusehen. Enterprise MQTT Broker wie HiveMQ bieten dafür in der Regel Möglichkeiten, einzelne Clients genau zu tracen. Mit MQTT CLI erhält der Nutzer über die Optionen -d und -v Einblick in die einzelnen Pakete, die zwischen Client und Broker versendet werden. Durch die Angabe der Option -d (Debug) werden dem Anwender detaillierte Informationen auf der Konsole ausgegeben:

$ mqtt pub -h broker.hivemq.com -t testTopic/ -m "Hello, MQTT5" -d
CLIENT mqttClient: sending CONNECT
CLIENT mqttClient: received CONNACK SUCCESS
CLIENT mqttClient: sending PUBLISH: (Topic: testTopic/, QoS AT_MOST_ONCE, Message: 'Hello, MQTT5')
CLIENT mqttClient: acknowledged PUBLISH: 'Hello, MQTT5' for PUBLISH to Topic:  testTopic/

Hierdurch kann der Nutzer genau nachvollziehen, welche Operationen ein Client ausführt und wo möglicherweise ein Problem auftritt. Sind die Ausgaben nicht aussagekräftig genug, so können über die Option -v Verbose-Level-Informationen ausgegeben werden.

Volle Clientkontrolle – Shellmodus

Nicht immer ist ein publish– oder subscribe-Befehl für vorgesehene Tests ausreichend. So ist es beispielsweise bei manchen Anwendungen viel interessanter, wie mit den Verbindungen mehrerer Clients umgegangen wird. Der Shellmodus des CLI bietet eine kompakte Möglichkeit, Kontrolle über eine Vielzahl von Clients zu erhalten:

$ mqtt shell

Mit diesem Befehl wird der interaktive Shellmodus des MQTT CLI gestartet und damit einige weitere Befehle bereitgestellt. Wie in Abbildung 3 zu sehen ist, gibt es keinen publish– oder subscribe-Befehl.

Abb. 3: Interaktiver Shellmodus des MQTT CLI

Abb. 3: Interaktiver Shellmodus des MQTT CLI

Das liegt daran, dass der Shellmodus immer mit einem bestimmten Client arbeitet, dem Kontextclient. Ein solcher Client wird durch den connect-Befehl erzeugt:

$ mqtt> con -h broker.hivemq.com
$ mqttClient@broker.hivemq.com> 

Die kontextbezogenen Clients können unterschiedliche MQTT-Operationen durchführen. Neben publish und subscribe stehen die weiteren Operationen unsubscribe und disconnect zur Verfügung (Abb. 4).

Abb. 4: Kontextclient

Abb. 4: Kontextclient

Einer der großen Vorteile des Shellmodus besteht darin, mehrere MQTT-Clients parallel verbinden zu können. Hierdurch können Verbindungsszenarien in einer kompakten Shell-Sessions getestet werden. Das folgenden Erläuterungen zu Listing 1 verdeutlichen, wie zwei parallellaufende MQTT-Clients im Shellmodus miteinander kommunizieren können:

1 $ mqtt> con -i subscriber -h broker.hivemq.com
2 $ subscriber@broker.hivemq.com> sub -t test/topic1 -of subscriber.log
3 $ subscriber@broker.hivemq.com> exit
4 $ mqtt> con -i publisher -h broker.hivemq.com 
5 $ publisher@broker.hivemq.com> pub -t test/topic1 -m "Hello"
6 $ publisher@broker.hivemq.com> dis
7 $ mqtt> ls
subscriber@broker.hivemq.com 
8 $ switch subscriber@broker.hivemq.com
9 $ subscriber@broker.hivemq.com> dis

 

  • Ein neuer Client subscriber wird auf den Broker broker.hivemq.com verbunden.
  • Der neu verbundene Client führt eine Subscription auf das Topic test/topic1 aus und lässt alle erhaltenen Publishes in die Datei subscriber.log schreiben.
  • Der aktuelle Kontext wird verlassen.
  • Ein neuer Client publisher wird auf denselben Broker verbunden.
  • Der Client publisher führt ein Publish auf das Topic test/topic1 mit der Nachricht „Hello“ aus. Der Client subscriber erhält diese Nachricht und schreibt sie in die Datei subscriber.log.
  • Die Verbindung des Clients publisher wird getrennt.
  • Mit ls werden alle verbundenen Clients ausgegeben.
  • Es wird in den Kontext des Clients subscriber gewechselt.
  • Die Verbindung des Clients subscriber wird getrennt.

Der Shellmodus kann daraufhin mit dem Befehl exit oder via Tastenkombination STRG + C beendet werden. Hierdurch werden alle aktiven Verbindungen der MQTT-Clients geschlossen.

Die Anwendung auf die Probe stellen

Nachdem die grundlegenden Befehle zum Testen einer MQTT-Anwendung mit dem MQTT CLI dargestellt wurden, soll im folgenden Abschnitt gezeigt werden, inwiefern die verschiedenen Optionen eines Befehls genutzt werden können, um gewünschte Clientszenarien zu simulieren. Die Optionen der Befehle können in der Onlinedokumentation nachgelesen oder direkt im CLI erfragt werden:

$ mqtt pub ––help

Die Option ––help zeigt eine kurze Beschreibung des Befehls sowie verfügbare Optionen. Beispielsweise werden für den publish-Befehl relevante Optionen zu Verbindungsaufbau, Nachricht, Sicherheit und Will bis hin zu neuen MQTT-5-Optionen wie Einschränkungen für die Verbindung angezeigt.

In IoT Deployments werden Geräte verbunden, um Nachrichten senden und empfangen zu können. Ein Monitoring des Verbindungsstatus dieser Geräte ist meist sinnvoll und/oder notwendig. Beispielsweise falls ein Sensor ausfällt. Hierfür stellt MQTT die Option des Wills bereit. Bei einem Verbindungsaufbau kann ein Client den Last Will angeben, um dem Broker mitzuteilen, dass er die Last-Will-Nachricht an die anderen Clients weiterleiten soll, falls die Verbindung unerwartet abbrechen sollte:

$ mqtt shell 
$ mqtt> con -i dyingClient -h broker.hivemq.com -Wm "My last will" -Wt wills -Wq 2

Um die Verbindung genauer unter die Lupe nehmen zu können, wird der Shellmodus des CLI gestartet. Daraufhin wird ein neuer Client mit der Will-Nachricht „My last will“ verbunden. Diese Nachricht soll bei Verbindungsabbruch des Clients dyingClient alle Subscriber exakt einmal erreichen. Deswegen wird das Quality-of-Service-Level 2 spezifiziert, wodurch eine exakt einmalige Auslieferung der Will-Nachricht an alle Subscriber sichergestellt wird. Ein Subscriber zur Überprüfung des Wills ist schnell erstellt:

$ dyingClient@broker.hivemq.com> exit
$ mqtt> con -i subscriber -h broker.hivemq.com 
$ subscriber@broker.hivemq.com> sub -t wills -s
$ >

Wir erstellen einen neuen Client subscriber, der das Topic wills subscribt. Die Option -s führt dazu, dass die Konsole blockiert und alle erhaltenen Nachrichten des Topics ausgeben werden. Um einen Verbindungsabbruch von dyingClient zu simulieren, kann in einem zweiten Terminal ein publish-Befehl mit derselben ID durchgeführt werden. Da die ID von verbundenen MQTT-Clients, laut MQTT-Protokollspezifikation eindeutig sein muss, bricht der Broker die Verbindung zum alten Client ab (Client Take-Over):

$ mqtt pub -i dyingClient -h broker.hivemq.com -t otherTopic -m unimportant

Im ersten Terminal wird nun die Will-Nachricht „My last will“ angezeigt. Mit ENTER kann die blockierende Subscription aufgehoben werden.

Fazit

MQTT CLI bietet eine einfache und schnelle Möglichkeit, MQTT-Clients zu erstellen und mit ihnen alle wichtigen MQTT-Operationen auszuführen. Der Shellmodus stellt eine nützliche Option dar, um gleichzeitig mehrere Clients zu verbinden und realitätsnahe Szenarien abzubilden. Somit lassen sich MQTT-Anwendungen und MQTT Broker schnell, unkompliziert und vollumfänglich testen. Die wichtigsten Merkmale der CLI im Kurzüberblick:

  • Volle Unterstützung von MQTT 5.0 und MQTT 3.1.1
  • Debuggingmöglichkeiten aller Kommandos
  • Shellmodus mit Autovervollständigung und Command History
  • Verwaltung mehrerer verbundener Clients
  • Konfigurationsmöglichkeiten für das Standardverhalten
  • Umfangreiches Logging
  • Unterstützung aller gängigen Betriebssysteme

Verwandte Themen:

Geschrieben von
Till Seeberger

Till Seeberger hat 2019 seinen Bachelor in Informatik an der Hochschule Landshut erhalten und ist seit Sommer 2019 beim HiveMQ-Team in der Entwicklung tätig. Nebenbei macht er noch den Master in Informatik an der Hochschule Landshut.

Kommentare

Hinterlasse einen Kommentar

avatar
4000
  Subscribe  
Benachrichtige mich zu: