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

java–Android– 一旦网络连接发生变化(移动数据被禁用并再次启用),Paho Mqtt客户端就不会收到消息,第1张

概述我正在使用MosquittoMqtt和pahoAPI来接收Android设备上的推送消息.但是一旦网络连接发生变化,就会停止接收消息.以下是使用简单测试用例重现问题的步骤:1)创建一个简单的活动.2)OnActivityStartUp通过pahoAPI连接到mosquitto测试服务器(test.mosquitto.org:1883).3)订阅一些

我正在使用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分钟),它应该在重新连接到互联网后收到所有消息.

相同的用例(相同的代码)适用于简单的java项目(非androID),我在我的笔记本电脑上禁用互联网来运行用例.

知道为什么它不能在AndroID设备上工作???我错过了什么吗?

注意:

1)使用mqtt-clIEnt-0.4.1

2)AndroID目标API级别11

3)测试期间不要将设备置于睡眠模式.

4)在connectionLost回调中没有得到任何调用,并且mqtt回调的所有4个线程都在整个测试用例中运行,即mosquitto服务器的连接是完整的.

解决方法:

Java客户端库在某种程度上受底层网络API的支配.调用publish时,它会将MQTT数据包写入套接字.如果该写入失败,则将调用连接丢失,如果该写入有效,则客户端库将继续.您看到的行为差异是因为网络库在这些情况下表现不同.

MQTT keepalive间隔旨在帮助解决这个问题.在某些情况下,TCP连接可能看起来是实时的.这在移动或卫星连接设备上尤其可行 – 您无法期望网络API在所有情况下都能完全相同. Keepalive将Ping数据包发送到服务器并期望响应 – 如果未收到响应,则假定会话已关闭.

如果将keepalive间隔设置为10秒,则应在15到20秒内将连接识别为已断开.

总结

以上是内存溢出为你收集整理的java – Android – 一旦网络连接发生变化(移动数据被禁用并再次启用),Paho Mqtt客户端就不会收到消息全部内容,希望文章能够帮你解决java – Android – 一旦网络连接发生变化(移动数据被禁用并再次启用),Paho Mqtt客户端就不会收到消息所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:http://outofmemory.cn/web/1114835.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存