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

How to cleanly shut down an Android paho MQTT service?

我有一个 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 代理的持续后台同步,phone 电池会很快耗尽。所以我想取消订阅,并在一天结束时断开与服务器的连接。我宁愿丢弃所有在夜间收到的消息。

谁能告诉我如何正确执行此操作的教程?只是打电话 client.disconnect() 下次连接时会导致多个订阅和重复消息。必须有一种干净的方法来关闭和重新启动服务。请提出建议。

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

Can someone please point me to a tutorial on how to do this correctly ? Just calling client.disconnect() results in multiple subscriptions and duplicate messages when I connect the next time. There must be a clean way to shut down and restart the service. Please suggest.

简而言之:我想你要找的是“Clean Session Flag”。您在传递给 MqttAndroidClient.connect() 方法的 MqttConnectOptions 对象中设置它。一旦设置,您将不会被重新订阅和积压错过的消息。

例子

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

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

详细说明: 当您重新连接客户端时恢复您的订阅并接收丢失的消息(QOS > 0)是 MQTT 的一项功能。这不是 Android Paho 客户端 "staying connected" 和在后台缓存消息、消耗电池的结果。它与称为会话的 MQTT 功能有关。 MQTT 代理(或服务器)将尝试为您维护和恢复会话,在您重新建立连接时由客户端 ID 标识。这是 MQTT 的默认行为。但是,这可以被禁用。如果您的连接请求涉及请求 "Clean Session",则可以清除之前的会话,也就是说,它将丢弃您之前拥有的任何主题并转储已保存在 Broker 中的消息,并重新开始您的连接,空,"clean" 会话。