gpt4 book ai didi

android - Paho MQTT 客户端在设备锁定后断开连接

转载 作者:行者123 更新时间:2023-11-29 19:45:59 25 4
gpt4 key购买 nike

我目前正在开发一个应该在医疗机构中运行的小型“紧急按钮”应用程序。由于该项目的假设之一是独立于 Internet,因此我决定使用在本地 WLAN 中设置服务器的 MQTT。

我已经实现了 Paho Android 服务,并且运行良好。到一定程度。一旦我锁定设备并关闭屏幕,一分钟后客户端就会断开连接。由于我已将 MQTT 选项设置为 30 秒的 KeepAlive 间隔,这一定是由 Android 本身引起的,可能会进入其锁定 sleep 状态。我在几个不同的智能手机上获得了相同的结果,所以它可能也与用户设置无关。

我宁愿避免在

中设置自动重新连接过程
 public class ServerCallback implements MqttCallback
{
public void connectionLost(Throwable cause) {
...
}
}

因为我想使用这种方法在由于不可预测的原因导致连接丢失时提示错误对话框。

如果是这样,我有什么选择可以防止这种断开连接?

编辑:

我的额外观察是,只要设备插上充电,就不会出现断线的情况。

最佳答案

谷歌搜索后我想我找到了原因:

Paho MQTT 客户端使用 TimerTask 来安排 keepalive ping。当手机进入休眠状态时,TimerTask 将停止,因此这里是一个糟糕的选择......可以在类 TimerPingSender 中找到保持 Activity ping 的实现派生自 MqttPingSender 类。

为了在手机休眠时获取定时事件,必须由AlarmManager触发。我发现的问题的最佳解决方案是制作一个派生自 MqttPingSender 类的替代类。在我自己开始编写这样的类之前,我用谷歌搜索并找到了已经在 GitHub 上完成的人。

可以在这里找到: https://github.com/Suxsem/Domo-Android/blob/master/app/src/main/java/com/suxsem/domo/MqttPingSender.java

我还必须向 MqttClient 添加一个替代构造函数:

public MqttClient(String serverURI, String clientId, MqttClientPersistence persistence, MqttPingSender pingSender) throws MqttException {
aClient = new MqttAsyncClient(serverURI, clientId, persistence, pingSender);
}

在我实例化 MqttClient 的地方(在我的服务中)我这样做:

MqttPingSender pingSender = new MqttPingSenderAlarm(this);
mqClient = new MqttClient("tcp://<IP>:<PORT>", "MyTestServiceID", new MemoryPersistence(), pingSender);

到目前为止,这似乎完美无缺,但我只测试了 20-30 分钟。

关于android - Paho MQTT 客户端在设备锁定后断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37699240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com