Bem, ultimamente tenho trabalhado em um projeto de IoT baseado na comunicação mqtt. Resumidamente o projeto é composto por uma placa esp32 ( onde estão acoplados sensores e relês) um broker mqtt (nesse caso o mosquitto) e um aplicativo para recebimento e envio das informações (node-red). Acredito que minha dúvida é algo bem específico, mas se algém souber de algo, qualquer ajuda é bem vinda.
Vamos lá. Existem dois caminhos no fluxo de informações: um de ida e um de volta (com relação ao esp32). Quando a informação de um sensor é lida ela é enviada até o broker mosquitto atraves de uma publish feita pelo esp32 e desse broker a mensagem vai para o app, onde é representada graficamente, é o caminho de ida. Nesse caso não há problemas, as informações são mostradas no app quase que instantaneamente. O problema está no caminho de volta.
Quando decido ativar um relé na placa, o app envia uma informação para o broker e esta é enviada para a placa. De certa froma o esp32 solicita um subscribe ao broker e este disponibiliza a informação através de um publish. O problema nesse caso está no tempo de chegada das informações: demoram dezenas de segundos e até mesmo minutos para que elas cheguem a placa, ou seja, o relé só é ativado depois de muito tempo.
Estou usando a biblioteca pubsubclient.h, a mais comum para esse tipo de comunicação.
Se alguém já trabalhou com essas tecnologias, principalmente com brokers e puder me ajudar agradeço. Desculpem se não ficou claro ou qualquer outro inconveninete.
@john, essa latência depende de muitos fatores que vão desde sua conectividade local passando pelo tráfego de internet até o servidor broker.
MQTT tem dessas. Monitorar em “real time” é bastante complicado. Minimize o tempo de resposta do lado do ESP via código, já é um ponto legal.
Não sei qual server MQTT está usando e sei que no mosquitto tem uma flag de qos (quality of service) mas nunca usei ou configurei no mesmo e não terei como ajuda-lo nisso. Tente ver na documentação da API do broker se existe essa possibilidade.
O que eu posso afirmar é que eu implementei um servidor mosquitto (https://mosquitto.org/) num servidor virtual Linux Centos 7 em um provedor nacional e a latência era da ordem de milisegundos. Dava um comando lá no servidor via terminal e o led aqui na bancada acendia quase que imediatamente na protoboard, via WiFi nativo do ESP8266, sem muito cuidado. O mesmo via celular. Sem ter problemas nesse sentido, ou seja, duas redes diferentes com o resultado muito próximo (não deu pra ver ou medir o tempo).
Uma coisa importante é onde está localizado o servidor node-red. Se internacional, toma-lhe latência.
De resto boa sorte e espero que consiga resolver esse problema de latência.
Bem, não trabalhei mais nesse problema em específico, mas pretendo testar algumas possibilidades sugeridas assim que possível, como o Qos.
Talvez eu não tenho citado ou não tenha sido claro, mas tudo é executado e conectado em rede local: broker, node red e esp32. Em virtude disso que não acho normal nem aceitável a latência. E como eu disse, a leitura dos sensores é quase em “real time” (são milisegundo de latência). O problema é quando o esp32 solicita subcribes para ativação dos relés, nesses casos a demora se torna excessiva sendo dezenas de vezes superior a leitura dos sensores. Isso engloba até a conexão: quando o esp32 desconecta do broker por algum motivo, a mensagem de desconexão leva o mesmo tempo das mensagens dos relés pra chegar a placa, o que cria um espaço de tempo sem fluxo real de infromações.
Tenho fé que seja algo simples e de fácil resolução. Continuarei tentando.
Achei muito estranho essa latencia dentro de uma rede local. Como eu disse eu conseguia acionar um dispositivo remoto quase que instantaneamente via internet, ou seja, sem problema.
Pode ser um problema de roteamento da rede interna, tente usar um programa como WireShark para avaliar o tráfego porque fica mais fácil de detectar problemas desse tipo.
Outra coisa. Você configurou MDNS no ESP?
Já tive problema de latência no ESP32 devido a uma biblioteca UDP que usei e verifique isto também.
No mais poste os resultados dos seus testes e se precisar grite.
Consegui resolver o problema e já finalizei meu protótipo com sucesso.
Eram problemas na programação do ESP32, uma má estruturação das funções da biblioteca “pubsubclient.h”.
Agora está tudo funcionando como eu queria. Mensagens recebidas e enviadas rapidamente, quase sem latência. Além disso não ocorreu nenhuma desconexão depois da mudança na programação.
Foquei tanto em outras partes do projeto que não percebi que o problema estava na frente de meu nariz, haha!