Node-RED

Node-RED MQTT no conecta: guía de solución de problemas

Una guía paso a paso para cuando el nodo MQTT de Node-RED se queda en connecting o se desconecta una y otra vez: cómo leer los logs, probar fuera de Node-RED y corregir puertos, TLS, nombres de host, client IDs duplicados, credenciales, cuotas y red de contenedores.

Nodo MQTT de Node-RED con el estado connecting en amarillo mientras se diagnostica por qué Node-RED MQTT no conecta
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

Cuando Node-RED MQTT no conecta, el nodo suele quedarse con un anillo amarillo de "connecting" o alterna entre connected y disconnected, y el resto de tu flujo se queda en silencio. Esta guía te ofrece una forma rápida y ordenada de encontrar la causa: leer los logs adecuados, demostrar que el broker es accesible fuera de Node-RED y después revisar puertos, TLS, nombres de host, client IDs, credenciales y red de contenedores hasta que el estado se ponga en verde.

Conoce los síntomas

El estado que aparece bajo un nodo mqtt in o mqtt out es tu primera pista:

Estado Lo que suele significar
Anillo amarillo, "connecting" indefinidamente Node-RED no logra completar la conexión: host o puerto incorrectos, TLS que no coincide, firewall, DNS
Anillo rojo, "disconnected" El broker rechazó o cerró la conexión; revisa las credenciales y los logs
Verde y luego rojo cada pocos segundos Otro cliente usa el mismo client ID, o hay problemas de keepalive
Verde, pero sin mensajes La conexión está bien; el problema es el topic, el QoS o el publicador
Gris o sin estado El nodo no está vinculado a una configuración de broker o el flujo no está desplegado

Fíjate en los dos últimos. Un estado verde significa que la conexión funciona, así que salta directamente a los topics. Muchos informes de "no conecta" son en realidad problemas de suscripción.

Paso 1: lee el log de Node-RED

El editor solo muestra un estado breve. El log de Node-RED contiene el error real. Dónde encontrarlo depende de cómo ejecutes Node-RED:

# Iniciado desde una terminal: el log está en esa terminal

# Instalado como servicio systemd (p. ej. con el script de Raspberry Pi)
journalctl -u nodered -f

# Docker
docker logs -f nodered

Busca líneas del nodo broker MQTT como Connection failed to broker: .... El texto tras los dos puntos, por ejemplo Connection refused: Not authorized, getaddrinfo ENOTFOUND, ECONNREFUSED o un error de certificado, te lleva directamente a una de las secciones siguientes.

Paso 2: prueba fuera de Node-RED

Antes de cambiar nada en Node-RED, demuestra que la máquina puede llegar al broker. Los clientes de Mosquitto son la forma más rápida. Prueba primero con el servidor MQTT público gratuito, ya que no necesita credenciales:

mosquitto_sub -h broker.connectmq.com -p 1883 -i nr-test-6b0e \
  -t "connectmq/demo/6b0e/#" -v

En una segunda terminal:

mosquitto_pub -h broker.connectmq.com -p 1883 -i nr-test-pub-6b0e \
  -t "connectmq/demo/6b0e/ping" -m "hello"

Si aparece hello, el MQTT saliente funciona desde esta máquina. Ahora prueba tu broker privado exactamente como se conectará Node-RED, con TLS y credenciales:

mosquitto_sub -h YOUR_BROKER_HOST -p 8883 \
  --capath /etc/ssl/certs \
  -u YOUR_USERNAME -P YOUR_PASSWORD -i YOUR_CLIENT_ID \
  -t "test/#" -v -d

El parámetro -d muestra los paquetes CONNECT y CONNACK. Si este comando falla, el problema es la red, el certificado o las credenciales, no Node-RED. Si funciona y Node-RED sigue fallando, compara los ajustes de Node-RED campo por campo con este comando. Detén el cliente de prueba antes de iniciar Node-RED, porque usa el mismo client ID.

Paso 3: revisa a la vez servidor, puerto y TLS

La mayoría de los bucles de conexión se deben a una discrepancia entre el puerto y los ajustes TLS. La mayoría de los brokers usan estos puertos estándar:

