Perda de ligação VerneMQ MQTT (8): AMQJS0008I Tomada fechada. diferentes pontos de montagem
Na minha configuração, estou reescrevendo os pontos de montagem dos clientes a partir dos estabelecidos pelos ouvintes para pontos de montagem individuais, dependendo do grupo de clientes.
A idéia por trás disso é o isolamento perfeito do multi-tenancy no servidor. Assim, clientes individuais de diferentes grupos não são capazes de se verem uns aos outros, mesmo ao subscrever o "#" (tudo).
No meu auth_on_register webhook eu estou verificando se o cliente que está tentando registrar está vindo da web (como parte da interface do usuário do picockpit) ou do cliente Raspberry Pi. Neste ponto o ponto de montagem ainda é determinado pelo ouvinte, uma vez que ainda não foi reescrito.
No gancho da web (em Cristal) I definir o novo ponto de montagem...assim:
res = %({"resultado": "ok", "modificadores": {"ponto de montagem": "#{ponto de montagem}", "client_id": "#{clientid}"}}})
Hoje eu estava depurando porque o cliente JS não podia publicar nenhuma mensagem. Estava a desligar com o erro:
Perda de conexão MQTT (8): AMQJS0008I Tomada fechada.
Aqui está o que eu vejo como saída de depuração VerneMQ:
"12:13:33.630 [erro] não pode publicar [<<>,{"...",<>},0,[<>],<>,falso] devido a não_autorizado"
Isto deixou-me inicialmente perplexo. Eu estava a verificar o ponto de montagem "correcto" (cliente javascript), pensei?
E, o meu gancho para auth_on_publish nunca foi chamado?
Acontece que sim, que eu me esqueci de considerar que o novo ponto de montagem já estava definido.! E este novo ponto de montagem é não alguma construção virtual, mas o novo ponto de montagem real - quaisquer pedidos deste cliente vão levar esse novo ponto de montagem!
Portanto: certifique-se de que na sua função Lua auth_on_publish(pub) você está verificando o novo ponto de montagemantes de passar para o próximo manipulador (webhook).