Conectando con varios dispositivos usando las mismas credenciales (o cómo evitar el connection replace de MQTT)


#1

Esta es una buena pregunta porque toca un aspecto particular del comportamiento descrito por el estándar MQTT relacionado con el reemplazo de conexiones conectando por segunda vez usando las mismas credeciales:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

Esto es útil para proteger a los dispositivos de ser bloqueados por conexiones “enganchadas” debido a problemas de NAT (por ejemplo).

Sin embargo, como habrás notado, también crea problemas en entornos donde las mismas credenciales clientId+userName son usadas de manera concurrente. Por ejemplo, una página web lanzando PUBLISH por cada visita. Es muy probable recibir varias visitas al mismo tiempo y por tanto varias conexiones al mismo tiempo.

Como pues ver, tiene ventajas e inconvenientes. Para resolver el problema, puede:

  1. Usar distintos usuarios para publicar y suscribir, prestando atención a no reusarlos (un usuario por credential al mismo tiempo).

  2. O también puede deshabilitar el “Reemplazo de conexión” de manera que pueda conectar varias veces sin cerrar la conexión previa.

Si opta por la segunda opción, así es cómo se activa. Pulse sobre el dispositivo donde activar la opción y active “conn replace off”:

Después de pulsar sobre “conn replace off”, podrá conectar varias veces sin recibir un connection close debido al reemplazo de conexión.

Algunas notas sobre deshabilitar el connection replace

  1. No es estándar :slight_smile:

  2. Cada vez que un dispositivo conecte con credenciales con esta opción activada, se le asignará un clientId virtual temporal con el cleanSession forzado a true (por ejemplo las subscripciones se perderán al desconectar, de manera que tendrá que reenviarlas cada vez que conecte).