SIM5320 MQTT TCP 连接在一段时间后意外关闭

物联网 MQTT 联网
2021-06-05 01:39:19

我一直在研究使用 SIM5320 的 MQTT 协议。我熟悉 AT 命令文档,并且有一个使用 Arduino 的工作实现。

首先我用AT+NETOPEN打开一个网络socket,然后用AT+CIPOPEN=0,"TCP","ip address",port打开一个TCP连接。然后我使用 AT+CIPSEND 为 MQTT 协议传输数据,该协议成功执行。如果我通过 MQTT 向 SIM 模块发送数据,它也会被接收并检测到消息。

使用 MQTT,有一个 Keep-Alive 间隔,它指定服务器将在通信之间保持连接打开的时间,基本上是客户端在与服务器强制断开连接之前可以空闲多长时间。但是,我已将此值设置为最大 18 小时,这远长于约 15 分钟的断开连接。

我的问题在大约 15 分钟后出现,当我尝试向服务器发送命令时,没有给出任何响应。SIM 没有发出“+IPCLOSE: 0,4”,这通常发生在服务器强行断开客户端或任何其他类型的指示符时。

此外,我仍然能够发送数据,而且 CIP 连接似乎仍然打开,如“AT+CIPOPEN?”所示。当我尝试使用“AT+CIPCLOSE=0”关闭连接时,我收到“+CIPCLOSE: 0,4”和“ERROR”。文档中没有提到“+CIPCLOSE: 0,4”是什么意思,但是它似乎没有关闭连接,因为它无法打开或使用。

我真的很想知道在这 15 分钟内发生了什么,从建立连接到发送数据,再到尝试再次发送数据。没有任何警报或任何出现问题的迹象,所以我很困惑。

我最初在电气工程堆栈交换上问了这个问题,但有人建议我也在这里这个问题

我已经附上了我在此处编写的代码供任何想要查看的人使用,并且不需要任何库来运行它。

2个回答

默认 TCP/IP 超时为 15 分钟,您必须在此间隔内发送一些内容以保持底层 TCP 连接处于活动状态,即使它只是一个同步/确认对。

MQTT keepalive 与何时触发 Last Will 和 Testement 消息有关。

尝试在少于 15 分钟的时间内启用 TCP 保持连接,您应该能够从您的服务器和/或您的设备 (SIM5320) 启用 TCP 保持连接,启用任何一个都可以解决您的问题。

在 SIM5320 中,您可以使用AT+CTCPKA启用 TCP 保持活动。

在您的服务器中,启用 socket.SO_KEEPALIVE

这对 TCP 用户(您)是透明的,因此它不应干扰您的应用程序,而不是已接受的答案。