Hinter dem heutigen Türchen finden Sie wieder einen Satz Kabel, die wir für die nächsten Tage und die komplexer werdenden Aufbauten benötigen werden.

In den letzten Tagen haben wir die meisten unserer Daten mittels UDP übertragen. Dieses Protokoll ist sehr praktisch, da es einerseits einen kleinen Overhead (Daten, die neben den eigentlichen Nutzdaten übermittelt werden) hat und andererseits Broadcast-fähig ist und somit gleich an mehrere Geräte gleichzeitig Daten senden kann. Heute wollen wir aber noch ein zweites Protokoll näher kennenlernen, das im Bereich IoT eine große Rolle spielt. Es geht um das Nachrichtenprotokoll MQTT (Message Queue Telemetry Transport), das speziell für die Kommunikation von Maschine zu Maschine (M2M) entwickelt wurde. Der Grund dafür, dass dieses Protokoll so genial ist, liegt in der Kompaktheit und Einfachheit, mit der Daten wie Steuerdaten, Messdaten oder Texte zwischen Geräten ausgetauscht werden können. Im Vergleich zu HTTP ist der Overhead sehr klein. Deswegen können auch Embeded Devices, also Mikrocontroller wie unser NodeESP, die Daten gut verarbeiten.

Grundlange für die Kommunikation bildet ein sogenannter Broker. Ein Broker ist eine Serveranwendung, die alle Nachrichten verarbeitet. Ein Gerät wie unser NodeESP kann sich mit dem Broker verbinden und Nachrichten veröffentlichen (publishen), also an den Broker senden. Ein anderes Gerät kann dann bestimmte Themen (Topics genannt) abonnieren (subscriben) und bekommt sofort alle neu zu diesem Thema veröffentlichten Nachrichten vom Broker zugestellt.

Der MQTT-Broker stellt die Nachrichten zu
Der MQTT-Broker stellt die Nachrichten zu

Die Topics sind hierarchisch strukturiert, wobei Unterthemen jeweils durch ein / getrennt sind. Zusätzlich gibt es sogenannte Wildcards. Durch + oder # können mehrere Themen gleichzeitig abonniert werden.

Die Topics MyHome/Kitchen/Temperature und MyHome/Bathroom/Temperature können so z. B. durch das Subscriben des Themas MyHome/+/Temperature gleichzeitig empfangen werden. Das Plus ersetzt dabei immer nur eine Topic-Ebene, die Raute ersetzt gleich alle. Mit dem Topic MyHome/# empfangen Sie also gleich alle Nachrichten, die in allen Untertopics von MyHome gepublished werden. Eine Nachricht kann so ziemlich alles sein: vom reinen Text über Messwerte bis zu einfachen 1/0-Befehlen zum Schalten von Licht.

Für heute brauchen Sie keinen Hardwareaufbau, denn wir beginnen mit ein paar grundlegenden Tests. Schauen Sie sich zunächst die Einstellungen auf der Konfigurationsseite an. Bestimmt ist Ihnen schon der Bereich MQTT Settings aufgefallen. Hier finden Sie bereits die richtig vorkonfigurierten Einstellungen. Als Broker-Adresse ist ein speziell für das Adventskalenderprojekt eingerichteter Server angegeben, nämlich broker.fkainka.de**.** Sie können aber auch selbst einen Broker aufsetzen, z. B. auf Ihrem Raspberry Pi.

Ich empfehle dazu die Open-Source-Software Mosquitto. Die Client-ID wurde anhand der MAC-Adresse des Boards generiert. Der Grund dafür ist, dass diese ID serverweit nur von einem einzigen Gerät genutzt werden darf. Da eine MAC-Adresse weltweit eindeutig sein sollte, bietet sie sich hier als ID an. Einen Usernamen und ein Passwort brauchen Sie für den Testbroker nicht.

