清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.76

Aia StoreApp上架指南 .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

AppInventor2离线版中文教育版接入DeepSeek VIP会员 享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档AI2拓展IoT专题

查看: 6|回复: 0
打印 上一主题 下一主题

[经验分享] UrsPahoMqttClient心跳问题解决——Paho底层已自动处理,设好KeepAlive就行

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 812 天

    [LV.10]以坛为家III

    1145

    主题

    1921

    帖子

    5万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    54504

    AI2中文网VIP弹球达人接水果达人撸猫达人

    跳转到指定楼层
    楼主
    发表于 1 小时前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    问一下心跳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 代码。
    App Inventor 2 中文网 - MIT同步更新的中文本土化平台!v2.76 支持Android 15 & iOS 更新日志
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2026 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2026-05-19 14:18 , Processed in 0.021632 second(s), 30 queries .