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

我正在使用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秒内将连接识别为已断开.

上一篇:nginx反向代理wss – 客户端在读取客户端请求行时发送了无效方法


下一篇:AsyncAPI 试用