He estado trabajando en un protocolo MQTT usando el SIM5320. Estoy familiarizado con la documentación del comando AT y tengo una implementación funcional con un Arduino.
Primero, abro un socket de red con AT + NETOPEN, luego abro una conexión TCP con AT + CIPOPEN = 0, "TCP", "dirección IP", puerto. Luego transmito datos para el protocolo MQTT usando AT + CIPSEND, que se ejecuta con éxito. Si envío datos al módulo SIM a través de MQTT, también se reciben y se detecta el mensaje.
Con MQTT, hay un intervalo Keep-Alive que especifica cuánto tiempo el servidor mantendrá una conexión abierta entre comunicaciones, básicamente cuánto tiempo puede estar inactivo el cliente antes de ser desconectado por la fuerza del servidor. Sin embargo, he establecido este valor en el máximo de 18 horas, que es mucho más largo que las desconexiones de ~ 15 minutos.
Mi problema surge después de ~ 15 minutos, cuando intento enviar un comando al servidor, y no recibo respuesta. La SIM no ha emitido un "+ IPCLOSE: 0,4", que generalmente ocurre cuando el servidor desconecta por la fuerza al cliente o cualquier otro tipo de indicador.
Además, todavía puedo enviar datos y parece que la conexión CIP todavía está abierta, como lo indica "AT + CIPOPEN?". Cuando intento cerrar la conexión con "AT + CIPCLOSE = 0", recibo "+ CIPCLOSE: 0,4" y "ERROR". No se menciona lo que significa "+ CIPCLOSE: 0,4" en la documentación, sin embargo, no parece cerrar la conexión, ya que no se puede abrir ni utilizar.
Realmente me encantaría saber qué está sucediendo en estos 15 minutos, entre establecer una conexión y enviar datos, hasta intentar enviarlos nuevamente. No hay ninguna alerta o indicación de que algo salga mal, así que estoy seriamente confundido.
Inicialmente hice esta pregunta sobre el intercambio de pila de Ingeniería Eléctrica, pero me aconsejaron que también la hiciera aquí.
He adjuntado el código que escribí aquí para cualquiera que quiera echar un vistazo, y no hay ninguna biblioteca que necesite para ejecutarlo.
fuente
Respuestas:
El tiempo de espera predeterminado de TCP / IP es de 15 minutos, debe enviar algo dentro de este intervalo para mantener viva la conexión TCP subyacente, incluso si es solo un par de sincronización / confirmación.
El keepalive de MQTT tiene que ver con cuándo activar los mensajes Last Will y Testement.
fuente
tcp_keepalive_time()
un valor predeterminado de 7200 segundos después del cual se envían los mensajes vivos si laSO_KEEPALIVE
opción de socket está configurada. De lo contrario, la conexión se termina.