我目前正在开发一个小型的“应急按钮”应用程序,该应用程序应在医疗机构中运行.由于该项目的一个假设是独立于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上完成课程的人.
我还必须向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分钟.