MQTT 通信协议 QOS 的疑问

2021-08-03 08:53:55 +08:00
 lanxiner

我在开发 android 客户端时使用 MQTT 协议:当 QOS 等于 2 时,断网的情况下尝试推送数据到服务器,此时推送的数据会超时, 按理说网络恢复后所有的推送数据会自动再次发送. 不会出现丢失的情况. 但是我遇到某些手机会出现断网下发送的数据, 再次联网后无法自动再次发送,数据永久性的丢失了. [使用的 MQTT 是是 paho] 为什么会出现这种情况, 不同的手机 qos 的效果不同?

1999 次点击
所在节点    编程
5 条回复
yitingbai
2021-08-03 08:55:39 +08:00
MQTT 没有你想象的那么稳定, 最好还是在应用层在做一次判断
melsp
2021-08-03 09:19:25 +08:00
mqtt 好熟悉啊,还是大三做物联网实验学习过
masterclock
2021-08-03 10:00:59 +08:00
MQTT 协议理论上可以 QoS 2,但各种库未必真的能实现,比如超过最大外发缓存就会放弃数据,有些库会在调用发送时直接失败,有些库没有任何提醒直接丢数据
gam2046
2021-08-03 11:29:32 +08:00
也在 Android 中使用了 MQTT,可以尝试 C/C++版本的 paho,NDK 编译一下也不麻烦。我目前是这么用的 MQTTv5,问题不大。
我是自己编译了 C 版本的,通过 JNI 暴露简单的接口到 Java 。
vfs
2022-07-26 22:26:16 +08:00
你对于 QoS 2 的理解是对的。 作为服务器肯定会保证 QoS 2 不会丢失(通常会将消息持久化到数据库或者文件系统中,以确保数据不会丢失)。 但是作为客户端,通常没有这样的机制,对于没有成功发送的数据一般只能报一个错误给上层应用程序,此时重发的任务就留给上层应用程序了。你需要自己在应用程序层面重新发送没有发送成功的消息。

举个例子,如果你把一条 QoS 2 的消息成功发送到了服务器,另外一个监听同样 topic 的客户端接收到了消息,但是还没有回复相应的 ack 或者说 ack 没有成功的到达服务器,此时服务器是需要在将来一个合适的时刻重新将这条消息发送给这个监听者的。

但是如果你的客户端在发送消息时断网,或者消息没有成功达到服务器(此时客户端还没有收到来自服务器的 ack ),那么这条失败的消息是需要发送消息的客户端自己保存,在将来某个时刻重新发给服务器的。这里你是不能依赖服务器的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX