MQTT

Viele IoT Geräte bauen heute auf Cloud-Dienste auf, von denen Sie weder wissen, wer sie betreibt, wer die Daten noch bekommt und wie lange sie Bestand haben. Das gilt insbesondere wenn der Absatz der Geräte abnimmt und die Kosten unverändert bleiben. Sehr bald muss ein Anbieter sich dann umschauen und neue Geldquellen anbohren oder den Betrieb einstellen. Da ist mir eine "eigene Cloud" lieber und um das Rad nicht neu zu erfinden, gibt es mit MQTT eine Definition, wie Geräte miteinander kommunizieren können. Dann muss ich das Rad nicht neu erfinden.

MQTT ist übrigens keine Abkürzung für "Message Queue Telemetry Transport" und kann maximal auf "MQ Telemetry Transport" zurückgeführt werden, wobei MQ ein Produkt von IBM (https://www-03.ibm.com/software/products/de/ibm-mq). Die Anfänge von MQTT sind im Jahr 1999 zu suchen, wo IBM-Techniker zur Überwachung von Öl-Pipelines über Satelliten ein bandbreitenoptimiertes Protokoll mit grundlegenden QoS-Strategien entworfen haben.

Grundprinzip

MQTT ist erst mal nur ein Protokoll ohne über die Transportwege und die Inhalte etwas zu sagen.

MQTT  ist ein offenes Nachrichtenprotokoll für Machine-to-Machine-Kommunikation (M2M), das die Übertragung von Telemetrie-Daten in Form von Nachrichten zwischen Geräten ermöglicht, trotz hoher Verzögerungen oder beschränkten Netzwerken.[1] Entsprechende Geräte reichen von Sensoren und Aktoren, Mobiltelefonen, Eingebetteten Systemen in Fahrzeugen oder Laptops bis zu voll entwickelten Rechnern. Das Protokoll wurde von Andy Stanford-Clark von IBM und Arlen Nipper von Cirrus Link Solutions entwickelt.
Quelle: https://de.wikipedia.org/wiki/MQTT

In der Regel wird aber schon TCP/IP als Transport genutzt und damit stehen alle physikalischen Schichten (Ethernet, WiFi, LTE etc.) offen. Es sind aber auch ZigBee und andere Übertragungswege möglich. Das System besteht dabei aus drei Komponenten:

  • Sensoren (Publisher)
    Sensoren sind jede Art von Geräten, die Daten erfassen und irgendwo hin melden. Sensoren sind in der Regel nicht 24h aktiv und erreichbar. Sie sind entweder batteriegestützt eh die meiste Zeit im Schlafmode und wachen nur kurz auf um Daten zu senden oder Sie "verstecken" sich hinter NAT-Routern und können die Verbindung nur von ihrer Seite her aufbauen. Daher ist ein "Clearingpoint" erforderlich, an den Sie ihre Daten senden können und von dem andere Dienste die Daten auch wieder abrufen
  • Broker
    Der Broker ist ein Service, der für alle möglichen Sensoren 24h erreichbar ist und deren Meldungen annimmt. Zudem antwortet er auch auf Anfragen von anderen Diensten, die die Werte wieder auslesen wollen
  • Konsument (Subscriber)
    Die von Sensoren an den Broker gemeldeten Daten können von anderen Diensten wieder abgerufen werden

Die Übertragung erfolgt als TCP-Stream über die Standardports 1883/TCP oder 8883/TLS

Kaum jemand schreibt das aber komplett selbst, sondern es gibt verschiedene Libraries, auf die man aufsetzen kann:

What is MQTT? What you need to know
https://www.youtube.com/watch?v=QSwR-JMmNOo

What is MQTT? What you need to know (Paessler)
https://www.youtube.com/watch?v=QSwR-JMmNOo

MQTT Broker

Die Spinne im Netz, an die sich alle Publisher wenden ist ein Dienst, der per TCP auf den Port 1883 (oder 8883/TLS) erreichbar sind. Wenn alle Nutzer mit DNS umgehen können, kann die IP-Adresse auch dynamisch sein. für den internen Gebrauch ist aber wohl eine statische direkt erreichbare IP-Adressen einfacher. Als Broker gibt es gleich wieder mehrere Lösungen und Betriebsarten.

MQTT im Eigenbetrieb

Sie können einen Broker natürlich einfach selbst lokal oder ihrer eigenen Cloud-Instanz installieren und betreiben. Es gibt eine ganze menge an Open Source-Lösungen

Einige der Systeme können Sie sogar auf dem ein oder anderen NAS-Devices oder RaspberryPi und Co installieren

Installing Mosquitto (MQTT) broker on Synology NAS
https://www.youtube.com/watch?v=b3A1RJdDf-w

Mosquitto für Windows

Auch wenn es den Eindruck hat, dass die ganzen IoT Geschickten eher bei Unix zu finden sind, so hat Open Source auch den Vorteil, dass der Code für verschiedene Ziele kompiliert werden kann. Mosquitto kann also sehr einfach auch unter Windows direkt installiert werden.

  • Download Mosquitto
    Den gibt es bei https://mosquitto.org/download/. Heute wird vermutlich jeder einfach die 64bit Version nutzen.
  • Installation Mosquitto
    Das Setup ist einfach das Durchklicken des Installers. Da gibt es nichts zu beschreiben. Allerdings können Sie Mosquitto noch nicht starten.

    Hier müssen wir also erst noch die entsprechenden DLLs besorgen
  • Beschaffen der OpenSSL Libraries
    MQTT aus Port 8883 nutzt SSL und Mosquitto baut hier auf OpenSSL. Die DLLs sind aber nicht im Installationspaket enthalten. Also müssen sie die DLLs besorgen. Am einfachsten über den Download von Win64 OpenSSL v1.1.0i Light von http://slproweb.com/products/Win32OpenSSL.html. Nach der Installation finden sich die Dateien im Zielverzeichnis

    Die beiden markierten Dateien kopieren wir in das Mosquitto Installationsverzeichnis. Danach könnten wir OpenSSL sogar wieder deinstallieren
  • Mosquitto und Firewall
    Wenn Sie nun Mosquitto einfach als Anwender starten, dann die Windows Firewall den Zugriff verhindern.

    Das umgehen Sie, indem Sie z.B. eine Firewall Regel addieren, um eingehend 1883/TCP und 8883/TCP zuzulassen.
  • Funktion testen
    Die Funktion testen Sie am besten, indem Sie einen Subscriber und Publisher nutzen. Am Anfang haben Sie meist noch keine Endgeräte am Start. Das Mosquitto-Paket enthält aber die beiden Programme Mosquitto_pub.exe und mosquitto_sub.exe, auf die ich später noch eingehe
  • Mosquitto interaktiv starten
    Nachdem Mosquitto installiert ist, würde ich das Programm erst einmal in einer CMD-Box interaktiv starten. So sehen Sie sofort etwaige Fehlermeldungen und auch die Aktivitäten auf dem Broker. Die Einrichtung von Mosqitto als Dienst kommt dann später.
REM  Start des Mosquitto Servers mit "Verbose"-Ausgabe
mosquitto.exe -v

Wenn Sie nicht schon vorher die Firewall geöffnet haben, wird Windows dann hier eine entsprechende Meldung anzeigen.

Der Service ist per Default auf Port 1883 erreichbar. Im Mosquitto-Verzeichnis gibt es noch die Konfigurationsdatei "mosquitto.conf", auf die ich hier aber im Rahmen der MSXFAQ nicht weiter eingehe. Nur eine Ergänzung sollten Sie machen, wenn Sie auch WebSockts verwenden wollen:

listener 9001
protocol websockets

Dann können auch WebSockets für Abfragen und Ergänzungen genutzt werden.

MQTT Broker auf NAS

Nicht jeder will dauerhaft einen Windows Server für die wenigen MQTT-Messages laufen lassen oder Raspi betreuen. Wenn Sie in ihrem LAN aber z.B. ein NAS-System betreiben (Synology, QNAP u.a.), dann prüfen Sie doch mal deren Tauglichkeit. Die größeren Systeme erlauben den Betrieb von Docker-Containern oder kompletten VMs. Ob das unterm Strich dann besser ist also ein Raspi sei dahin gestellt. Aber da die meisten NAS-Systeme ehr auf UNIX basieren, lassen sich vermutlich auch die nativen Broker einfach mal installieren.

Für ein Synology-NAS gibt es auf https://synocommunity.com/  diverse Pakete. Sie müssen im Synology Package Center dazu nur den Vertrauenslevel etwas erweitern und die URL http://packages.synocommunity.com/  als zusätzliche Quelle addieren. Das Package Center bekommt dann eine neue Karteikarte "Community", unter der dann viele andere Pakete. Eines davon ist Mosquitto.

Nach der Installation müssen Sie nur noch ein "Run" starten. Es gibt aber keine GUI zur Konfiguration. Die Einstellungen sind per SSh in der Datei /usr/local/mosquitto/var/mosquitto.conf vorzunehmen. Per Default lauscht diese Installation auf 1883/TCP ohne Verschlüsselung und ohne Authentifizierung. Für einen rein Test ist das OK. Aber selbst wenn der Server nur intern erreichbar wäre, könen über MQTT ja auch Aktionen ausgelöst werden. Hier ist es also ratsam über die Konfiguration für mehr Sicherheit zu sorgen.

Installing Mosquitto (MQTT) broker on Synology NAS
https://www.youtube.com/watch?v=b3A1RJdDf-w

Leider gibt es keine GUI zur Konfiguration. Sie müssen daher auf der Synology erst den SSH-Zugang öffnen und sich darauf verbinden. Im Verzeichnis: "/var/packages/mosquitto/scripts" liegen die Skripte. Unter "/usr/local/mosquitto/var/mosquitto.conf" finden Sie dann auch die Konfigurationsdatei.

Bei mir Luft der MQTT-Broker auf einem kleinen DS216j einfach mit und hat noch keine Aussetzer gehabt.

MQTT per Kommandozeile

Ehe ich mich nun an Sensoren mache, die vielleicht auf Basis des ESP8266, ESP32 oder anderen Geräten entwickelt werde, teste ich die Funktion direkt auf dem Computer mit den Tools von Mosquitto, die einen Subscriber und einen Publisher darstellen. Ich starte dazu in drei unterschiedlichen CMD-Boxen die folgenden Kommandozeilen:

REM Start eines Subscribers, der auf den Kanal "msxfaq/test" lauscht und die gemeldeten Daten ausgibt 
mosquitto_sub.exe -h 127.0.0.1 -v -t msxfaq/test

Wenn nun noch nichts kommt, dann nutze ich ein zweites CMD-Fenster, um eine Meldung zu generieren.

REM Senden einer Message
mosquitto_pub.exe -h 127.0.0.1 -t msxfaq/test -m "Hallo"

Entsprechend sehen Sie dann in den Fenstern die Aktion des Publishers, des Subscribers und die Verbose-Ausgabe von Mosquitto.

Die Information, die der Publisher an den Mosquitto-Server sendet, wird vom Subscriber gleich wieder angezeigt. Die Funktion ist damit schon mal gegeben.

Wenn ich alle Meldungen sehen will, dann ist "#" der richtige Wildcard

REM Start eines Subscribers, der auf den Kanal "msxfaq/test" lauscht und die gemeldeten Daten ausgibt 
mosquitto_sub.exe -h 127.0.0.1 -v -t #

Mosquitto als Dienst

Auf Dauer wollen Sie Mosquitto nicht mit einem angemeldeten Benutzer laufen lassen. Da bietet sich die Installation als Dienst an. Bei Version 1.4 konnte schon beim Setup auch die Installation als Dienst ausgewählt werden. Ab Version 1.5 können Sie Mosquitto aber auch noch als Dienst installieren. Über folgende Kommandozeile können Sie Mosquitto  als Dienst registrieren und wieder entfernen:

REM Installieren als Dienst
C:\Program Files\mosquitto\mosquitto install

REM Dienst starten
net start mosquitto 

REM Dienst Stoppen
net stop mosquitto

REM Dienst wieder entfernen
C:\Program Files\mosquitto\mosquitto uninstall

Achten Sie später bei einem Update, darauf, dass Sie den Dienst vorher beenden, damit die Dateien nicht gesperrt sind und so nicht überschreiben werden können.

Mosquitto interne Daten

Mosquitto generiert auch selbst einige Daten, die er standesgemäß per MQTT bereitstellt. Sie können also über einen Subscribe auf diese Werte sehr schnell schon Daten erhalten.

$SYS/broker/uptime
$SYS/broker/load/messages/received/1min
$SYS/broker/load/messages/sent/1min
$SYS/broker/load/publish/received/1min
$SYS/broker/load/publish/sent/1min
$SYS/broker/load/bytes/received/1min
$SYS/broker/load/bytes/sent/1min
$SYS/broker/load/sockets/1min
$SYS/broker/load/connections/1min
$SYS/broker/load/messages/received/5min
$SYS/broker/load/messages/sent/5min
$SYS/broker/load/bytes/received/5min
$SYS/broker/load/bytes/sent/5min
$SYS/broker/load/messages/received/15min
$SYS/broker/load/messages/sent/15min
$SYS/broker/load/bytes/received/15min
$SYS/broker/load/bytes/sent/15min
$SYS/broker/messages/received
$SYS/broker/messages/sent
$SYS/broker/bytes/received
$SYS/broker/bytes/sent

Der MQTT.fx-Client hat sogar einen eigenen Reiter dafür, der genau diese Daten direkt anzeigt. Sie müssen sich nur mit dem Mosquitto-Server verbinden und dann auf der Seite "Broker Status" einen Subscribe machen.

Alternativ können auch die Werte von Hive MQ erhalten.

MQTT Broker in der Cloud

Natürlich gibt es auch jede Menge Anbieter, die basierend auf der ein oder anderen OpenSource oder Eigenentwicklungen einen Cloud-Services bereit stellen. Fast alles haben auch eine "Free-Version" für geringe Datenmenge, die für erste Gehversuche sicher ausreicht. Aber letztlich müssen auch Cloud-Anbieter irgendwie ihre Kosten wieder verdienen und wenn dies nicht klappt, dann können Sie nur die Daten verkaufen, die Leistung weiter einschränken oder wieder verschwinden. Siehe auch Cloud - Abruptes Ende. Man muss als schon genau überlegen, bei welchem Cloud-Service Sie ihre IoT-Daten als Relay hinterlegen.

MQTT Test-Systeme

Die Firma Hive betreibt einen öffentlichen MQTT-Server, zu dem jeder seine Daten senden und beliebige andere Daten empfangen kann. Das ganze erfolgt natürlich ohne eine Betriebsbereitschaft und auch die Gültigkeit der Daten ist natürlich nicht gesichert. Zumal man per Subscribe "*" quasi alle Kanäle bekommt und damit die Daten auch absichtlich "stören" kann. Das ist wirklich nur ein "Test-System". Aber was sollte jemanden hindern eine Information per MQTT durchaus "anonym" lesbar zu machen. Diese Vorsichtsmaßnahmen gelten für alle "Test-Broker" aber so können Sie ohne Kosten und Mühen erste Gehversuche mit MQTT Publisher oder Subscriber machen:

Broker Server TCP Ports TLS Ports Websocket

Mosquitto

iot.eclipse.org

1883

8883

n/a

HiveMQ

broker.hivemq.com
broker.mqttdashboard.com

1883

1883

8000

Mosquitto

test.mosquitto.org

1883

8883 / 8884

8080 / 8081

mosca

test.mosca.io

1883

1883

80

Es gibt sicher noch mehr Server aber für den Anfang ist das schon mal ausreichend.

MQTT Clients

Auf dieser Seite habe ich auch die Kommandozeilen von Mosquitto beschrieben. Das sind natürlich einfache Werkzeuge und für den praktischen Einsatz eher nicht passend. Sie müssen schon schauen, auf welcher Plattform Sie MQTT nutzen sollen um als Subscriber, die Werte von einem Broker abfragen und ggfls. darauf reagieren oder diese grafisch aufbereiten:

Client

Beispiele

Browser

Windows/Linux/MAC

IOS

Android

Für Windows Anwender ist MQTTFC aber insbesondere auch MQTT-Explorer sehr einfach nutzbare Systeme. Gerade der MQTT-Explorer liefert die Topcs als Baumdiagramm und erlaubt sogar erste Grafiken. Hier am Beispiel eines Shelly PlugS, der seine Daten an einen lokalen MQTT-Server sendet

Allerdings kommt MQTT-Explorer wohl schnell an seine Grenzen, wenn Sie mit "#" alle Topics einen MQTT-Servers abbonieren.

MQTT mit PowerShell

Als Windows Admin und Consultant stellt sich mir natürlich immer die Frage, wie ich MQTT auch aus der PowerShell nutzen kann. Ich kann es mir schon interessant vorstellen gewisse Kennzahlen, die z.B. als Windows Performance Counter vorliegen, per MQTT-Publish an einen Broker weiter zu geben. Umgekehrt könnte es auch interessante Anwendungsfälle geben, MQTT-Werte per Subscribe abzufragen und z.B. in PRTG weiter zu verarbeiten.

Es ist in PowerShell selbst aber schon knifflig das MQTT-Protokoll auf Basis der System.net.sockets.tcpclient-Klasse selbst zu programmieren. MQTT ist zwar "Lightweight" aber durch die Verwendung von Bits und Bytes anstatt SOAP-URL und REST-APIs und JSON doch etwas schwerer zu lesen.

Da aber z.B. der Subscriber die Verbindung aufrecht erhalten muss, damit er weitere Updates bekommt, hätte ich intensiver mit PS und Callback-Funktion arbeiten müssen. Daher habe ich mich doch lieber nach Libraries umgeschaut, die z.B. auf :NET basieren und per PowerShell anzusprechen sind. Ich bin fündig geworden und die Ergebnisse finden Sie auf einer eigenen Seite

MQTT und Websockets

Der Port 1883 ist für MQTT der Standardport aber oft gibt es zwischen Client und Serverauch Proxy-Server. Das Protokoll "HTTP" ist da doch deutlich einfacher zu handhaben. MQTT kann auch WebSockets nutzen. Wenn ich z.B. Mosquitto nutze, dann aktivieren folgende Zeilen in der mosquitto.conf neben dem Port 1883 auch noch Websockets.

port 1883
protocol mqtt

listener 9001
protocol websockets

Ich muss Mosquitto dann unter Angabe der Konfigurationsdatei starten und sehe mit "-v" auch die Konfiguration

Auf meiner Synology habe ich auch Mosquitto über das Package Center aus dem Community-Zweig installiert. Wenn Sie mit "VI" als Editor nicht zurecht kommen, dann installieren Sie das Paket "SyncCli FileTools", damit Sie mit NANO arbeiten können. Aktiveiren Sie noch den SSH-Zugang

Danach können Sie sich per SSH mit dem NAW verbinden und mit "SUDO NANO /var/packages/mosquitto/var/mosquitto.conf" die Konfiguration anpassen.

# /var/packages/mosquitto/var/mosquitto.conf
listener 1883
protocol mqtt 

listener 9001 
protocol websockets

Leider kann ich mit den beiden Hilfsprogrammen Mosquitto_sub.exe und mosquitto_pub.exe nicht per WebSockets senden. Es gibt aber einige Browser-Apps, die diese Funktion unterstützen, z.B.

Ich kann die Verbindung per Wireshark mitschneiden und sie sehne direkt die HTTP-Verbindung, die aber sehr schnell dann zu einem Binär-Datenstrom wechselt.

Ich hatte etwas erhofft, dass WebSockets mehr HTTP machen und ich einfach per PowerShell z.B. einen "Publish" absetzen kann.

MQTT over UDP

Nicht immer kann ein Sensor eine TCP-Verbindung aufrecht erhalten. Gerade wenn Energie kostbar ist (Solar, Batterie etc) und speziell WLAN viel Energie frisst ist jedes Paket teuer. Dafür eignet sich dann dann UDP. Ein Senser kann aufwachen, seine Pakete senden und wieder einschlafen. Es gibt mehrere solcher Ansäze aber alle sind nicht "Native MQTT". MQTT funktioniert über TCP aber nicht über UDP. Dennoch gibt es Libraries, die UDP nutzen können. Dies ist aber keine MQTT-Spezifikation aber wird auch als "MQTT-SN", kurz für "MQTT für Sensor Networks" beschrieben.

Die Sensoren bzw Clients senden ihre Pakete per UDP-Broadcast ins lokale Subnetz, in dem dann auch ein MQTT-SN-Gateway steht, diese UDP-Pakete empfängt und per klassischen MQTT an einen Broker weiter gibt. Der Sensor kommt daher mit einem minimalen Stack aus und muss nicht einmal einen MQTT-Server, DNS-Server o.ä. untertützen, sondern seine z.B. aus der per DHCP erhaltenen IP-Adresse die Broadcastadresse ermitteln und das Paket senden.

MQTT-SN Specification -pdf
http://mqtt.org/new/wp-content/uploads/2009/06/MQTT-SN_spec_v1.2.pdf 

MQTT mit ESP8266, Arduino, RasPi und Co

Natürlich ist das schlanke MQTT-Protokoll ideal für das Internet der Dinge (IoT) nutzbar und so verwundert es nicht, dass viele Seiten die Integration von MQTT in die gängigen Plattformen integrieren. Dazu zählen insbesondere die Arduino Plattform und natürlich der ESP8266

Es gibt aber durchaus auch kommerzielle Firmen, die fertige Sensoren verkaufen oder Sensoren, die mit einer passenden Firmware auch zu einem MQTT-Sensor umgebaut werden können

Öffentlichen MQTT-Server und Daten

Vielleicht muss man auch nicht alle Werte immer selbst ermitteln. Ich kann es mir durchaus vorstellen, dass diverse MQTT-Broker im Internet bestehen, die kostenfrei oder per Subscription bestimmte Daten bereit stellen. Da gibt es schon ganz viele Informationen, die z.B. Banken, Wetterdienste, Verkehrsbetrieb u.a. per MQTT bereitstellen könnten

  • Wetterdaten
  • Aktienkurse
  • Zugabfahren, Ankunft, Verspätungen
  • Verkehrsdichte
  • Preise von Waren (z.B. Treibstoff)
  • Strompreis zur Steuerung von Wärmepumpen

Es muss ja nicht immer eine REST-API sein, die per HTTP-Polling abgerufen wird. MQTT überzeugt durch das Subscriber-Modell, dass neue Daten sehr schnell an die Subscriber aktiv ausgeliefert werden können.

  • Wie können Flugdaten von MQTT Servern empfangen und in openHAB angezeigt werden?
    http://blog.wenzlaff.de/?p=7289
    tcp://test.mosquitto.org:1883/Anzahl/Flugzeuge/Hannover:state:default]"}

Weitere Links