Eu tenho trabalhado em um protocolo MQTT usando o SIM5320. Eu estou familiarizado com a documentação do comando AT e tenho uma implementação funcional com um Arduino.
Primeiramente, abro um soquete de rede com AT + NETOPEN e, em seguida, abro uma conexão TCP com AT + CIPOPEN = 0, "TCP", "endereço IP", porta. Em seguida, transmito dados para o protocolo MQTT usando AT + CIPSEND, que é executado com sucesso. Se eu enviar dados para o módulo SIM através do MQTT, eles também serão recebidos e a mensagem será detectada.
Com o MQTT, há um intervalo Keep-Alive que especifica por quanto tempo o servidor manterá uma conexão aberta entre a comunicação, basicamente por quanto tempo o cliente pode ficar ocioso antes de ser desconectado à força do servidor. No entanto, eu configurei esse valor para o máximo de 18 horas, que é muito mais longo que as desconexões de ~ 15 minutos.
Meu problema surge após ~ 15 minutos, quando tento enviar um comando para o servidor e nenhuma resposta é dada. O SIM não emitiu um "+ IPCLOSE: 0,4", que geralmente ocorre quando o servidor desconecta à força o cliente ou qualquer outro tipo de indicador.
Além disso, ainda posso enviar dados e parece que a conexão CIP ainda está aberta, conforme indicado por "AT + CIPOPEN?". Quando tento fechar a conexão com "AT + CIPCLOSE = 0", recebo "+ CIPCLOSE: 0,4" e "ERRO". Não há menção do que "+ CIPCLOSE: 0,4" significa na documentação, no entanto, parece não fechar a conexão, pois não pode ser aberta ou usada.
Eu realmente adoraria saber o que está acontecendo nesses 15 minutos, entre estabelecer uma conexão e enviar dados, para tentar enviar dados novamente. Não há alerta ou indicação de que algo esteja errado, então estou seriamente confuso.
Inicialmente, fiz essa pergunta na troca de pilhas de engenharia elétrica, mas fui aconselhada a fazer aqui também.
Anexei o código que escrevi aqui para quem gostaria de dar uma olhada e não há bibliotecas necessárias para executá-lo.
fonte
Respostas:
O tempo limite padrão do TCP / IP é de 15 minutos. Você deve enviar algo dentro desse intervalo para manter a conexão TCP subjacente ativa, mesmo que seja apenas um par de sincronização / confirmação.
O keepalive do MQTT refere-se a quando acionar as mensagens Last Will e Testement.
fonte
tcp_keepalive_time()
um valor padrão de 7200 segundos, após o qual keep alives são enviados se aSO_KEEPALIVE
opção socket estiver configurada. Caso contrário, a conexão será encerrada.