sockets - GSM 调制解调器:一段时间不活动后的套接字错误
问题描述
我们的外围设备必须与 MQTT 代理保持连接并等待接收发布并立即对其做出反应。
使用WiFi连接,目标就达到了。
使用 GSM 调制解调器 GL865 Telit,设置 MQTT PING = 30 分钟(因为我们想尽可能多地省钱)我们有这样的重复情况:
- 在外围设备上,TCP 套接字的状态是“在线”
- 大约 20 分钟后,我们写了一个外设订阅的主题
- 代理发现套接字“出错”并断开连接
- 但外围设备不知道或接收到任何套接字错误的指示
- 外设等待,直到达到 PING 时间
- 然后尝试 PING 但最终检测到 TCP 套接字错误并继续重新连接
如果我们使用 1 分钟的 PING,问题就不会发生,因为根本没有足够的时间让它发生。
我们认为问题与电话供应商有关,尤其是少数几个。只需更换 SIM 卡,少数供应商就会出现比其他供应商更多的问题。
有人遇到同样的问题吗?
解决方案
如果我没记错的话,GL865 的套接字超时默认为 120 秒。如果没有数据或套接字未更新,则套接字将解除绑定,您的代码将找出您遇到的困难方式。我认为您可以将其提高到 5 分钟,但您的 CSP 也会有某种“陈旧连接”超时。无论哪种方式,30 分钟对于 GSM 连接来说都太长了。
附带说明:GSM IoT 设备通常用于发送数据,而不是接收和处理数据……至少在我的经验中不是使用 MQTT。它非常适合从距离 Wifi 或 LoRA 太远的传感器发送数据,但正如您所发现的,它不善于保持连接以接收传入数据。对于这些用例,我几乎总是使用轮询/队列安排来唤醒设备,轮询任何传入消息,然后断开连接。如果您在发布时设置了 RETAIN 标志并且发布的数据包数量相对较低,则可以使用 MQTT 完成此操作。
推荐阅读
- pointers - 在指针接收器上调用 Elem() 方法以进行结构反射的必要性
- reactjs - React Router Dom,基于URL更新组件失败
- hl7-fhir - HAPI FHIR R4:ReferenceParam 上的修饰符
- javascript - 如何将外部 js 代码嵌入到 React 组件中
- excel - Mac 中的 MSXML2.DOMDocument 等效项
- docker - 如何从本地镜像生成 Docker 摘要
- mysql - 将插入 mysql 的记录限制为准确的 9 个数字
- fortran - 顺序并行 MPI 算法:如何使用 MPI 实现这种行为?
- javascript - 将变量分配给数组中的值
- php - centos - 无法删除 nginx 和 php-fpm