计算方式: keepalive * 1.5 到 keepalive * 1.5 + 30
如果客户端设置180s, 检测到设备断开链接应该是 4分半 到 5分钟,而现在这个时间是乱的, 文档也没看到这块介绍, 麻烦解答一下
计算方式: keepalive * 1.5 到 keepalive * 1.5 + 30
如果客户端设置180s, 检测到设备断开链接应该是 4分半 到 5分钟,而现在这个时间是乱的, 文档也没看到这块介绍, 麻烦解答一下
之前使用5.4.1不行, 后面5.7.2版本说这块修复了, 然后测试了也不行, 目前使用5.8.7版本, 心跳检测还是不行
点保活检查间隔的那个问题,我觉得应该说得蛮清晰的。
你要非常精确也行的,你把保活检查间隔设置为 1 秒。多用点 cpu
我的意思不是要精确, 理论上客户端keepalive设置180s, 断电后, 应该在4分半到5分钟检测到离线, 但是现在, 我这边测试, 有的时候2分多,有的时候3分多, 我都懵逼了
keepalive * 1.5 到 keepalive * 1.5 + 30 这个计算方式没有问题吧
没问题,可以提供一下 emqx 的 debug 日志么
明白你的意思了, 那我要重新搭建一套环境, 目前开发环境没法看, 我先搭建一套干净环境看看,晚点再找您, 是不是看mqtt心跳包那块
2025-08-27T05:53:54.042692+00:00 [debug] tag: SOCKET, clientid: lazzen_mixed_lMCOBjEsVhfr0iejT7jj.a1lO3aap0Kc|securemode=3,signmethod=hmacsha256,timestamp=17328681854
95|, msg: emqx_connection_terminated, peername: 192.168.65.1:32884, username: lMCOBjEsVhfr0iejT7jj&a1lO3aap0Kc, reason: {shutdown,tcp_closed}
2025-08-27T05:53:54.043527+00:00 [info] clientid: lazzen_mixed_lMCOBjEsr0iejT7jj.a1lO3aap0Kc|securemode=3,signmethod=hmacsha256,timestamp=1732868185495|, msg: term
inate, peername: 192.168.65.1:32884, username: lMCOBjEsVhfr0iejT7jj&a1lO3aap0Kc, reason: {shutdown,tcp_closed}
2025-08-27T05:53:54.044146+00:00 [debug] msg: emqx_cm_clean_down, client_id: <<"lazzex_lMCOBjEsfr0iejT7jj.a1lO3aap0Kc|securemode=3,signmethod=hmacsha256,times
tamp=1732868185495|">>
断电后, 出现这种日志, 2分钟左右就掉了
这个是对端主动断开了tcp链接,和keepalive没关系的,如果是keepalive检测有问题了,断开原因是kerpalive_timeout,不是TCP closed。
说明你的设备断电了一会,tcp也断开了,如果你要测keepalive,就直接让设备不要发送ping,只保持tcp,等一会就有keepalive timeiut了
我这边情况是这样, 有个设备连接着emqx, 然后我吧设备断电,然后测试emqx多久能感知。
然后, 我上面两次操作都是一样, 结果给我的断开结果不一样
我在多测试一下, 可能我操作问题, 先帮我解决主要问题, 检测时间不准的问题, 上面两次都是2分钟左右断开的
tcp_closed 这种情况时间不可控吗? 难道mqtt的心跳 和 tcp的心跳 都有的吗?
我们这边需求很简单, 就是设备断电后, 给个具体时间范围检测到离线, 不是一个不可控的时间区间
都有。
你可以调一个 tcp 的各种参数,问问 AI,这个不是 emqx 能控制的。
和 keepalive 为 none 也有一定的关系,文中的为 none 就是禁用 keepalive,应该是不准确,为 none 应该是不通过 emqx 来设置 tcp 的 keepalive(尊重操作系统的 tcp 参数设置),而且除了设置 emqx 服务器侧的 tcp 参数外,还需要同时调整设备的 tcp 参数才对。
这样计算不对吧, 你这是基于最后一次心跳包计算的, 如果在心跳途中后者临界的位置设备断电, 那时间不是不准了吗?
用脑子问问题,emqx怎么可能知道你断电,只能通过最后一个mqtt包
那你们还给出keepalive * 1.5 到 keepavlive * 1.5 + 30, 这不是误导吗? 实际离线不是1分半 到 5 分钟之间吗