“MQ Telemetry Transport” MQTT ist ein Protokoll zum Übermitteln/ Empfangen von z.B. Sensordaten oder Aktordaten.
Leichtgewichtig: kleines Datenvolumen, Protokoll benötigt wenige IP Telegramme
Standard: Ein Standard des Internet of Things IoT
Das MQTT Protokoll definiert zwei Netzwerk-Einheiten: Ein “Message Broker” und Clients.
Die Kommunikation findet zwischen einem Client und dem Broker statt. Es gibt keine Kommunikation direkt von Client zu Client.
publish: Daten werden versendet.
subscribe: Interessenten (Clients) melden sich beim Broker für Daten an und bekommen Änderungen zugesendet.
MQTT übermittelt Daten mit topic und payload.
‘topic’ sind hierarchische Bezeichner wie z.B.
halle3/level2/grid4-3/sensor/temperatur
haus/wohnzimmer/stehleuchte
Topic können bis zu 64k lang sein.
‘payload’ sind die Nutzdaten. Hier kann beliebig Information gesendet werden bis 256MB Länge.
Beispiele für Nutzdaten:
23.4 # Temperatur
ON # Schalter, ON, OFF
# json data
{ "temp": 22.4,
"humidity": 44.2,
"cnt": 3965,
"comment": "maintenance needed" }
...binär... # Binärdaten. Nur bedingt empfehlenswert.
Programme können eine Message beim Broker hinterlegen, die dann bei Verbindungsabbruch vom Broker verteilt wird.
Qos ist ‘quality of service’:
0: at most once
1: at least once
2: exactly once
Retained-Flag ist
“A retained message is a normal MQTT message with the retained flag set to true. The broker stores the last retained message and the corresponding QoS for that topic. Each client that subscribes to a topic pattern that matches the topic of the retained message receives the retained message immediately after they subscribe. The broker stores only one retained message per topic.” 1
Beim Empfangen ‘subscribe’ können Topics mit Wildcards angebenen werden
‘#’: ab diesem Zeichen jedes passende Topic. Beispiel ‘haus/wohnzimmer/#’ passt zu allen Topic die mit ‘haus/wohnzimmer/’ anfangen.
‘+’: ein beliebiger Level. Beispiel ‘haus/+/temperatur’ passt zu ‘haus/wohnzimmer/temperatur’ und ‘haus/kueche/temperatur’.
Die nach solchen Subscribe empfangenen Daten sind immer mit voll qualifizierten Topic ausgestattet.
Topics die mit $ anfangen sind für den Broker reserviert.
Alle Topic sind für alle Clients eines Brokers sichtbar.
Es gibt keine Abschottung innerhalb eines Brokers. Das macht das System einfach im Aufbau, aber auch anfällig für Fehler oder Störungen.
System besteht aus einem MQTT Broker, und ‘client’ Programmen.
Die client können dedizierte Devices sein (Sensoren mit Netzwerkanbindung, geschaltete Netzsteckdosen) oder Programme die auf Computern gestartet sind.
Das Netz ist ein isoliertes Netz 192.168.1.0/24 . Es gibt voraussichtlich keine Internetanbindung 2.
Acccess point SSID MQTTTUTORIAL, key …
wikipedia: The MQTT broker is a piece of software running on a computer (running on-premises or in the cloud), and could be self-built or hosted by a third party. It is available in both open source and proprietary implementations.
The broker acts as a post office. MQTT clients don’t use a direct connection address of the intended recipient, but use the subject line called “Topic”. Anyone who subscribes receives a copy of all messages for that topic. Multiple clients can subscribe to a topic from a single broker (one to many capability), and a single client can register subscriptions to topics with multiple brokers (many to one).
Für Raspberry ist “eclipse mosquitto” üblich.
![]() |
auf dem Rechner ‘mqttserver’ 192.168.1.200 ist mosquitto broker installiert. |
sudo apt install mosquitto
post-install: sudo vi /etc/mosquitto/mosquitto.conf eintragen:
listener 1883
allow_anonymous true
Es gibt eine Anzahl von Werkzeugen zum Beobachten von MQTT Messages. Diese Werkzeuge sind MQTT Teilnehmer ‘client’ wie jedes andere Programm auch.
cd ~/mqtt_kurs/src/C_920
java -jar org.eclipse.paho.mqtt.utility-1.0.0.jar
Beispiel paho command line tool:
![]() |
das Topic ‘#’ ist ein Wildcard für ‘alle Topics’ und sollte normalerweise vermieden werden. |
paho_c_sub '#' --host 192.168.1.200
Mosquitto bringt ebenfalls command line Tools mit, die aber auf den Workshop Rechnern nicht installiert sind.
Für python auf Linux ist die eclipse paho Bibliothek interessant.
https://www.eclipse.org/paho/clients/python/docs/
![]() |
Die paho-Bibliothek für python ist auf den workshop-Rechnern installiert. |
sudo python3 -m pip install paho-mqtt
Es gibt Bibliotheken für ‘die üblichen’ Programmiersprachen bei eclipse-paho.
Siehe auch github.com/mqtt/mqtt.org/wiki/libraries
import gpiozero
GPIO_BUTTON = 12
# default Button, pull_up=True
button = gpiozero.Button(GPIO_BUTTON)
if button.is_pressed:
print("pressed")
else:
print("not pressed")
import time
import gpiozero
GPIO_LED = 13
# default LED active_high=True
led = gpiozero.LED( GPIO_LED)
while True:
led.high()
time.sleep(0.5)
led.low()
time.sleep(0.5)
Im workshop wird die eclipse paho bibliothek verwendet.
HOST = "192.168.1.200"
PORT = 1883
mqttc = mqtt.Client()
mqttc.connect(HOST, PORT, 60)
mqttc.loop_start() # non blocking loop
# mqttc.loop_forever() # blocking loop
# mqttc.loop(timeout=0.1) # running loop in code
.. place code here
mqttc.loop_stop()
mqttc.disconnect()
python bibliothek ‘paho’ Installation sudo pip3 install paho
HOST = "192.168.1.200"
PORT = 1883
mqttc = mqtt.Client()
mqttc.connect(HOST, PORT, 60)
mqttc.loop_start()
# signals are ON, OFF
mqttc.publish("tutorial/A/button", "ON")
mqttc.loop_stop()
mqttc.disconnect()
HOST = "192.168.1.200"
PORT = 1883
def on_connect(client, userdata, flags, rc):
"""Subscribing in on_connect() means that if we lose the connection and
reconnect then subscriptions will be renewed.
"""
client.subscribe(
[
("tutorial/A/LED", 0),
]
)
def on_message(client, userdata, msg):
"""The callback for when a PUBLISH message is received from the server."""
print(msg.topic,str(msg.payload), "retain", msg.retain, "qos", msg.qos, str(userdata) )
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, PORT, 60)
try:
client.loop_forever()
except KeyboardInterrupt:
pass
client.disconnect()
client.loop_stop()
Die subscribd messages kommen zu unterschiedlichen Zeiten an. Um auf der Basis verschiedener Sensoren Entscheidungen zu treffen muß ein lokaler cache erstellt werden.
Es bietet sich an die Daten in einem dictionary zu speichern.
cache = dict()
cache[msg.topic] = str(msg.payload)
Damit stehen die Daten (während das Programm läuft) zur Verfügung und können ausgewertet werden.
Wireshark is a tool to monitor ethernet packages
sudo apt-get install wireshark
start as superuser sudo wireshark
Zwei Beispiele für qos 0 und 2 zeigen die unterschiedliche Anzahl von Messages bei einem Publish.
QOS 0:
QOS 2:
TODO
Es gibt einige öffentlich verfügbare MQTT Lösungen ‘cloud’.
Zwei Beispiele:
mosquitto test server test.mosquitto.org
adafruit IO https://io.adafruit.com Topic haben feste Struktur:
openhab
home assistant (core) python tool, über Weboberfläche benutzbar.
Es gibt einige Geräte, die direkt mit MQTT angesteuert werden können. Beispiele sind die ESP8266 basierten Steckdosen mit “tasmota”
Die meisten Steckdosen muß man öffnen und ‘flashen’.
![]() |
Die beschriebenen Prozeduren sind teilweise gefährlich und die elektrische Sicherheit ist dabei im Allgemeinen nicht gewährleistet. |
Es gibt wenige Geräte, die von Haus aus “tasmota” enthalten.
Im workshop stehen drei mit “tasmota” ausgestattete Steckdosen zur Verfügung:
topic: cmnd/delock/1807/POWER
ip: 192.168.1.101
topic: cmnd/delock/2008/POWER
ip: 192.168.1.102
topic: cmnd/delock/2508/POWER
ip: 192.168.1.100
Diese Socket sind mit tasmota ausgestattet und arbeiten mit einem lokalen broker.
Die Firma vertreibt verscheidene Installations- und Consumerprodukte. Diese sind u.A. auch mit MQTT zu benutzen und ausführlich dokumentiert.
In C_020/pt.py ist ein Performance-Test enthalten.
Das Tool benutzt python multiprocessing um mehrere Clients zu öffnen. Jeder Client meldet sich bei 4 Topics ‘pi/0’, ‘pi/1’, ‘pi/2’, ‘pi/3’ an. Dann sendet der Client für jeden Topic die Zahl ‘0’ als String codiert ab. Wenn diese Topics dann empfangen werden, wird die Zahl erhöht und wieder geschickt.
Insgesamt werden 1.000.000 Sende-Empfangs-Operationen bei qos 0 ausgeführt. Das dauert auf einem pi4 ca 120 sec.
Mit pypy3 ca 45 sec.
https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages/↩
Die Ausstattung des Workshop mit Internetanschluß konnte vorab nicht geklärt werden. Einige benötigte Dokumentationen liegen als lokale Kopie bereit.↩
pypy ist ein python interpreter mit Just In Time Compiler ‘JIT’ support. Programme laufen schneller, aber nicht alle Bibliotheken sind lauffähig.
pypy ist bereits in raspbian buster enthalten
pip muß nachinstalliert werden:
wget https://bootstrap.pypa.io/get-pip.py
pypy get-pip.py
sudo pypy -m pip install paho-mqtt
↩