清泛IT社区

标题: UrsPahoMqttClient心跳问题解决——Paho底层已自动处理,设好KeepAlive就行 [打印本页]

作者: App Inventor 2     时间: 1 小时前
标题: UrsPahoMqttClient心跳问题解决——Paho底层已自动处理,设好KeepAlive就行
问一下心跳PingReq报文怎么发的

目的为保持 MQTT 连接,否则会被踢下线。

用的是什么MQTT扩展?UrsPahoMqttClient。

结论:不需要手动发心跳,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 秒,省心又稳

防止掉线的几个要点

1. Connect 时传 keepAliveSeconds=60
2. 监听 Disconnected 事件,断开自动重连

当 UrsPahoMqttClient1.Disconnected
  调用 UrsPahoMqttClient1.Connect(...)

3. 如果是 WiFi 热点/4G/企业防火墙环境,NAT 超时可能额外导致掉线,可加个应用层定时器每 30 秒检查连接状态。

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 代码。




欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3