Puerto Transporte Ajustes del nodo broker de Node-RED
1883 MQTT sobre TCP Use TLS desmarcado
8883 MQTT sobre TLS Use TLS marcado
8083 MQTT sobre WebSocket Server ws://host:8083/mqtt
8084 MQTT sobre WebSocket seguro Server wss://host:8084/mqtt

Errores habituales:

  1. Puerto 8883 sin TLS. Node-RED envía MQTT sin cifrar a un puerto TLS; el broker espera un handshake TLS y el nodo se reconecta sin parar.
  2. Puerto 1883 con TLS marcado. Node-RED inicia un handshake TLS contra un puerto sin cifrar y falla.
  3. Esquema en el campo del servidor. Escribe solo el nombre de host, como broker.connectmq.com, para TCP y TLS. Usa una URL ws:// o wss:// solo cuando quieras conectarte por WebSocket.
  4. Erratas y espacios. Un espacio al final del nombre de host provoca errores de DNS difíciles de detectar.

Para TLS, comprueba también que Verify server certificate está activado y que el nombre del servidor coincide con el certificado. ConnectMQ usa un certificado de Let's Encrypt, en el que Node.js confía por defecto, así que no necesitas subir un archivo de CA. Si añadiste una configuración TLS personalizada con un archivo de CA antiguo, elimínala. La configuración completa está en Node-RED MQTT TLS.

Paso 4: descarta client IDs duplicados

Los brokers MQTT solo permiten una conexión por client ID. Cuando un segundo cliente se conecta con el mismo ID, el broker desconecta al primero. Si ambos clientes se reconectan automáticamente, se expulsan mutuamente sin fin, lo que se ve como un estado que alterna entre connected y disconnected.

Orígenes típicos de duplicados:

  • Dos instancias de Node-RED, como un portátil y una Raspberry Pi, desplegadas con el mismo flujo.
  • Un mosquitto_sub de prueba que se quedó en marcha con el client ID de Node-RED.
  • Un contenedor Docker recreado mientras el antiguo sigue en ejecución.
  • Dos nodos de configuración de broker en un mismo Node-RED con el mismo ID.

Da a cada instancia un ID único. En el broker público sirve cualquier cadena única no vacía. En los brokers privados de ConnectMQ, los client IDs están vinculados a las credenciales emitidas, así que usa el client ID que muestra el portal y no reutilices ese conjunto de credenciales en una segunda instancia; crea otra credencial para ella.

Paso 5: revisa las credenciales y los límites de la cuenta

Una conexión rechazada justo después de conectar suele indicar un problema de autenticación. Con MQTT 3.1.1 verás los códigos de retorno 4 o 5 (usuario o contraseña incorrectos, no autorizado); con MQTT 5 verás reason codes como 0x86 o 0x87. Vuelve a introducir el usuario y la contraseña en la pestaña Security del nodo broker y despliega. Las credenciales se guardan separadas de los flujos, así que al importar un flujo en una máquina nueva te llevas los ajustes del broker, pero no la contraseña.

Dos causas menos evidentes:

  • Intentos de login fallidos repetidos. ConnectMQ bloquea una dirección IP tras varios intentos de login fallidos. Si desplegaste una contraseña incorrecta y Node-RED reintentó muchas veces, corrige las credenciales y espera a que se levante el bloqueo antes de concluir que la nueva contraseña también es incorrecta.
  • Cuotas de conexión. Cada plan tiene un límite de conexiones; el plan Serverless gratuito permite hasta 25 conexiones. Por encima del límite, un broker MQTT 5 puede rechazar con el reason code 0x97 (cuota superada). Cuenta todos tus dispositivos, paneles e instancias de Node-RED.

Paso 6: corrige la red, el DNS y los contenedores

Si el log muestra ENOTFOUND, ETIMEDOUT o ECONNREFUSED:

  • Firewalls. Las redes corporativas y algunas redes de invitados bloquean el tráfico saliente a los puertos 1883 y 8883. Prueba WebSocket seguro en el 8084, que a menudo pasa donde el MQTT directo no lo hace.
  • localhost en Docker. Dentro de un contenedor, localhost es el propio contenedor. Usa el nombre de host del broker, un nombre de servicio de Compose o host.docker.internal; consulta Node-RED en Docker.
  • DNS. Ejecuta nslookup YOUR_BROKER_HOST en el host de Node-RED. Los gateways con DNS mal configurado fallan aquí primero.
  • Proxies. El cliente MQTT de Node-RED no enruta TCP directo a través de un proxy HTTP; las conexiones WebSocket pueden llevarse mejor con los proxies.

