我目前正在制作一个小型的恐慌按钮"应用程序应该在医疗机构中运行。由于项目的一个假设是独立于互联网,我决定使用在本地WLAN中设置的服务器来使用MQTT。
我已经实施了Paho Android服务,效果非常好。到某一点。一旦我锁定设备并关闭屏幕,一分钟后客户端就会断开连接。由于我已将MQTT选项设置为KeepAlive间隔为30秒,因此必须由Android本身引起,可能会进入锁定睡眠状态。我在几台不同的智能手机上获得相同的结果,因此它可能也与用户设置无关。
我宁愿避免在
中设置自动重新连接程序 public class ServerCallback implements MqttCallback
{
public void connectionLost(Throwable cause) {
...
}
}
因为由于不太可预测的原因导致连接丢失,我想使用此方法来提示错误对话框。
如果是这样,我有什么选择来阻止这种断开连接?
修改
对我的另外观察是,只要设备插入并充电,就不会发生断开连接。
答案 0 :(得分:1)
在谷歌上搜索后,我想我找到了原因:
Paho MQTT客户端使用 TimerTask 来安排keepalive ping。一个 TimerTask 将在手机进入睡眠状态时停止,因此在这里是一个糟糕的选择... keepalive ping的实现可以在 TimerPingSender 类中找到,这是源自 MqttPingSender 类。
为了在手机休眠时获取定时事件,必须由 AlarmManager 触发。我发现问题的最佳解决方案是创建一个源自 MqttPingSender 类的替代类。在我开始自己编写这样一个课程之前,我用谷歌搜索并找到了一个已经在GitHub上完成它的人。
我还必须为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分钟。