UrsPahoMqttClient 心跳问题解决指南
——Paho 底层已自动处理,设好 KeepAlive 就行
问题
用 UrsPahoMqttClient 做 MQTT 连接时,心跳 PingReq 报文怎么发送?目的是保持连接,防止被 Broker 踢下线。
结论
不需要手动发心跳,Paho 底层已内置实现。
UrsPahoMqttClient 封装的是 Eclipse Paho MQTT 客户端,心跳(PingReq)已经被 Paho 的CommsSender线程自动管理了。你只需要在 Connect 时传一个keepAliveSeconds参数就行。
Connect 积木块:
Connect(brokerAddress, clientId, username, password, keepAliveSeconds)keepAliveSeconds 设多少?
- 推荐设30-60 秒
- 设60 秒→ Paho 每隔30 秒自动发一次 PingReq
- 设30 秒→ 每隔15 秒发一次
- 设太小费流量,设太大可能被 Broker 踢掉
- 推荐直接用 60 秒,省心又稳
防止掉线的几个要点
- Connect 时传 keepAliveSeconds=60
- 监听 Disconnected 事件,断开自动重连
当 UrsPahoMqttClient1.Disconnected 调用 UrsPahoMqttClient1.Connect(...)- WiFi 热点 / 4G / 企业防火墙环境:NAT 超时可能额外导致掉线,可加一个应用层定时器每 30 秒检查连接状态。
FAQ
Q:设置了 KeepAlive 还是掉线?
看看 Broker 是不是强制了更短的 KeepAlive 上限。有些公共 Broker(如 test.mosquitto.org)最大只允许 60 秒。另外重连太频繁也可能被限流,断开后建议等 3 秒再重连。
Q:底层怎么发的?想反编译看源码
aix 文件解压后有 classes.dex,用 jadx 反编译就能看。不过既然 Paho 已经封装好了,设对 keepAliveSeconds 就行。底层就是定时往 TCP 发两个字节:0xC0 0x00(PingReq),服务端回 0xD0 0x00(PingResp)。
一句话总结
UrsPahoMqttClient 的 Connect 块传 keepAliveSeconds=60,心跳 Paho 自动搞定,不需要自己写 PingReq 代码。