Raspberry Pi

Mosquitto-Bridge-Konfiguration: Lokale Topics per TLS an einen Cloud-Broker weiterleiten

Konfigurieren Sie auf einem Raspberry Pi eine Mosquitto-Bridge, die ausgewählte lokale Topics per TLS an einen Cloud-MQTT-Broker weiterleitet, Befehle zurückempfängt, Nachrichten bei Ausfällen puffert und Nachrichtenschleifen vermeidet.

Diagramm eines lokalen Brokers auf einem Raspberry Pi, der Topics über eine Mosquitto-Bridge-Konfiguration per TLS an einen Cloud-Broker weiterleitet
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Mit einer guten Mosquitto-Bridge-Konfiguration bedient ein lokaler Broker auf einem Raspberry Pi weiterhin die Geräte im LAN und leitet zugleich genau die Topics, die Sie auswählen, an einen Cloud-Broker weiter. In diesem Tutorial bauen Sie eine Bridge, die sich per TLS mit den Zugangsdaten aus dem Portal bei ConnectMQ anmeldet, Topics so umschreibt, dass jeder Standort seinen eigenen Namespace erhält, Befehle zurück nach unten sendet, Nachrichten über Internetausfälle hinweg puffert und die klassische Nachrichtenschleife vermeidet. Jede Option wird erklärt, sodass Sie die Datei anpassen können, statt sie blind zu kopieren.

So funktioniert eine Mosquitto-Bridge

Eine Bridge ist kein spezielles Protokoll. Der lokale Mosquitto-Broker öffnet eine ausgehende Verbindung zum entfernten Broker und verhält sich wie ein normaler MQTT-Client: Er abonniert auf der einen Seite und republiziert auf der anderen, gemäß den topic-Zeilen in seiner Konfiguration. Das hat drei nützliche Folgen:

  • Keine eingehenden Ports. Der Pi verbindet sich nach außen über Port 8883, so wie ein Browser eine Website aufruft. Ihr Router bleibt geschlossen.
  • Der entfernte Broker braucht nichts Besonderes. Jeder standardkonforme Broker akzeptiert eine Bridge, denn er sieht lediglich einen Client, der sich mit Benutzername, Passwort und Client-ID anmeldet.
  • Sie bestimmen, was die Grenze passiert. Nur Topics, die zu einer topic-Zeile passen, verlassen oder erreichen den Standort.

In diesem Aufbau ist die entfernte Seite ConnectMQ, ein verwalteter MQTT-Broker. Die Bridge authentifiziert sich wie jedes andere Gerät mit den im Portal generierten Zugangsdaten. Falls Sie den lokalen Broker noch nicht eingerichtet haben, folgen Sie zuerst der Anleitung Mosquitto auf dem Raspberry Pi installieren.

 Sensors / PLC gateway / Node-RED (LAN)
          |  mqtt://pi:1883  (local users)
          v
 +---------------------------+
 |  Mosquitto on Raspberry Pi |
 |  bridge "connectmq"        |
 +---------------------------+
          |  mqtts://broker.connectmq.com:8883
          |  remote_username / remote_password / remote_clientid
          v
 +---------------------------+
 |  ConnectMQ cloud broker    |  dashboards, phones, other sites
 +---------------------------+

Bevor Sie beginnen

  1. Ein Raspberry Pi, auf dem Mosquitto 2.0 mit mindestens einem authentifizierten lokalen Listener läuft.
  2. Ein Cloud-Broker mit Zugangsdaten. Registrieren Sie sich im Portal, wählen Sie einen Plan, erstellen Sie einen Broker und kopieren Sie den generierten Benutzernamen, das Passwort und die Client-ID. Die Client-ID ist an diese Zugangsdaten gebunden, die Bridge muss sie also exakt verwenden.
  3. Ein Konzept für Topic-Namen. Legen Sie fest, wie lokale Topics in der Cloud aussehen sollen. Ein Standortpräfix wie site1/ verhindert, dass mehrere Pis kollidieren.

Für ein schnelles Experiment ohne Konto können Sie die Bridge mit dem Öffentlichen MQTT-Broker auf Port 1883 verbinden, ohne Zugangsdaten und mit einer beliebigen eindeutigen Client-ID sowie einem zufälligen Präfix wie connectmq/demo/3c7d52/. Dort ist alles öffentlich lesbar; er dient nur Tests und Prototypen, verwenden Sie also ausschließlich Dummy-Daten.

