sábado, 1 de setembro de 2018

ESP8266 - Resolvendo problema de queda de comunicação MQTT usando biblioteca PubSubClient

Há algumas semanas, publiquei a conclusão de uma etapa do meu projeto pessoal de supervisão de temperatura/umidade e energia do meu apartamento (veja aqui)

Como havia comentado, tive problemas com quedas do MQTT seguidas de falhas de reconexão. Inicialmente estava imaginando que o problema era queda com link WiFi, mas após alguns testes notei que sempre que o ESP perdia sinal do WiFi, a reconexão ocorria com sucesso (independente do tempo da perda).


Apartir de então, comecei a pesquisar possíveis causas para o problema. Encontrei alguns problemas parecidos:


Em resumo, algumas fontes diziam que alguns Brokers MQTT derrubam propositalmente um ID após 24h, outras diziam ser a versão de firmware que estava rodando o ESP8266 e outras diziam que havia problema na biblioteca PubSubClient do MQTT.

Com o objetivo de descartar o problema de desconexão por desconexão automática após 24h, fiz a primeira alteração no software. Programei o ESP para se desconectar e reconectar de forma cíclica, sempre alterando o ID de forma randômica. Em paralelo verifiquei as configurações do Mosquitto e não encontrei nenhum parâmetro ao qual se referia a tempo máximo de conexão.

Então, como imaginado, mesmo com esta alteração o resultado não foi satisfatório.

Como segunda opção, parti para readequação na biblioteca PubSubClient. Aliada a novas tratativas de reconexão em meu software, as readequações listadas abaixo surtiram efeito e desde então, não houve mais problema.

Sendo assim, se você está usando a lib PubSubClient do MQTT e está enfrentando problemas, sugiro realizar as seguintes readequações.

Adicionar a instrução yield(); na linha 212 do arquivo "PubSubClient.cpp".



Adicionar um delay de 10ms, no função de loop da biblioteca. Isso também deve ser feio no "PubSubClient.cpp", como indicado abaixo.



Ainda sobre as possíveis causas, alterei as versões do ESP8266 de 2.3.0, para 2.4.0 e 2.4.2 (estou usando a mais atual) e independente da versão o comportamento foi semelhante.

Faça então bom uso da biblioteca PubSubClient e não se esqueça destas pequenas readequações!

Luis Fernando