Raspberry Pi

Configuración de un bridge Mosquitto: reenvía topics locales a un broker en la nube con TLS

Configura un bridge Mosquitto en una Raspberry Pi que reenvíe topics locales seleccionados a un broker MQTT en la nube con TLS, reciba comandos de vuelta, encole mensajes durante los cortes y evite bucles de mensajes.

Diagrama de un broker local en una Raspberry Pi que reenvía topics a un broker en la nube mediante una configuración de bridge Mosquitto con TLS
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Una buena configuración de bridge Mosquitto permite que un broker local en una Raspberry Pi siga atendiendo a los dispositivos de la LAN mientras reenvía exactamente los topics que elijas a un broker en la nube. En este tutorial construirás un bridge que se conecta a ConnectMQ por TLS con las credenciales del portal, remapea los topics para que cada sitio tenga su propio namespace, envía comandos de vuelta hacia abajo, encola mensajes durante los cortes de internet y evita el clásico bucle de mensajes. Cada opción se explica, para que puedas adaptar el archivo en lugar de copiarlo a ciegas.

Cómo funciona un bridge Mosquitto

Un bridge no es un protocolo especial. El broker Mosquitto local abre una conexión saliente hacia el broker remoto y se comporta como un cliente MQTT normal: se suscribe en un lado y vuelve a publicar en el otro, según las líneas topic de su configuración. Eso tiene tres consecuencias útiles:

  • Sin puertos de entrada. La Pi se conecta hacia fuera por el puerto 8883, igual que un navegador que abre un sitio web. Tu router permanece cerrado.
  • El broker remoto no necesita nada especial. Cualquier broker que cumpla el estándar acepta un bridge, porque simplemente ve a un cliente que inicia sesión con usuario, contraseña y client ID.
  • Tú eliges qué cruza la frontera. Solo los topics que coinciden con una línea topic salen del sitio o entran en él.

En esta configuración, el lado remoto es ConnectMQ, un broker MQTT gestionado. El bridge se autentica con las credenciales generadas en el portal como cualquier otro dispositivo. Si todavía no has configurado el broker local, sigue primero instalar Mosquitto en Raspberry Pi.

 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
 +---------------------------+

Antes de empezar

  1. Una Raspberry Pi con Mosquitto 2.0 en marcha y al menos un listener local autenticado.
  2. Un broker en la nube con credenciales. Regístrate en el portal, elige un plan, crea un broker y copia el username, la password y el client ID generados. El client ID está vinculado a esas credenciales, así que el bridge debe usarlo exactamente.
  3. Un plan para los nombres de topic. Decide cómo deben verse los topics locales en la nube. Un prefijo de sitio como site1/ evita que varias Pi colisionen.

Para un experimento rápido sin cuenta, puedes hacer el bridge hacia el servidor MQTT público gratuito en el puerto 1883, sin credenciales y con cualquier client ID único, usando un prefijo aleatorio como connectmq/demo/3c7d52/. Todo lo que hay allí es de lectura pública, así que usa solo datos ficticios, nunca datos de producción.

La configuración completa del bridge Mosquitto

Crea /etc/mosquitto/conf.d/bridge-connectmq.conf:

# ---- Conexión ----
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

# ---- Credenciales del portal de ConnectMQ ----
remote_clientid YOUR_CLIENT_ID
remote_username YOUR_USERNAME
remote_password YOUR_PASSWORD

# ---- Sesión y cola ----
cleansession false
local_clientid bridge-connectmq-local

# ---- Topic de estado (publicado en el lado remoto) ----
notifications true
notifications_local_only false
notification_topic site1/bridge/state

# ---- Mapeo de topics ----
# Telemetría hacia arriba: local "sensors/#" -> remoto "site1/sensors/#"
topic sensors/# out 1 "" site1/
# Estados de máquina hacia arriba, se conservan los valores retenidos
topic machines/+/state out 1 "" site1/
# Comandos hacia abajo: remoto "site1/cmd/#" -> local "cmd/#"
topic cmd/# in 1 "" site1/

Reinicia y sigue el 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

Deberías ver Connecting bridge connectmq (broker.connectmq.com:8883) sin errores a continuación. El cambio de permisos es importante porque el archivo contiene la contraseña remota.

Opción por opción

