lian
1
环境
- EMQX 版本:emqx-5.0.21-windows-amd64
- 操作系统版本:windows
重现此问题的步骤
- 客户端每隔固定10s发送一包私有协议心跳包到emqx,服务器通过emqx应答私有协议心跳包。
- 长期运行一段时间后,通过wireshark抓包看,emqx主动发起了FIN包,导致设备和服务器的连接断开,发起FIN包前后设备和服务器都可以每隔10s正常通信。
- 客户设置的ping心跳时间是40s
- 服务器的ip地址是115.236.86.166
awa.zip (173.3 KB)
想了解emqx在什么情况下会主动发起FIN包给设备呢?附件是通过wireshark抓取的网络数据。
看抓包,确实是 166 主动发的 FIN。但具体原因还看不出来。这种一般来说应该是有错误日志的,方便开下这个客户端的日志追踪看看么?
lian
3
你好,我基于C语言开发,想请教一下有没有和emqx适配度高的mqtt客户端开源代码?客户端接收到FIN包之前都可以正常发送接收数据,客户端接收到FIN包后,发送数据会失败;接着会尝试重新连接,重新订阅主题成功后,发送ping包,重新连接服务器,但是会出现一直连接不成功,客户端设置了40s的ping心跳时间,服务器端emqx每隔40s发送一个FIN包给客户端
标准的 MQTT SDK 都行的(一般听说 paho C 的sdk 用的比较多)
这个 FIN 包导致链接断开的问题,建议是通过这个 日志追踪 (Trace) | EMQX文档
开启对这个 C 客户的客户端ID的日志追踪。这样就能看到过程中所有的 DEBUG 日志。就能分析为什么断开了
你确定你的C语言客户端,在空闲时间里,每隔40s向服务器发送 一个PINGREQ 包?
否则, 服务器端 close这个链接是正常的,因为 timeout。
这个可以在后台监控一下server 的log file, 看看是不是按时收到客户端的PINGREQ包,就知道了。
lian
6
客户端是每隔10s发送一包数据,emqx也有正常应答,在emqx发送FIN包之前,还正常应答了客户端,并没有超过40s,详细看下抓包文件。我也怀疑是触发了 emqx的PINGREQ 包的timeout。
比如客户端设置了keepalive为40s, emqx是怎么统计PINGREG包的时长呢?是不是固定10s收到客户端的数据,就会统计清零重新计算PINGREG包的时长呢?