我正在使用 Mosquitto Mqtt 和 paho API 在 Android 设备上接收推送消息。但是一旦网络连接发生变化,它就会停止接收消息。以下是使用简单测试用例重现问题的步骤:
1) 创建一个简单的 Activity 。
2) 在 Activity StartUp 上通过 paho API 连接到 mosquitto 测试服务器 (test.mosquitto.org:1883)。
3) 订阅一些主题。
4) 向主题发布一些消息。
结果: Mqtt Client 收到发布到主题的所有消息。现在
5) 在移动设备上禁用互联网连接(移动数据)
6) 向主题发布一些消息。
7) 重新连接互联网。
结果:客户端没有收到任何在互联网连接被禁用后发布的消息。
由于 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 保活间隔旨在帮助解决这个问题。在某些情况下,TCP 连接可能看起来是 Activity 的,但实际上并不活动。这在移动或卫星连接设备上尤其可能发生——您不能期望网络 API 在所有情况下都完全相同。 Keepalive 向服务器发送一个 ping 数据包并期待响应 - 如果未收到该响应,则认为 session 已关闭。
如果您将 keepalive 间隔设置为 10 秒,则连接应在 15 到 20 秒内被识别为断开。
关于java - Android - 一旦网络连接发生变化(移动数据禁用并再次启用),Paho Mqtt 客户端不接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25176643/