java - Android - 一旦网络连接发生变化(移动数据禁用并再次启用),Paho Mqtt 客户端不接收消息

标签 java android mqtt mosquitto paho

我正在使用 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/

相关文章:

java - 在 xml 配置文件中找不到类 [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]

java - 通过 API 在 Google Drive 上共享文件时防止默认 "Editors will be allowed to add people and change the permissions"行为

java - 将参数传递给方法时,强化将查询标记为 sqlInjection

mqtt - MQTT 连接消耗了多少数据

raspbian - 通过 Internet 连接到安装在 Raspberry Pi 上的 MQTT 代理 (Mosquitto)

java - 在 Dataflow 中从 BigQuery 写入 Cloud Storage 时如何设置文件大小而不是分片数量

android - ksoap2 中的 "AndroidHttpTransport cannot be resolved to a type"错误

安卓测试 : use Dagger2 + Gradle

android - 在构建一套 Android 应用程序时如何更好地处理包名称

apache-spark - 将 mqtt 与 pyspark 流结合使用