使用Modbus的GPRS-TCP over IP

时间:2017-02-20 07:58:45

标签: tcp keep-alive modbus

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

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

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

连接过程如下:我的GSM模块充当服务器,因此它在端口502上打开一个套接字并等待客户端读取数据。客户端可以在3分钟或更长时间内定期读取数据。

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

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

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

问题是:如何解释这个"重建"连接?

  1. 我应该关闭当前的TCP连接,并打开一个新连接,这意味着再次收听端口502吗?

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

  3. 重点是模块必须尽快可用以回答客户的请求;这就是为什么我需要TCP连接尽快运行的原因。

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

2 个答案:

答案 0 :(得分:1)

  

问题是:如何解释这种连接的“重建”?

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

  

我应该关闭当前的TCP连接,并打开一个新连接,这意味着再次收听端口502吗?

没有。服务器应确定连接已断开并单独关闭该连接的套接字。无需再试一次。开头做的listen应该仍然保持良好状态。

  

我应该关闭当前的TCP连接并尝试连接到上一个有效TCP连接提供的客户端的端口和IP吗?

服务器最不关心客户端端口。 无法连接到客户端。而是客户端应该重新连接到服务器。

所以在客户端内置智能以找到断开的连接并重新建立与服务器的连接。

答案 1 :(得分:0)

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

由于TCP希望应用程序能够处理这些情况,因此应用程序必须跟踪套接字状态并适当地关闭它们,即在超时时关闭它们。

在需要时打开连接。