Die vollständige Mosquitto-Bridge-Konfiguration

Legen Sie /etc/mosquitto/conf.d/bridge-connectmq.conf an:

# ---- Verbindung ----
connection connectmq
address broker.connectmq.com:8883
bridge_protocol_version mqttv311
try_private false
start_type automatic
restart_timeout 5 60
keepalive_interval 60

# ---- TLS ----
bridge_capath /etc/ssl/certs
bridge_insecure false

# ---- Zugangsdaten aus dem ConnectMQ-Portal ----
remote_clientid YOUR_CLIENT_ID
remote_username YOUR_USERNAME
remote_password YOUR_PASSWORD

# ---- Session und Queueing ----
cleansession false
local_clientid bridge-connectmq-local

# ---- Status-Topic (wird auf der entfernten Seite publiziert) ----
notifications true
notifications_local_only false
notification_topic site1/bridge/state

# ---- Topic-Zuordnung ----
# Telemetrie nach oben: lokal "sensors/#" -> entfernt "site1/sensors/#"
topic sensors/# out 1 "" site1/
# Maschinenzustände nach oben, retained-Werte bleiben erhalten
topic machines/+/state out 1 "" site1/
# Befehle nach unten: entfernt "site1/cmd/#" -> lokal "cmd/#"
topic cmd/# in 1 "" site1/

Starten Sie neu und verfolgen Sie das Log:

sudo chmod 0640 /etc/mosquitto/conf.d/bridge-connectmq.conf
sudo chown root:mosquitto /etc/mosquitto/conf.d/bridge-connectmq.conf
sudo systemctl restart mosquitto
sudo journalctl -u mosquitto -f

Sie sollten Connecting bridge connectmq (broker.connectmq.com:8883) sehen, gefolgt von keinen Fehlern. Die Rechteänderung ist wichtig, weil die Datei das entfernte Passwort enthält.

Option für Option

Option Wert hier Warum
address broker.connectmq.com:8883 TLS-Port des Cloud-Brokers
bridge_protocol_version mqttv311 Breit unterstützt; MQTT-5-Bridging ist mit aktuellen Mosquitto-Versionen ebenfalls möglich
try_private false Vermeidet ein Mosquitto-eigenes Bridge-Flag, das andere Broker ablehnen könnten
restart_timeout 5 60 Wartezeit zwischen Reconnect-Versuchen steigt von 5 s bis 60 s
bridge_capath /etc/ssl/certs Der System-CA-Store validiert das Let's-Encrypt-Zertifikat des Brokers
bridge_insecure false Hostname-Prüfung immer eingeschaltet lassen
remote_clientid Client-ID aus dem Portal Muss zu den ausgegebenen Zugangsdaten passen
cleansession false Sessions behalten, damit QoS-1-Nachrichten bei Ausfällen gepuffert werden
notifications true Publiziert 1, wenn die Bridge verbunden ist, und 0 (als Last Will), wenn sie abbricht
notification_topic site1/bridge/state Hält den Status in Ihrem eigenen Namespace

Die topic-Zeile verstehen

Die Syntax lautet topic <pattern> <direction> <qos> <local-prefix> <remote-prefix>. Mosquitto entfernt beim Weiterleiten nach außen das lokale Präfix vom lokalen Topic und fügt das entfernte Präfix hinzu; bei in geschieht das Umgekehrte. Mit leerem lokalem Präfix (geschrieben als "") und dem entfernten Präfix site1/ gilt:

  • Lokal sensors/boiler/temp wird entfernt zu site1/sensors/boiler/temp.
  • Entfernt site1/cmd/pump1/set wird lokal zu cmd/pump1/set.

Beachten Sie, dass das entfernte Präfix mit einem Schrägstrich endet. Ohne ihn erhalten Sie site1sensors/..., ein Fehler, der leicht passiert und schwer zu entdecken ist.

QoS auf der Bridge

Die QoS in einer topic-Zeile ist das Maximum, das über die Bridge verwendet wird. QoS 1 ist die praktische Wahl: Sie garantiert die Zustellung mit Bestätigungen und wird in jedem Plan unterstützt, auch im kostenlosen Serverless-Plan, der QoS auf 1 begrenzt. Verwenden Sie QoS 2 nur, wenn Ihr Plan sie unterstützt und die Daten wirklich keine Duplikate vertragen. Der Artikel MQTT-QoS-Stufen erklärt beschreibt die Abwägungen.

