首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android - Paho Mqtt客户端在网络连接改变后不会接收消息(移动数据已禁用并再次启用)

Android - Paho Mqtt客户端在网络连接改变后不会接收消息(移动数据已禁用并再次启用)
EN

Stack Overflow用户
提问于 2014-08-07 07:32:10
回答 6查看 8.4K关注 0票数 5

我正在使用穆斯基托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个线程都在整个测试用例中运行,即连接蚊子到服务器。

EN

回答 6

Stack Overflow用户

发布于 2014-08-13 08:35:06

Java客户端库在某种程度上受底层网络API的支配。当调用发布时,它将向套接字写入一个MQTT数据包。如果写入失败,则将调用丢失的连接,如果写入有效,则客户端库将继续进行。你所看到的行为的不同是因为在这种情况下,网络库的行为是不同的。

MQTT保持活动间隔是为了在这方面提供帮助。在某些情况下,TCP连接可能在不存在的情况下处于活动状态。这在移动设备或卫星连接设备上尤其有可能--您不能期望网络API在所有情况下都能完全相同。Keepalive向服务器发送ping数据包,并期望得到响应--如果未收到响应,则假定会话已关闭。

如果将“保持活动”间隔设置为10秒,则应在15至20秒内识别该连接已断开。

票数 4
EN

Stack Overflow用户

发布于 2014-09-27 10:57:58

可以将MqttCallback侦听器附加到MqttAsyncclient。它丢失了回调方法连接,当连接丢失事件发生或泛美卫生组织断开连接时,将调用该方法。

票数 2
EN

Stack Overflow用户

发布于 2014-09-29 05:39:49

为了解决这个问题,每当因特网连接恢复时,我必须向代理进行显式ping (以及等待ping响应的计时器)。如果ping失败或计时器超时,我将强制终止现有连接(disconnectForcibly),然后显式调用connectionLost方法。(然后只从connectionLost方法重新连接)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25176643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档