在 MQTT 协议和 EMQX 的默认设置中,Keep Alive(心跳间隔) 的数值取决于客户端的设置,但服务端(EMQX)也有相应的默认保护机制:
1. 客户端默认值
-
标准默认值 :大多数 MQTT 客户端库(如 Paho, MQTT.js, Mosquitto)通常将默认 Keep Alive 设置为 60 秒。
-
协议要求 :Keep Alive 是由客户端在
CONNECT报文中指定的。如果设置为0,则表示禁用心跳机制,连接将永远不会因为不活跃而被服务端断开。
2. EMQX 服务端配置
EMQX 允许通过配置文件(emqx.conf)来规范或强制修改客户端的行为,防止客户端设置不合理的参数:
-
最大 Keep Alive(Max Keep Alive):
默认通常为 不限制。但你可以配置一个上限,如果客户端请求的时间超过此值,EMQX 会强制将其降低。
-
心跳后退系数(Backoff Multier):
EMQX 默认遵循协议标准,采用 1.5 倍 的宽限期。
公式:超时时间 = \\text{Keep Alive} \\times 1.5
例如:如果客户端设置 Keep Alive 为 60s,EMQX 会在 90s 内没有收到任何包时才判定为掉线。
3. 如何选择合适的时间?
设置 Keep Alive 需要在实时性 和资源消耗之间平衡:
注意事项:TCP Keep-Alive vs MQTT Keep-Alive
很多人会混淆这两者:
-
MQTT Keep-Alive (应用层):由 EMQX 进程维护,通过
PINGREQ包实现,推荐使用。 -
TCP Keep-Alive(传输层):由操作系统内核维护。EMQX 默认也启用了 TCP Keep-Alive(通常是 2 小时后才开始探测),它更多是作为网络底层的最后一道防线。
配置建议: 如果你发现设备明明断电了,但 EMQX 后台还显示"在线",通常是因为 Keep Alive 设置得太长 或者是由于 网络中间件(如防火墙)拦截了断开信号,此时缩短 Keep Alive 时间是最有效的办法。