我正在使用穆斯基托Mqtt和泛美卫生组织API在android设备上接收推送消息。但是,一旦网络连接改变,它就停止接收消息。下面是用简单测试用例再现问题的步骤:
1)创建一个简单的活动。
( 2)在活动上,StartUp通过paho连接到蚊虫检测服务器(test.mosquitto.org:1883)。
3)订阅某一主题。
4)向主题发布消息。
结果: Mqtt客户端接收发布到主题的所有消息。现在
5)禁用移动互联网连接(移动数据)
6)向主题发布一些信息。
( 7)重新连接互联网。
结果:客户端未收到任何在禁用internet连接后发布的消息。
由于KeepAliveInterval的价值很高(30分钟),它应该在重新连接到internet后接收所有消息。
相同的用例(相同的代码)适用于简单的java项目(非android),在该项目中,我在笔记本电脑上禁用互联网以运行用例.。
知道它为什么不能在android设备上工作吗?我是不是遗漏了什么?
注:
1)使用mqtt-客户端-0.4.1
2) Android目标API级别11
3)在测试过程中不将设备置于睡眠模式。
4)在connectionLost回调中没有任何调用,mqtt回调的所有4个线程都在整个测试用例中运行,即连接蚊子到服务器。
发布于 2014-08-13 08:35:06
Java客户端库在某种程度上受底层网络API的支配。当调用发布时,它将向套接字写入一个MQTT数据包。如果写入失败,则将调用丢失的连接,如果写入有效,则客户端库将继续进行。你所看到的行为的不同是因为在这种情况下,网络库的行为是不同的。
MQTT保持活动间隔是为了在这方面提供帮助。在某些情况下,TCP连接可能在不存在的情况下处于活动状态。这在移动设备或卫星连接设备上尤其有可能--您不能期望网络API在所有情况下都能完全相同。Keepalive向服务器发送ping数据包,并期望得到响应--如果未收到响应,则假定会话已关闭。
如果将“保持活动”间隔设置为10秒,则应在15至20秒内识别该连接已断开。
发布于 2014-09-27 10:57:58
可以将MqttCallback侦听器附加到MqttAsyncclient。它丢失了回调方法连接,当连接丢失事件发生或泛美卫生组织断开连接时,将调用该方法。
发布于 2014-09-29 05:39:49
为了解决这个问题,每当因特网连接恢复时,我必须向代理进行显式ping (以及等待ping响应的计时器)。如果ping失败或计时器超时,我将强制终止现有连接(disconnectForcibly),然后显式调用connectionLost方法。(然后只从connectionLost方法重新连接)。
https://stackoverflow.com/questions/25176643
复制相似问题