我正在使用Mosquitto Mqtt和paho API来接收Android设备上的推送消息.但是一旦网络连接发生变化,就会停止接收消息.以下是使用简单测试用例重现问题的步骤:
1)创建一个简单的活动.
2)On Activity StartUp通过paho API连接到mosquitto测试服务器(test.mosquitto.org:1883).
3)订阅一些主题.
4)向主题发布一些消息.
结果:Mqtt客户端接收发布到该主题的所有消息.现在
5)禁用手机上的互联网连接(移动数据)
6)向主题发布一些消息.
7)重新连接互联网.
结果:客户端在禁用Internet连接后不会收到任何已发布的消息.
由于KeepAliveInterval一直保持高值(30分钟),它应该在重新连接到互联网后收到所有消息.
相同的用例(相同的代码)适用于简单的java项目(非android),我在我的笔记本电脑上禁用互联网来运行用例.
知道为什么它不能在Android设备上工作???我错过了什么吗?
注意:
1)使用mqtt-client-0.4.1
2)Android目标API级别11
3)测试期间不要将设备置于睡眠模式.
4)在connectionLost回调中没有得到任何调用,并且mqtt回调的所有4个线程都在整个测试用例中运行,即mosquitto服务器的连接是完整的.
解决方法:
Java客户端库在某种程度上受底层网络API的支配.调用publish时,它会将MQTT数据包写入套接字.如果该写入失败,则将调用连接丢失,如果该写入有效,则客户端库将继续.您看到的行为差异是因为网络库在这些情况下表现不同.
MQTT keepalive间隔旨在帮助解决这个问题.在某些情况下,TCP连接可能看起来是实时的.这在移动或卫星连接设备上尤其可行 – 您无法期望网络API在所有情况下都能完全相同. Keepalive将ping数据包发送到服务器并期望响应 – 如果未收到响应,则假定会话已关闭.
如果将keepalive间隔设置为10秒,则应在15到20秒内将连接识别为已断开.