如何强制MQTT经纪人不从Android Paho客户端清除会话?

问题描述 投票:0回答:1

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

它在我的测试Linux客户端(使用Ubuntu上的mosquitto-dev库进行连接)中完美运行。当ANDROID应用程序正在运行时,它可以在Android上完美运行。在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处的标签,最新的是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
1个回答
0
投票

关于cleanSession标志。客户端和服务器可以存储会话状态,以使可靠的消息传递能够在一系列网络连接中继续进行。该位用于控制会话状态的生存期。

如果CleanSession设置为0,则服务器务必根据当前会话的状态(由客户端标识符标识)恢复与客户端的通信。如果没有与客户端标识符相关的会话,则服务器必须创建一个新的会话。客户端和服务器断开连接后,客户端和服务器必须存储会话。断开具有CleanSession设置为0的会话后,服务器务必存储与客户端断开时具有的所有订阅匹配的QoS 1和QoS 2消息作为会话状态的一部分。它还可以存储满足相同条件的QoS 0消息。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.