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

时间:2016-06-08 09:57:39

标签: android sleep mqtt disconnect

我目前正在制作一个小型的恐慌按钮"应用程序应该在医疗机构中运行。由于项目的一个假设是独立于互联网,我决定使用在本地WLAN中设置的服务器来使用MQTT。

我已经实施了Paho Android服务,效果非常好。到某一点。一旦我锁定设备并关闭屏幕,一分钟后客户端就会断开连接。由于我已将MQTT选项设置为KeepAlive间隔为30秒,因此必须由Android本身引起,可能会进入锁定睡眠状态。我在几台不同的智能手机上获得相同的结果,因此它可能也与用户设置无关。

我宁愿避免在

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

因为由于不太可预测的原因导致连接丢失,我想使用此方法来提示错误对话框。

如果是这样,我有什么选择来阻止这种断开连接?

修改

对我的另外观察是,只要设备插入并充电,就不会发生断开连接。

1 个答案:

答案 0 :(得分:1)

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

Paho MQTT客户端使用 TimerTask 来安排keepalive ping。一个 TimerTask 将在手机进入睡眠状态时停止,因此在这里是一个糟糕的选择... keepalive ping的实现可以在 TimerPingSender 类中找到,这是源自 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分钟。

相关问题