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).