我正在使用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客户端就不会收到消息所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)