mosquitto, mosquitto_pub und mosquitto_sub sind die Werkzeuge des MQTT-Brokers Eclipse Mosquitto. MQTT ist ein leichtes Publish/Subscribe-Protokoll für Geräte mit wenig Bandbreite und Energie – der Standard in IoT und Gebäudeautomation.

Broker starten und prüfen

mosquitto -c /etc/mosquitto/mosquitto.conf -v
systemctl status mosquitto
systemctl enable --now mosquitto

# Läuft der Port?
ss -lntp | grep 1883
ss -lntp | grep 8883        # TLS

Publizieren und abonnieren

# Zuhören
mosquitto_sub -h localhost -t 'haus/+/temperatur' -v
mosquitto_sub -h localhost -t 'haus/#' -v -q 1

# Nachricht senden
mosquitto_pub -h localhost -t 'haus/wohnzimmer/temperatur' -m '21.5'
mosquitto_pub -h localhost -t 'haus/wohnzimmer/temperatur' -m '21.5' -q 1 -r

# Mit Benutzer und Passwort
mosquitto_pub -h broker.example.org -u sensor -P geheim \
  -t 'fabrik/presse/druck' -m '4.2' -q 2

# TLS
mosquitto_sub -h broker.example.org -p 8883 \
  --cafile /etc/ssl/certs/ca.pem -t 'haus/#'

Das Topic-Modell ist hierarchisch: + passt auf genau eine Ebene, # auf alle folgenden. haus/+/temperatur erhält also haus/wohnzimmer/temperatur, aber nicht haus/og/schlafzimmer/temperatur.

Quality of Service und letzte Nachricht

  • QoS 0: höchstens einmal – schnell, Verlust möglich.
  • QoS 1: mindestens einmal – Bestätigung, dafür Duplikate möglich.
  • QoS 2: genau einmal – aufwendiger Handshake, langsamer.
  • Retained Message (-r): Der Broker speichert die letzte Nachricht eines Topics und liefert sie jedem neuen Abonnenten sofort aus. Damit erhält ein neu gestartetes Gerät den aktuellen Zustand, ohne zu warten.
  • Last Will: Beim Verbinden kann ein Gerät festlegen, welche Nachricht der Broker verschickt, wenn die Verbindung unerwartet abbricht – die übliche Art, „Gerät offline“ zu melden.
# Letzte Nachricht löschen
mosquitto_pub -h localhost -t 'haus/wohnzimmer/temperatur' -r -n

# Will-Nachricht setzen
mosquitto_sub -h localhost -t 'haus/keller/temperatur' \
  --will-topic 'status/keller' --will-payload 'offline' --will-qos 1 -v

Benutzer und Zugriffskontrolle

# Passwortdatei anlegen
mosquitto_passwd -c /etc/mosquitto/passwd sensor
mosquitto_passwd /etc/mosquitto/passwd arbeiter

# Konfiguration (Auszug)
# listener 1883
# allow_anonymous false
# password_file /etc/mosquitto/passwd
# acl_file /etc/mosquitto/acl
#
# acl-Datei:
# user sensor
# topic write fabrik/presse/#
# user arbeiter
# topic read fabrik/#

Der wichtigste Sicherheitshinweis: Ohne allow_anonymous false und eine ACL darf jedes Gerät im Netz jedes Topic lesen und schreiben – auch die Steuerbefehle der Heizung. Ein offener MQTT-Broker im Internet ist eine der häufigsten IoT-Schwachstellen überhaupt. Für Produktionsbetrieb gehören TLS mit Zertifikaten, Benutzer je Gerät und eng gefasste ACLs dazu.

Diagnose

# Alle Topics beobachten (Vorsicht: viel Ausgabe)
mosquitto_sub -h localhost -t '#' -v

# Verbindungszustand im Broker-Log
journalctl -u mosquitto -f

# Topics auflisten – MQTT kennt keine Topic-Liste!
# Hilfsmittel: Nachrichten mitschneiden und Topics sammeln
mosquitto_sub -h localhost -t '#' -v | awk '{print $2}' | sort -u

Praxis-Tipps

  • Kein Topic-Verzeichnis: MQTT kennt nur Topics, die gerade benutzt werden. Ein Schema gehört in die Dokumentation, sonst entsteht Wildwuchs, den niemand mehr überblickt.
  • Retained Messages bewusst nutzen: Für Zustandswerte sinnvoll, für Ereignisse („Tür geöffnet“) falsch – ein später Abonnent bekäme sonst eine alte Meldung als aktuell.
  • QoS 2 sparsam: Es kostet vier Pakete pro Nachricht. In den meisten Fällen genügt QoS 1 mit idempotenter Verarbeitung.
  • Testablauf mit -v: Die Option zeigt Topic und Nutzlast – unverzichtbar, um zu prüfen, ob ein Gerät überhaupt sendet.

Verwandte Grundlagen: Message Queue, IoT, Message Broker, TLS 1.3.