1. Sobre la opción “Skip connection replace”
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:
-
Usar distintos usuarios para publicar y suscribir, prestando atención a no reusarlos (un usuario por credential al mismo tiempo).
-
O también puede deshabilitar el “Reemplazo de conexión” de manera que pueda conectar varias veces sin cerrar la conexión previa.
2. Cómo evitar el reemplazo de conexión: activando el “skip connection replace”
-
Si opta por la segunda opción, así es cómo se activa. Pulse sobre el dispositivo donde activar la opción y active “enable skip connection replace”:
-
Después de pulsar de activarlo, guarde la configuración.
Algunas notas sobre deshabilitar el connection replace
-
No es estándar
-
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).
-
Debido a que el “skip connection replace” crea un clientId temporal para el dispositivo, no es posible poder recuperar los mensajes asociados a dicho ID en futuras conexiones. Por este motivo, no se guardan mensajes pendientes de entregar para dispositivos con "skip connection replace activado.