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

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

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

我宁愿避免在中设置自动重新连接过程

 public class ServerCallback implements MqttCallback
{
    public void connectionLost(Throwable cause) { 
    ...
    }
}

因为我由于无法预测的原因而失去了连接,因此我想使用此方法来提示错误对话框.

如果是这样,我必须采取什么措施来防止这种断开连接?

编辑:

我的另一个观察结果是,只要将设备插入电源并充电,就不会断开连接.

解决方法:

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

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

为了在手机处于休眠状态时获得定时事件,必须由AlarmManager触发它.我发现的问题的最佳解决方案是制作一个从MqttPingSender类派生的替代类.在我自己开始编写此类课程之前,我在google上搜索并找到了已经在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分钟.

上一篇:5-python库之-paho mqtt通讯


下一篇:python – PyQt Widget connect()和disconnect()