使用 Modbus 的 GPRS 上的 TCP-IP

TCP-IP over GPRS with Modbus

我正在从事一个涉及 GSM/GPRS 模块的项目,该模块的作用是使用 TCP-IP 和 Modbus 协议通过互联网将客户端与某些设备连接起来。现在正在研究TCP连接方案

据我了解,如果一段时间内没有任何流量,GSM 网络会自动关闭 TCP 连接。

我想尽可能可靠地检测和维护 TCP 连接。也检测半开连接。

连接过程如下:我的GSM模块作为服务器,在502端口打开socket等待客户端读取数据。客户端可以3分钟或更长时间周期性读取数据。

当客户端连接到我的模块时,它请求一些数据,模块发送请求的数据并等待其他请求,并保持连接打开。

现在,如果连接因其他原因(由于电源故障、GSM 网络等)而中断,客户端需要能够再次连接到模块。该模块必须检测断开的连接并且必须采取行动以便客户端可以再次重新连接

为了检测断开的连接,模块会定期向客户端发送一些虚拟数据,并检查客户端是否收到了该数据。如果没有,必须重新建立tcp连接。

问题是:如何解释这个"re-establishment"的连接?

  1. 是不是要关闭当前的TCP连接,重新打开一个,意思是重新监听502端口?

  2. 我是否应该关闭当前的 TCP 连接并尝试连接到上次有效 TCP 连接提供的客户端端口和 IP?

关键是模块必须尽快可用以响应客户的请求;这就是为什么我需要 TCP 连接尽快起作用的原因。

PS。该模块仅支持 AT 命令(Quectel M95 模块),因此我无权访问 TCP 堆栈的所有功能。 谢谢你。 (我是 TCP 堆栈的新手,所以我可能使用了含义不正确的技术术语)

The question is: how to interpret this "re-establishment" of the connection?

理想情况下,客户端应该关心与服务器的连接。客户来来去去。服务器应继续 listen 端口。

Should I close the current TCP connection, and open a new one, meaning listening to port 502 again?

没有。服务器应仅确定连接已消失并单独关闭该连接的套接字。无需再试听。一开始做的 listen 应该还是可以的。

Should I close the current TCP connection and trying to connect to the port and ip of the client as provided from the last valid TCP connection?

服务器将最不关心客户端端口。它无法连接 到客户端。相反,客户端应该 re-connect 到服务器。

所以客户端内置了智能来查找断开的连接并re-establish与服务器的连接。

你可以考虑实现 TCP KEEP_ALIVE 请求和响应,如果另一端支持的话。

由于 TCP 期望应用程序处理这些,应用程序必须跟踪套接字状态并适当地关闭它们,即在超时时...

需要时打开连接。