我一直在使用SIM5320研究MQTT协议。我熟悉AT命令文档,并且使用Arduino可以正常工作。

首先,我使用AT + NETOPEN打开一个网络套接字,然后使用AT + CIPOPEN = 0打开一个TCP连接, “ TCP”,“ ip地址”,端口。然后,我使用成功执行的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分钟内发生的情况。没有警报或任何迹象表明有任何问题,因此我感到非常困惑。

我最初是在电气工程堆栈交换中提出这个问题的,但建议在这里也提出这个问题。

我已将我在此处编写的代码附加给任何想看的人,并且不需要运行任何库。

评论

查看MQTT保持活动间隔,似乎最可能的原因是传输连接在通信堆栈中的某个点被断开。发送数据应保持MQTT通讯正常,如果代理未发送其他任何信息,则代理应将ping发送回去。如果没有活动,调制解调器是否可以进入睡眠状态?一个问题是您是否可以在没有其他流量的情况下每10分钟发送一次ping消息以及如何发生。

如果我在连接断开之前发送ping请求,则连接保持活动状态。但是,与每18小时发送一次ping请求相比,每10分钟发送一次ping请求更麻烦。如果可能的话,我只希望每小时发送一次请求。

您为客户使用什么语言和MQTT库?请使用此信息更新您发布的问题。

OP正在使用3G模块,该模块基于通过UART链接发送到模块的AT命令发送TCP / IP数据包。这里根本没有涉及Linux。 OP基本上是在编写自己的MQTT客户端。

@hardillb好的,可以使事情澄清一些。因此,如果OP正在从头开始编写自己的MQTT客户端,则工作似乎应该遵循MQTT规范,其中包括必要的MQTT Keep Alive ping。

#1 楼

默认的TCP / IP超时为15分钟,即使在同步/确认对中,您也必须在此间隔内发送一些内容以保持基础TCP连接保持活动。

MQTT keepalive与何时执行触发最后遗嘱和遗嘱消息。

评论


MQTT keepalive与何时决定关闭可能是死连接或到死代理(客户端或代理)的实时连接的时间有关。反过来,这会触发《最后的遗嘱》。 Keepalive不是要触发“遗愿和遗嘱”,而是要确定某个连接是否已死亡,将其关闭,并作为关闭连接的一部分来触发“遗嘱和遗嘱”。

–理查德·钱伯斯(Richard Chambers)
18年1月2日,14:50



您能否提供有关您所指的TCP / IP超时的更多详细信息?我假设您是在谈论未确认的传输超时,这似乎不适用于发布的问题,但不确定。根据man7.org/linux/man-pages/man7/tcp.7.html,有tcp_keepalive_time()的默认值为7200秒,如果设置了SO_KEEPALIVE套接字选项,则将发送保持活动状态,否则将终止连接。

–理查德·钱伯斯(Richard Chambers)
18年1月2日在15:18



这似乎是造成此问题的原因,能否请您增加引用并提出一种可能的方法来增加SIM5320的间隔时间?

– Boris Deletic
18年1月3日在21:19

我们看到与MQTT设置非常相似的东西-TCP似乎断开了连接,但是MQTT客户端/代理不知道。闲置约30分钟后,当我们发布时,未从代理收到PUBACK,但就代理而言,也未发生断开连接。

–史蒂夫·玛格尼斯(Steve Magness)
20-3-31在23:05