VerneMQ MQTT verbinding verloren (8): AMQJS0008I Socket gesloten. verschillende mountpoints
In mijn setup herschrijf ik de mountpoints van clients van degene die ingesteld zijn door de listeners naar individuele mountpoints afhankelijk van de client groep.
Het idee hierachter is perfecte isolatie van multi-tenancy op de server. Individuele klanten van verschillende groepen kunnen elkaar dus niet zien, zelfs niet als ze zich abonneren op "#" (alles).
In mijn auth_on_register webhook controleer ik of de client die zich probeert te registreren van het web komt (als onderdeel van de picockpit gebruikersinterface) of van de Raspberry Pi client. Op dit punt wordt het mountpoint nog steeds bepaald door de listener, omdat deze nog niet is herschreven.
In de webhook (in Crystal) heb ik stel het nieuwe koppelpunt inzoals dit:
res = %({"resultaat": "ok", "modifiers": {"mountpoint": "#{mountpoint}", "client_id": "#{clientid}"}})
Vandaag was ik aan het debuggen waarom de JS client geen berichten kon publiceren. De verbinding werd verbroken met de foutmelding:
MQTT-verbinding verloren (8): AMQJS0008I Socket gesloten.
Hier is wat ik zie als VerneMQ debug output:
"12:13:33.630 [error] kan geen auth publish [<>,{"...",<>},0,[<>],<>,false] wegens niet_geautoriseerd"
Dit bracht me aanvankelijk in verwarring. Ik was aan het controleren op het "juiste" (javascript client) mountpoint, dacht ik?
En, mijn webhook voor auth_on_publish werd nooit aangeroepen?
Het blijkt, dat ik vergat te bedenken dat het nieuwe mountpoint al was ingesteld! En dit nieuwe koppelpunt is niet een virtuele constructie, maar het eigenlijke nieuwe mountpoint - alle verzoeken van deze client zullen dat nieuwe mountpoint dragen!
Daarom: zorg ervoor dat in je Lua functie auth_on_publish(pub) je bent aan het controleren op het nieuwe mountpoint, alvorens door te geven aan de volgende handler (webhook).