Sie können die Verbindung testen, indem Sie weiter unten auf den Button Test Connection klicken. Nun sollte die Farbe der Fläche daneben auf Grün wechseln, wenn die Verbindung zum Broker erfolgreich hergestellt wurde. Falls es mal nicht funktioniert, kann es sein, dass der Server down ist und Sie den Broker wechseln müssen. Ein alternativer frei verfügbarer Broker ist z. B. broker. mqttdashboard.com.

Nachdem Sie die prinzipielle Verbindung getestet haben, können Sie nun das Programm des heutigen Tages einstellen. Gehen Sie anschließend auf die Seite

https://www.hivemq.com/demos/websocket-client/?

und klicken Sie dort auf Try the websocket client. Es erscheint eine Oberfläche, mit der Sie sich auf einem MQTT-Broker mit Websocket-Unterstützung anmelden können. Unter Host müssen Sie einen Broker, also hier broker.fkainka.de, eintragen und anschließend mit connect eine Verbindung herstellen. Es öffnet sich die Oberfläche aus der Abbildung. Sie können nun mit Klick auf Add New Topic Subscription Ihr eigenes, persönliches Topic abonnieren. Dieses setzt sich aus dem Begriff NodeESP und der Client-ID zusammen. Bei meinem Board war das zum Beispiel:

NodeESP/240AC48178E4/

Sämtliche MQTT-Kommunikation vom und zum Board beginnt mit diesem Topic. Ich werde den Client-IDTeil in Zukunft mit [PID] für „persönliche ID“ abkürzen. Sie müssen diesen Teil durch Ihre Client-ID ersetzen. Im ersten Versuch können Sie alle Kommunikation vom Board mit dem Topic

NodeESP/[PID]/#

empfangen. Wenn Sie das Board resetten, sehen Sie nach kurzer Zeit eine Meldung, die Ihnen sagt, dass sich das Board mit dem Broker verbunden hat. Diese Meldung wurde in das Topic NodeESP/[PID]/status geschrieben und durch das Subscriben mit # ebenfalls empfangen. Nun können Sie eine erste Nachricht an das Board übermitteln. Dazu geben Sie im Publish-Bereich im Feld Topic Ihr persönliches Topic plus das Subtopic testtopic ein, also in meinem Fall:

NodeESP/[PID]/testtopic

In dem Feld Message können Sie jetzt eine beliebige Nachricht eingeben. Das Feld kann sogar leer bleiben. Klicken Sie anschließend auf Publish, und nur wenige Augenblicke später haben Sie zwei weitere Nachrichten im Messages-Bereich. Die eine Nachricht ist ein Begrüßungstext und wurde im Topic NodeESP/[PID]/testtopic/out veröffentlicht. Die andere Nachricht enthält ebenfalls den Begrüßungstext, allerdings als JSON-String inklusive Kommando-Key, und wurde im Topic NodeESP/[PID]/out veröffentlicht.

Diese beiden Nachrichten kommen dadurch zustande, dass das Board die Topics in das bekannte Kommandoformat übersetzt und dann auswertet. Die Antworten erscheinen in einem Topic, das sich aus dem Kommando und out zusammensetzt, hier also …/testtopic/out, und gleichzeitig im Kanal NodeESP/ [PID]/out.

Äquivalent zum out-Topic gibt es ein in-Topic, in das Sie direkt Kommandos im JSON-Format publishen können. Wenn Sie zum Beispiel in das Topic NodeESP/[PID]/in den JSON-String {“cmd”:“testtopic”} schreiben, käme es zu den gleichen Antworten wie beim ersten Versuch. Sie können also ein Kommando entweder über ein entsprechendes Topic oder über den in-Channel als JSON-Objekt schicken. Wundern Sie sich nicht darüber, dass einige bekannte Kommandos wie z. B. get_wifi_status etc. nicht funktionieren. Das liegt daran, dass diese Kommandos durchaus sensible Daten enthalten können und deswegen nicht über einen öffentlichen Broker gesendet werden sollten.

Die Verbindung zum Board über MQTT steht also. Morgen schauen wir uns genauer an, was wir damit machen können.