Pra*_*dia 5 java android mqtt mosquitto paho
我正在使用 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 分钟),因此它应在重新连接到 Internet 后接收所有消息。
相同的用例(相同的代码)适用于简单的 java 项目(非安卓),我在我的笔记本电脑上禁用互联网来运行用例。
知道为什么它不能在 android 设备上工作吗???我错过了什么吗?
笔记:
1) 使用 mqtt-client-0.4.1
2) Android 目标 API 级别 11
3) 测试期间不让设备进入睡眠模式。
4) 在 connectionLost 回调中没有得到任何调用,并且 mqtt 回调的所有 4 个线程都在整个测试用例中运行,即连接 mosquitto 服务器完好无损。
小智 4
Java 客户端库在一定程度上受底层网络 API 的支配。当调用publish时,它将向套接字写入一个MQTT数据包。如果该写入失败,则将调用“连接丢失”,如果该写入有效,则客户端库将继续。您看到的行为差异是因为网络库在这些情况下的行为不同。
MQTT 保活间隔旨在帮助解决此问题。在某些情况下,TCP 连接可能看起来是活动的,但实际上并非如此。这在移动或卫星连接设备上尤其可能 - 您不能指望网络 API 在所有情况下都完全相同。Keepalive 向服务器发送 ping 数据包并期望响应 - 如果未收到该响应,则假定会话已关闭。
如果将保持活动间隔设置为 10 秒,则连接应在 15 到 20 秒内被识别为断开。