VerneMQ MQTT-Verbindung verloren (8): AMQJS0008I Socket geschlossen. verschiedene Mountpoints
In meinem Setup schreibe ich die Einhängepunkte der Clients von den von den Listenern eingerichteten auf individuelle Einhängepunkte je nach Clientgruppe um.
Die Idee dahinter ist die perfekte Isolierung der Mehrmandantenfähigkeit auf dem Server. Einzelne Clients aus verschiedenen Gruppen können sich also nicht gegenseitig sehen, selbst wenn sie "#" (alles) abonnieren.
In meinem auth_on_register Webhook prüfe ich, ob der Client, der sich registrieren will, aus dem Web (als Teil der picockpit Benutzeroberfläche) oder vom Raspberry Pi Client kommt. Zu diesem Zeitpunkt wird der Mountpoint noch durch den Listener bestimmt, da er noch nicht umgeschrieben wurde.
In dem Webhook (in Crystal) habe ich den neuen Einhängepunkt setzen... etwa so:
res = %({"Ergebnis": "ok", "modifiers": {"mountpoint": "#{Mountpunkt}", "client_id": "#{clientid}"}})
Heute habe ich eine Fehlersuche durchgeführt, weil der JS-Client keine Nachrichten veröffentlichen konnte. Die Verbindung wurde mit dem Fehler unterbrochen:
MQTT-Verbindung verloren (8): AMQJS0008I Socket geschlossen.
Hier ist, was ich als VerneMQ-Debug-Ausgabe sehe:
"12:13:33.630 [error] can't auth publish [<>,{"...",<>},0,[<>],<>,false] due to not_authorized"
Das hat mich zunächst verwirrt. Ich habe nach dem "richtigen" (Javascript-Client) Einhängepunkt gesucht, dachte ich?
Und mein Webhook für auth_on_publish wurde nie aufgerufen?
Es stellt sich heraus, dass ich vergessen habe zu berücksichtigen, dass der neue Einhängepunkt bereits gesetzt war! Und dieser neue Einhängepunkt ist nicht ein virtuelles Konstrukt, sondern den tatsächlichen neuen Einhängepunkt - alle Anfragen von diesem Client werden diesen neuen Einhängepunkt tragen!
Deshalb: Stellen Sie sicher, dass in Ihrer Lua-Funktion auth_on_publish(pub) suchen Sie nach dem neuen Einhängepunktbevor sie an den nächsten Handler (Webhook) weitergegeben wird.