Puffern bei Internetausfällen

Mit cleansession false behält der lokale Broker die Session der Bridge, solange die Verbindung unterbrochen ist, und puffert QoS-1-Nachrichten für sie. Kehrt die Verbindung zurück, fließt der Rückstau in die Cloud ab. Die Warteschlange wird durch max_queued_messages (und optional max_queued_bytes) in Ihrer Hauptkonfiguration begrenzt. Dimensionieren Sie sie für den längsten Ausfall, den Sie abdecken möchten; auf einem Pi mit SD-Karte sollten Sie maßvoll bleiben, weil persistierte Warteschlangen bei jedem Autosave auf die Karte geschrieben werden. QoS-0-Nachrichten werden nicht gepuffert, ein weiterer Grund, Telemetrie mit QoS 1 zu bridgen.

Denken Sie daran, dass auch die Cloud-Seite eigene Grenzen hat. Trifft ein langer Rückstau auf einmal ein, kann ein Broker mit Kontingenten pro Plan und Flood-Schutz ihn drosseln. Sehr lange Ausfälle lassen sich daher besser mit einem Puffer auf Anwendungsebene abfangen, wie im Leitfaden zum Offline-Puffern von Nachrichten.

Die Bridge Ende-zu-Ende testen

Abonnieren Sie auf der Cloud-Seite. Beim öffentlichen MQTT-Broker können Sie mosquitto_sub direkt verwenden; bei einem privaten Broker nutzen Sie einen zweiten Satz Zugangsdaten oder den MQTT-Client im Browser im Portal:

mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u YOUR_USERNAME_2 -P YOUR_PASSWORD_2 -i YOUR_CLIENT_ID_2 \
  -t 'site1/#' -v

Publizieren Sie lokal auf dem Pi:

mosquitto_pub -h localhost -u sensors -P 'sensors-password' -i t1 -q 1 \
  -t sensors/boiler/temp -m 64.2

Der Cloud-Abonnent gibt site1/sensors/boiler/temp 64.2 und site1/bridge/state 1 aus. Testen Sie nun den Downlink. Abonnieren Sie lokal cmd/# und publizieren Sie dann von der Cloud-Seite an site1/cmd/pump1/set. Die Nachricht kommt lokal als cmd/pump1/set an.

Testen Sie zum Schluss einen Ausfall: Schalten Sie das Netzwerk auf dem Pi ab (sudo nmcli networking off), publizieren Sie lokal einige QoS-1-Nachrichten, aktivieren Sie das Netzwerk wieder und beobachten Sie, wie sie in der Cloud ankommen. Das Status-Topic der Bridge wechselt während der Unterbrechung auf 0, zugestellt vom Broker als Last Will der Bridge.

Schleifen in Ihrer Mosquitto-Bridge-Konfiguration vermeiden

Eine Schleife entsteht, wenn eine nach außen weitergeleitete Nachricht wieder hereinkommt und erneut nach außen geleitet wird. Die häufigste Ursache ist eine both-Regel oder überlappende in- und out-Muster auf denselben Topics:

# Gefährlich: alles unter site1/ springt hin und her
topic # both 1 "" site1/

Halten Sie die Richtungen in getrennten Teilbäumen: Telemetrie und Zustände gehen out, Befehle kommen in unter einem anderen Zweig (cmd/). Wenn Sie wirklich both brauchen, bevorzugen Sie MQTT-5-Bridging mit No-Local-Subscriptions, sofern Ihre Mosquitto-Version es unterstützt, und testen Sie sorgfältig. Bridgen Sie # niemals ohne Präfix, in keiner Richtung.

Mehrere Standorte, ein Cloud-Broker

