【发布时间】:2020-05-14 19:18:00
【问题描述】:
我正在尝试使用 MQTT(Android 上的 Paho 库,Linux 服务器上的 mosquitto 消息代理)在回合制游戏中传递动作,取代我多年前编写的自定义服务器。它的简单性和 pub-sub 设计看起来很完美:每个设备订阅一个唯一的 id 作为“主题”并将其作为其“地址”进行通信。然后其他设备可以通过发布到该地址来访问它。
它在我的测试 Linux 客户端中完美运行(使用 Ubuntu 上的 mosquitto-dev 库连接)。当安卓应用程序运行时,它可以在安卓上完美运行。在 Linux 客户端案例中,如果在应用程序未运行或未连接时发送消息,则应用程序在连接和订阅后立即收到消息。然而,在 Android 上,这不会发生。只有在订阅 android 客户端时由另一个客户端发送(或重新发送)的消息才会被传递。
我是 MQTT 的新手,但“cleanSession”连接参数似乎很清楚控制这一点:除非您“清理”会话,否则您会在未订阅时获得发布到您的主题的所有内容。在 Linux 客户端,将“true”传递给 mosquitto_new(..., clean_session, ...) 确实会阻止我的 Linux 客户端获取预连接消息。但在 Android 端,当 MqttConnectOptions 实例传递给 .connect() 时,调用 .setCleanSession(boolean) 没有任何效果。
我正在使用 1.1.+ 的 paho。根据https://github.com/eclipse/paho.mqtt.android.git 的 repo 中的标签,v1.1.1 是最新的。
implementation "org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.+"
implementation "org.eclipse.paho:org.eclipse.paho.android.service:1.1.+"
我怀疑这只是 Android Paho 库中的一个错误(这似乎在四年内没有解决。)但我希望我错了!有没有办法实现我想要的?
或者,有没有更好的库?我所做的谷歌搜索表明,尽管 Paho 已经很老了,但它仍然是大多数 Android 开发人员用来说 MQTT 的语言。
谢谢!
【问题讨论】:
标签: android mqtt mosquitto paho