VerneMQ Connessione MQTT persa (8): AMQJS0008I Socket chiuso. punti di montaggio diversi
Nella mia configurazione, sto riscrivendo i punti di montaggio dei client da quelli impostati dagli ascoltatori a punti di montaggio individuali a seconda del gruppo di client.
L'idea alla base di questo è il perfetto isolamento della multi-tenancy sul server. I singoli client di gruppi diversi non sono quindi in grado di vedersi l'un l'altro, anche quando si iscrivono a "#" (tutto).
Nel mio webhook auth_on_register sto controllando se il client che cerca di registrarsi proviene dal web (come parte dell'interfaccia utente di picockpit) o dal client Raspberry Pi. A questo punto il punto di montaggio è ancora determinato dall'ascoltatore, poiché non è stato ancora riscritto.
Nel webhook (in Crystal) ho imposta il nuovo punto di montaggio, come questo:
res = %({"risultato": "ok", "modificatori": {"mountpoint": "#{mountpoint}", "client_id": "#{clientid}"}})
Oggi stavo debuggando perché il client JS non poteva pubblicare alcun messaggio. Si disconnetteva con l'errore:
Connessione MQTT persa (8): AMQJS0008I Presa chiusa.
Ecco cosa vedo come output di debug di VerneMQ:
"12:13:33.630 [error] can't auth publish [<>,{"...",<>},0,[<>],<>,false] due to not_authorized"
Questo mi ha lasciato inizialmente perplesso. Stavo controllando il punto di montaggio "corretto" (client javascript), pensavo?
E il mio webhook per auth_on_publish non è mai stato chiamato?
Si è scoperto, che ho dimenticato di considerare che il nuovo punto di montaggio era già impostato! E questo nuovo punto di montaggio è non un qualche costrutto virtuale, ma il nuovo punto di montaggio effettivo - qualsiasi richiesta da questo cliente porterà quel nuovo punto di montaggio!
Quindi: assicuratevi che nella vostra funzione Lua auth_on_publish(pub) state controllando il nuovo punto di montaggioprima di passare al gestore successivo (webhook).