Jeder Pi erhält eigene Zugangsdaten und ein eigenes Präfix (site1/, site2/, ...). Dashboards abonnieren +/sensors/#, um alle Standorte zu sehen, oder ein einzelnes Präfix für einen Standort. Weil jede Bridge eine eindeutige, an ihre Zugangsdaten gebundene Client-ID hat, beeinträchtigt der Widerruf eines Standorts nie die anderen. Kostenpflichtige Serverless-Pläne bieten zusätzlich Shared Subscriptions, die helfen, wenn mehrere Cloud-Abnehmer den gemeinsamen Datenstrom aufteilen müssen. Industrielle Standorte können noch weiter gehen und eine ISA-95-Hierarchie wie enterprise/site/area/line/cell übernehmen, etwa acme/werk-augsburg/montage/linie-1/zelle-2. So wird aus den Bridges aller Werke ein gemeinsamer Unified Namespace (UNS), dessen Struktur das Portal erkennt und in seiner Geräteansicht anzeigt.

Fehlerbehebung

Log-Meldung oder Symptom Ursache Lösung
Connection Refused: not authorised Falsche Zugangsdaten oder Client-ID Alle drei erneut aus dem Portal kopieren
certificate verify failed Fehlender CA-Store oder falsche Uhrzeit ca-certificates installieren, NTP mit timedatectl prüfen
Bridge verbindet sich, aber nichts kommt an Topic-Muster oder Präfix passt nicht An den abschließenden Schrägstrich im Präfix denken
Verbindung bricht alle paar Sekunden ab Ein anderer Client nutzt dieselbe Client-ID Eine Client-ID pro Verbindung
Nachrichten gehen bei Ausfällen verloren QoS 0 oder cleansession true QoS 1 und cleansession false verwenden
Nachrichtensturm nach Aktivieren der Bridge Schleife durch überlappende in/out-Regeln Getrennte Teilbäume pro Richtung

Verbinden Sie Ihren Pi mit ConnectMQ

Erstellen Sie unter app.connectmq.com einen kostenlosen Serverless-Broker, ohne Kreditkarte, fügen Sie den generierten Benutzernamen, das Passwort und die Client-ID in Ihre Bridge-Datei ein und beobachten Sie, wie die Topics Ihres Standorts im Live-Topic-Explorer des Portals erscheinen. Zum übergeordneten Gateway-Design rund um diese Bridge lesen Sie Raspberry Pi als IoT-Gateway, und für die gesamte Pi-Reihe das Raspberry-Pi-MQTT-Tutorial.

Häufig gestellte Fragen

Braucht ConnectMQ eine spezielle Bridge-Funktion für Mosquitto?

Nein. Die Mosquitto-Bridge verbindet sich als normaler MQTT-Client mit Benutzername, Passwort und Client-ID aus dem Portal, daher funktioniert jeder Plan.

Sollte ich mit MQTT 3.1.1 oder MQTT 5 bridgen?

MQTT 3.1.1 ist die einfachste und am breitesten getestete Wahl für Bridges. Aktuelle Mosquitto-Versionen unterstützen mqttv50-Bridging, wenn Sie MQTT-5-Funktionen auf der Bridge-Verbindung benötigen.

Warum try_private auf false setzen?

Ist die Option aktiv, signalisiert Mosquitto über ein nicht standardkonformes Protokoll-Flag, das für Verbindungen zwischen Mosquitto-Brokern gedacht ist, dass es eine Bridge ist. Ausgeschaltet bleibt die Verbindung gegenüber anderen Brokern vollständig standardkonform.

Wie viele Nachrichten puffert die Bridge während eines Ausfalls?

So viele, wie max_queued_messages und max_queued_bytes zulassen, für QoS-1- und QoS-2-Nachrichten mit cleansession false. QoS-0-Nachrichten werden verworfen, solange die Verbindung unterbrochen ist.

Verwandte Artikel

Raspberry Pi RFID MQTT: Zutrittsprotokollierung mit dem RC522-Leser

Schließen Sie einen RC522-RFID-Leser an einen Raspberry Pi an, lesen Sie Tags mit Python, prüfen Sie sie gegen eine lokale Allowlist und veröffentlichen Sie jeden Zutrittsversuch als MQTT-Ereignis, das Logger, Dashboards und Alarmwerkzeuge verarbeiten können.

7 Min. Lesezeit

Pico W vs. Pico 2 W für MQTT: RP2040 vs. RP2350 bei Leistung, Speicher und TLS

Der Pico 2 W behält Formfaktor und WLAN-Chip des Pico W, ersetzt aber den RP2040 durch den schnelleren RP2350. Dieser Vergleich zeigt, was das für MQTT-Geräte bedeutet: CPU, Speicher, TLS, Sicherheitsfunktionen, Softwareunterstützung und welches Board für welches Projekt.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.