繁体   English   中英

如何强制 MQTT 代理不从 Android Paho 客户端清除 session?

[英]How to force MQTT broker to NOT clean session from Android Paho client?

我正在尝试使用 MQTT(Android 上的 Paho 库,linux 服务器上的 mosquitto 消息代理)在回合制游戏中传递动作,替换我多年前编写的自定义服务器。 它的简单性和 pub-sub 设计看起来很完美:每个设备订阅一个唯一的 id 作为“主题”并将其作为“地址”进行通信。 然后其他设备可以通过发布到该地址来访问它。

它在我的测试 Linux 客户端(使用 Ubuntu 上的 mosquitto-dev 库连接)中完美运行。 当 ANDROID 应用程序正在运行时,它在 Android 上完美运行。 在 Linux 客户端案例中,如果在应用程序未运行或未连接时发送消息,则应用程序会在连接和订阅后立即收到消息。 然而,在 Android 上,这不会发生。 只有在订阅 android 客户端时由另一个客户端发送(或重新发送)的消息才会被传递。

我是 MQTT 的新手,但似乎很清楚“cleanSession”连接参数是控制这个的:除非你“清理”session,否则你会在未订阅时获得发布到主题的所有内容。 在 Linux 客户端,将“true”传递给 mosquitto_new(..., clean_session, ...) 确实会阻止我的 Linux 客户端获取连接前消息。 但是在Android端,当MqttConnectOptions实例传递给.connect()时,calling.setCleanSession(boolean)没有任何作用。

我正在使用 1.1.+ 的 paho。 根据https://github.com/eclipse/paho.mqtt.android.git的仓库中的标签,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 的工具。

谢谢!

关于 cleanSession 标志。 客户端和服务器可以存储 Session state 以使可靠的消息传递能够在一系列网络连接中继续。 该位用于控制 Session state 的寿命。

如果 CleanSession 设置为 0,则服务器必须根据当前 Session(由客户端标识符标识)的 state 恢复与客户端的通信。 如果没有与客户端标识符关联的 Session,则服务器必须创建一个新的 Session。 客户端和服务器断开连接后,客户端和服务器必须存储 Session。 在将 CleanSession 设置为 0 的 Session 断开连接后,服务器必须存储更多的 QoS 1 和 QoS 2 消息,这些消息与客户端在断开连接时所拥有的任何订阅相匹配,作为 Session Z9ED369EZ52EA93942EF567 的一部分。 它也可以存储满足相同标准的 QoS 0 消息。

有关 cleanSession 的更多信息: https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/csprd02/mqtt-v3.1.1-csprd02.html

如果我正确理解您的要求,那么您确实需要使用 clenSession=true。 您也可以尝试使用 QoS=0 发布和订阅。 一些代理不存储 QoS=0 消息,mosquitto 也是如此。 (根据https://mosquitto.org/man/mqtt-7.html

我找到了一种解决方法,并且在此过程中证实了我的怀疑,即 MqttAndroidClient class 因不遵守该设置而损坏。 我尝试使用 MqttAsyncClient,而不是使用 MqttConnectOptions。 代码更改是微不足道的,尽管由于 Android 客户端知道并使用后台服务,因此有相当大的变化。 通过使用这种不同的 class 的简单更改,我能够连接和订阅并立即接收未连接时发布的所有消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM