如何彻底关闭Android paho MQTT服务?

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

我有一个Android paho MQTT客户端,它可以监听传感器数据,并在出现任何阈值违规时提醒用户。我的app.gradle中有以下内容:

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

我在清单中将其注册为服务:

<service android:name="org.eclipse.paho.android.service.MqttService" />

即使应用程序不在前台,该服务也会收到MQTT消息。

MqttConnectOptions options = new MqttConnectOptions();
options.setAutomaticReconnect(true);
options.setCleanSession(false);
client.connect(options);

我担心的是,由于与MQTT经纪商的持续后台同步,手机电池将快速耗尽。所以我想取消订阅,并在一天结束时断开与服务器的连接。我宁愿丢弃在夜间收到的所有消息。

有人可以指点我一个如何正确执行此操作的教程吗?当我下次连接时,只是调用client.disconnect()会导致多个订阅和重复消息。必须有一个干净的方法来关闭并重新启动服务。请建议。

android mqtt paho disconnect
1个回答
0
投票

就您对电池使用的担忧而言,调用disconnect()应该可以正常工作。您不应该需要对服务进行微观管理。我正在关注你问题的这一部分,因为你似乎误解了MQTT的工作原理:

有人可以指点我一个如何正确执行此操作的教程吗?当我下次连接时,调用client.disconnect()会导致多个订阅和重复消息。必须有一个干净的方法来关闭并重新启动服务。请建议。

简而言之:我认为你所寻找的是“Clean Session Flag”。您在传递给MqttConnectOptions方法的MqttAndroidClient.connect()对象中设置此项。一旦设置,您将无法重新订阅并积压错过的消息。

MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);

mqttClient = new MqttAndroidClient(getApplicationContext(), brokerUrl, clientId)
mqttClient.connect(connOpts)

详细信息:当您重新连接客户端时,恢复订阅并接收错过的消息(QOS> 0)是MQTT的一项功能。它不是Android Paho客户端“保持连接”并在后台缓存消息,烧毁电池的结果。它与MQTT的一个名为Sessions的功能有关。 MQTT代理(或服务器)将尝试为您维护和恢复会话,在重新建立连接时由客户机ID标识。这是MQTT的默认行为。但是,这可以被禁用。如果您的连接请求涉及要求“清理会话”,也就是说,它将丢弃您之前拥有的任何主题并转储已在Broker中保存的消息,并以新鲜的方式启动您的连接,则可以清除上一个会话。空,“干净”的会议。

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