Opción Valor aquí Por qué
address broker.connectmq.com:8883 Puerto TLS del broker en la nube
bridge_protocol_version mqttv311 Ampliamente soportado; en versiones recientes de Mosquitto también es posible el bridge con MQTT 5
try_private false Evita un flag de bridge exclusivo de Mosquitto que otros brokers pueden rechazar
restart_timeout 5 60 Espera progresiva de 5 s a 60 s entre intentos de reconexión
bridge_capath /etc/ssl/certs El almacén de CA del sistema valida el certificado Let's Encrypt del broker
bridge_insecure false Mantén siempre activa la verificación del nombre de host
remote_clientid Client ID del portal Debe coincidir con las credenciales emitidas
cleansession false Conserva las sesiones para que los mensajes QoS 1 se encolen durante los cortes
notifications true Publica 1 cuando el bridge se conecta y 0 (como last will) cuando se cae
notification_topic site1/bridge/state Mantiene el estado dentro de tu propio namespace

Entender la línea topic

La sintaxis es topic <pattern> <direction> <qos> <local-prefix> <remote-prefix>. Al reenviar hacia fuera, Mosquitto quita el prefijo local de un topic local y añade el prefijo remoto; con in hace lo contrario. Con un prefijo local vacío (escrito como "") y el prefijo remoto site1/:

  • El topic local sensors/boiler/temp se convierte en el remoto site1/sensors/boiler/temp.
  • El topic remoto site1/cmd/pump1/set se convierte en el local cmd/pump1/set.

Fíjate en que el prefijo remoto termina en barra. Sin ella obtienes site1sensors/..., un error fácil de cometer y difícil de detectar.

QoS en el bridge

El QoS de una línea topic es el máximo que se usa a través del bridge. QoS 1 es la opción práctica: garantiza la entrega con confirmaciones y está disponible en todos los planes, incluido el plan gratuito Serverless, que limita el QoS a 1. Usa QoS 2 solo si tu plan lo admite y los datos realmente no toleran duplicados. El artículo niveles de QoS de MQTT explicados analiza las ventajas y desventajas.

Cola durante los cortes de internet

Con cleansession false, el broker local conserva la sesión del bridge mientras la conexión está caída y encola para él los mensajes QoS 1. Cuando vuelve el enlace, la acumulación se vacía hacia la nube. La cola está limitada por max_queued_messages (y opcionalmente max_queued_bytes) en tu configuración principal. Dimensiónala para el corte más largo que quieras cubrir; en una Pi con tarjeta SD, mantenla moderada, porque las colas persistidas se escriben en disco en cada autoguardado. Los mensajes QoS 0 no se encolan, otra razón más para hacer el bridge de la telemetría con QoS 1.

Recuerda que el lado de la nube también aplica sus propios límites. Si una larga acumulación llega de golpe, un broker con cuotas por plan y protección contra flooding puede limitarla, así que los cortes muy largos se gestionan mejor con un buffer a nivel de aplicación como el de la guía de buffering de mensajes sin conexión.

Probar el bridge de extremo a extremo

Suscríbete en el lado de la nube. Con el servidor público puedes usar mosquitto_sub directamente; con un broker privado, usa un segundo juego de credenciales o el cliente MQTT del portal en el navegador:

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

Publica localmente en la Pi:

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

El suscriptor en la nube muestra site1/sensors/boiler/temp 64.2 y site1/bridge/state 1. Ahora prueba el enlace descendente. Suscríbete localmente a cmd/# y publica desde el lado de la nube en site1/cmd/pump1/set. El mensaje llega localmente como cmd/pump1/set.

Por último, prueba un corte: detén la red en la Pi (sudo nmcli networking off), publica localmente algunos mensajes QoS 1, vuelve a activar la red y observa cómo llegan a la nube. El topic de estado del bridge pasa a 0 mientras el enlace está caído, entregado por el broker como last will del bridge.

Evitar bucles en la configuración del bridge Mosquitto

Un bucle se produce cuando un mensaje reenviado hacia fuera vuelve a entrar y se reenvía de nuevo hacia fuera. La causa más habitual es una regla both, o patrones in y out que se solapan sobre los mismos topics:

# Peligroso: todo lo que hay bajo site1/ rebota de un lado a otro
topic # both 1 "" site1/

Mantén cada dirección en subárboles separados: la telemetría y los estados van out, los comandos entran in bajo otra rama (cmd/). Si de verdad necesitas both, prefiere el bridge con MQTT 5 y suscripciones no-local cuando tu versión de Mosquitto lo admita, y prueba con cuidado. Nunca hagas bridge de # sin prefijo en ninguna dirección.

