VerneMQ Conexión MQTT perdida (8): AMQJS0008I Socket cerrado. diferentes puntos de montaje
En mi configuración, estoy reescribiendo los puntos de montaje de los clientes de los establecidos por los oyentes a los puntos de montaje individuales en función del grupo de clientes.
La idea detrás de esto es el perfecto aislamiento de la multi-tenencia en el servidor. Así, los clientes individuales de diferentes grupos no pueden verse entre sí, incluso cuando se suscriben a "#" (todo).
En mi auth_on_register webhook estoy comprobando si el cliente que intenta registrarse viene de la web (como parte de la interfaz de usuario de picockpit) o del cliente Raspberry Pi. En este punto, el punto de montaje sigue siendo determinado por el oyente, ya que aún no ha sido reescrito.
En el webhook (en Crystal) yo establecer el nuevo punto de montaje...así:
res = %({"resultado": "ok", "modificadores": {"mountpoint": "#{mountpoint}", "client_id": "#{clientid}"}})
Hoy estaba depurando por qué el cliente JS no podía publicar ningún mensaje. Se desconectaba con el error:
Conexión MQTT perdida (8): AMQJS0008I Socket cerrado.
Esto es lo que veo como salida de depuración de VerneMQ:
"12:13:33.630 [error] no se puede autentificar publicar [<>,{"...",<>},0,[<>],<>,false] debido a not_authorized"
Esto me desconcertó inicialmente. Estaba comprobando el punto de montaje "correcto" (cliente javascript), pensé...
¿Y mi webhook para auth_on_publish nunca fue llamado?
Resulta que, que me olvidé de considerar que el nuevo punto de montaje ya estaba configurado¡! Y este nuevo punto de montaje es no alguna construcción virtual, sino el nuevo punto de montaje real - ¡cualquier petición de este cliente va a llevar ese nuevo punto de montaje!
Por lo tanto: asegúrese de que en su función Lua auth_on_publish(pub) está comprobando el nuevo punto de montajeantes de pasar al siguiente gestor (webhook).