首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何彻底关闭Android paho MQTT服务?

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

Stack Overflow用户
提问于 2018-07-15 20:34:17
回答 1查看 3K关注 0票数 4

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

代码语言:javascript
复制
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

我将其登记为舱单上的服务:

代码语言:javascript
复制
<service android:name="org.eclipse.paho.android.service.MqttService" />

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

代码语言:javascript
复制
MqttConnectOptions options = new MqttConnectOptions();
options.setAutomaticReconnect(true);
options.setCleanSession(false);
client.connect(options);

我担心的是,由于与MQTT代理的背景同步,手机电池很快就会耗尽。因此,我想取消订阅,并在一天结束时与服务器断开连接。我宁愿丢弃夜间收到的所有信息。

有人能告诉我如何正确地做这件事吗?只要调用client.disconnect(),下次连接时就会产生多个订阅和重复消息。必须有一种干净的方法来关闭和重新启动服务。请建议一下。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 14:04:47

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

有人能告诉我如何正确地做这件事吗?在下次连接时,只需调用client.disconnect()就会产生多个订阅和重复消息。必须有一种干净的方法来关闭和重新启动服务。请建议一下。

简单地说,,我认为您正在寻找的是"清洁会议旗帜“。在传递给MqttConnectOptions方法的MqttAndroidClient.connect()对象中设置此值。一旦设置,您将不会获得重新订阅和积压的丢失消息。

示例

代码语言:javascript
复制
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的默认行为。但是,这是可以禁用的。如果您的连接请求涉及请求一个“清洁会话”,即它将丢弃以前的任何主题,并转储代理中持有的消息,则可以清除前一个会话,并以一个新的、空的、“干净的”会话启动连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51352038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档