Varios sitios, un único broker en la nube

Cada Pi recibe sus propias credenciales y su propio prefijo (site1/, site2/, ...). Los dashboards se suscriben a +/sensors/# para ver todos los sitios, o a un prefijo concreto para un único sitio. Como cada bridge tiene un client ID único ligado a sus credenciales, revocar un sitio nunca afecta a los demás. Los planes Serverless de pago añaden shared subscriptions, útiles cuando varios consumidores en la nube necesitan repartirse el flujo combinado. Los sitios industriales, por ejemplo plantas en Querétaro o Bilbao, pueden ir más allá y adoptar una jerarquía al estilo ISA-95 como enterprise/site/area/line/cell, que el portal detecta y muestra en su vista de dispositivos.

Solución de problemas

Mensaje del log o síntoma Causa Solución
Connection Refused: not authorised Credenciales o client ID incorrectos Vuelve a copiar los tres valores desde el portal
certificate verify failed Falta el almacén de CA o la hora es incorrecta Instala ca-certificates y comprueba NTP con timedatectl
El bridge se conecta, pero no llega nada El patrón de topic o el prefijo no coinciden Recuerda la barra final en los prefijos
La conexión se cae cada pocos segundos Otro cliente usa el mismo client ID Un client ID por conexión
Se pierden mensajes durante los cortes QoS 0 o cleansession true Usa QoS 1 y cleansession false
Tormenta de mensajes al activar el bridge Bucle por reglas in/out solapadas Subárboles separados para cada dirección

Conecta tu Pi a ConnectMQ con un bridge

Crea un broker Serverless gratuito en app.connectmq.com, sin tarjeta de crédito, pega en el archivo del bridge el username, la password y el client ID generados y observa cómo aparecen los topics de tu sitio en el explorador de topics en vivo del portal. Para el diseño de gateway más amplio en torno a este bridge, lee Raspberry Pi como gateway IoT, y para la serie completa sobre la Pi, el tutorial de MQTT con Raspberry Pi.

Preguntas frecuentes

¿Necesita ConnectMQ una función especial de bridge para Mosquitto?

No. El bridge de Mosquitto se conecta como un cliente MQTT normal con el username, la password y el client ID del portal, así que funciona con cualquier plan.

¿Debo hacer el bridge con MQTT 3.1.1 o con MQTT 5?

MQTT 3.1.1 es la opción más sencilla y más probada para los bridges. Las versiones recientes de Mosquitto admiten bridge con mqttv50 si necesitas funciones de MQTT 5 en el enlace del bridge.

¿Por qué poner try_private en false?

Cuando está activado, Mosquitto indica que es un bridge mediante un flag de protocolo no estándar pensado para enlaces de Mosquitto a Mosquitto. Desactivarlo mantiene la conexión totalmente estándar para otros brokers.

¿Cuántos mensajes encola el bridge durante un corte?

Tantos como permitan max_queued_messages y max_queued_bytes, para mensajes QoS 1 y 2 con cleansession false. Los mensajes QoS 0 se descartan mientras el enlace está caído.

Artículos relacionados

Fiabilidad de la Raspberry Pi: cómo usar una Pi 24/7 como gateway IoT

Una guía práctica para mantener un gateway MQTT con Raspberry Pi funcionando durante meses: desgaste del almacenamiento, sistemas de archivos de solo lectura, alimentación, refrigeración, watchdogs de hardware y software y monitorización remota de la salud.

9 min de lectura

Pico W vs Pico 2 W para MQTT: rendimiento, memoria y TLS de RP2040 frente a RP2350

La Pico 2 W mantiene el formato y el chip Wi-Fi de la Pico W, pero sustituye el RP2040 por el RP2350, más rápido. Esta comparativa analiza qué significa para los dispositivos MQTT: CPU, memoria, TLS, funciones de seguridad, soporte de software y qué placa comprar para cada proyecto.

9 min de lectura

Registro de accesos Raspberry Pi RFID MQTT con el lector RC522

Conecta un lector RFID RC522 a una Raspberry Pi, lee etiquetas en Python, compáralas con una lista blanca local y publica cada intento de acceso como un evento MQTT que pueden consumir registradores, dashboards y herramientas de alertas.

8 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.