我有一个Android客户端,它监听传感器数据,并在出现任何阈值违规时提醒用户。我的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(),下次连接时就会产生多个订阅和重复消息。必须有一种干净的方法来关闭和重新启动服务。请建议一下。
发布于 2019-03-22 14:04:47
就您对电池使用的关注而言,调用disconnect()应该像预期的那样工作。你不需要对服务进行微观管理。我关注你问题的这一部分,因为你似乎误解了MQTT的工作原理:
有人能告诉我如何正确地做这件事吗?在下次连接时,只需调用client.disconnect()就会产生多个订阅和重复消息。必须有一种干净的方法来关闭和重新启动服务。请建议一下。
简单地说,:,我认为您正在寻找的是"清洁会议旗帜“。在传递给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的一个称为会话的特性有关。当您重新建立连接时,MQTT代理(或服务器)将尝试为您维护和恢复由客户端ID标识的会话。这是MQTT的默认行为。但是,这是可以禁用的。如果您的连接请求涉及请求一个“清洁会话”,即它将丢弃以前的任何主题,并转储代理中持有的消息,则可以清除前一个会话,并以一个新的、空的、“干净的”会话启动连接。
https://stackoverflow.com/questions/51352038
复制相似问题