【问题标题】:How to cleanly shut down an Android paho MQTT service?如何彻底关闭 Android paho MQTT 服务?
【发布时间】:2018-07-15 20:34:17
【问题描述】:

我有一个 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() 下次连接时会导致多个订阅和重复消息。必须有一种干净的方法来关闭和重新启动服务。请提出建议。

【问题讨论】:

  • 关闭onPause()中的服务
  • 试过了,然后在 onResume() 中重新连接。我发现了两个问题:每次我的手机改变方向时,这些都会被重复调用,最终我会为同一条消息多次回调。其次,它强制应用程序保持在前台。但我需要每天在后台运行几个小时的应用程序。
  • 那么不要使用 Paho 服务,而是编写自定义 JobIntentService 并使用 Paho 客户端
  • 没错! JobIntentService 最适合 OneOff 任务,但如果您有其他要求,例如网络和充电器插入 JobScheduler 是一种可能性。有时您无法避免使用前台服务,并且有一些关于 Oreo 后台限制的内容可供阅读。
  • 同样,您可以在完成一些计算后使用 stopself() 关闭您的服务,如果出现问题,甚至可以在 catch 块中关闭。

标签: android mqtt paho disconnect


【解决方案1】:

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

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

简而言之:我认为您正在寻找的是“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 客户端“保持连接”并在后台缓存消息、消耗电池的结果。它与 MQTT 的一个称为 Sessions 的功能有关。当您重新建立连接时,MQTT 代理(或服务器)将尝试为您维护和恢复会话,由客户端 ID 标识。这是 MQTT 的默认行为。但是,可以禁用此功能。如果您的连接请求涉及请求“清洁会话”,则可以清除上一个会话,也就是说,它将丢弃您之前拥有的任何主题并转储已保存在代理中的消息,并以新的方式开始您的连接,空的,“干净”的会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多