Paso 7: revisa los ajustes de keepalive y de sesión

Si la conexión se cae cada uno o dos minutos en una red por lo demás sana, revisa el keepalive. Un valor de 60 segundos sirve para la mayoría de los enlaces. Los valores muy largos permiten que los routers NAT descarten en silencio las conexiones inactivas. Asegúrate también de que los ajustes de Clean session y la versión del protocolo coinciden con lo que espera tu flujo. Usar funciones de MQTT 5 en un nodo broker configurado en 3.1.1 no impedirá la conexión, pero puede explicar comportamientos extraños una vez conectado.

Lista rápida de solución de problemas

  1. ¿Está el flujo desplegado y el nodo MQTT vinculado a una configuración de broker?
  2. ¿Muestra el log de Node-RED un error concreto?
  3. ¿Se conecta mosquitto_sub desde la misma máquina con los mismos ajustes?
  4. ¿Coinciden los ajustes de puerto y TLS (1883 sin cifrar, 8883 con TLS)?
  5. ¿El campo del servidor es un nombre de host sin más y sin erratas?
  6. ¿Es el client ID único entre todos los clientes en ejecución?
  7. ¿Son correctos el usuario y la contraseña, y tu IP no está bloqueada temporalmente?
  8. ¿Estás por debajo del límite de conexiones de tu plan?
  9. ¿Resuelve el DNS y está abierto el puerto desde esta red o contenedor?

Si el estado está en verde pero no llegan mensajes, revisa los topics y los comodines, y consulta el tutorial de Node-RED MQTT para ver un flujo que funciona. La documentación oficial de los nodos MQTT de Node-RED también explica cada ajuste del broker.

Consigue un broker fácil de depurar

Solucionar problemas es más rápido cuando puedes ver el lado del broker. ConnectMQ es un broker MQTT gestionado con un portal que incluye un cliente MQTT en el navegador y un explorador de topics en directo, para que compruebes si llegan los mensajes de Node-RED. También puedes suscribirte a $SYS/broker/connection/{clientId}/state para ver si un cliente concreto está conectado. Crea un broker Serverless gratuito en app.connectmq.com, sin tarjeta de crédito, y copia exactamente el host, el puerto, el usuario, la contraseña y el client ID en Node-RED. Para más contexto, lee sobre cómo elegir un broker MQTT en la nube.

Preguntas frecuentes

¿Por qué mi nodo MQTT de Node-RED se queda en connecting?

Normalmente el host o el puerto son incorrectos, TLS no coincide con el puerto o un firewall bloquea la conexión. Revisa el log de Node-RED para ver el error exacto y prueba los mismos ajustes con mosquitto_sub.

¿Por qué mi nodo MQTT de Node-RED se conecta y se desconecta continuamente?

La causa más habitual es un client ID duplicado: otro cliente con el mismo ID se queda con la sesión una y otra vez. Da a cada instancia de Node-RED y a cada herramienta de prueba un client ID único.

¿Necesito subir un certificado de CA para conectarme a ConnectMQ?

No. ConnectMQ usa un certificado de Let's Encrypt en el que Node.js confía por defecto. Marca Use TLS, usa el puerto 8883 y deja activada la verificación del certificado.

¿Puede Node-RED conectarse a MQTT a través de un firewall corporativo?

Si los puertos 1883 y 8883 están bloqueados, prueba MQTT sobre WebSocket seguro en el puerto 8084 con la ruta /mqtt, que tiene más probabilidades de estar permitido.

Artículos relacionados

Cliente OPC UA en Node-RED hacia MQTT con topics ISA-95

Usa node-red-contrib-opcua para suscribirte a variables OPC UA de un PLC o de un servidor de simulación, asignar los node IDs a topics MQTT de estilo ISA-95 y publicar los valores con calidad y marcas de tiempo.

10 min de lectura

Node-RED Dashboard 2.0 con MQTT: indicadores, gráficos y controles

Un tutorial práctico de Node-RED Dashboard 2.0: suscríbete a telemetría MQTT en directo, muéstrala en indicadores y en un gráfico de líneas, y controla un dispositivo con un interruptor que publica comandos y refleja el estado real.

9 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.