我有一个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()
下次连接时会导致多个订阅和重复消息。必须有一种干净的方法来关闭并重新启动服务。请提出建议。
答案 0 :(得分: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)
详细信息:MQTT的功能是在重新连接客户端时恢复订阅并接收丢失的消息(QOS> 0)。这不是Android Paho客户端“保持连接”并在后台缓存消息,消耗电池的结果。它与MQTT的称为会话的功能有关。当您重新建立连接时,MQTT Broker(或服务器)将尝试为您维护和恢复会话,该会话由客户端ID标识。这是MQTT的默认行为。但是,可以将其禁用。如果您的连接请求涉及要求进行“清洁会话”,则可以清除上一个会话,也就是说,它将丢弃您以前的任何主题并转储已保存在Broker中的消息,并以全新的方式开始连接,空的“干净”会话。