【MQTT学习笔记五】QoS,保留消息,清理回话解析(基于mosquitto)

一段简单说明

看到网上介绍QoSRetain MessageClean Session的文章很多,但都只是对官方文档的一些总结或者翻译,相信很多小伙伴也对这3个设置有或多或少的疑惑。比如,不同发布或者订阅的QoS条件下,不同类型的消息如何传递;设置Retain之后有什么效果;清理回话标志有什么作用。
我用Python脚本对不同的设置都做了尝试,下面总结下,希望对怀有和我一样的疑惑的小伙伴们有所帮助。

QoS

MQTT提供了3个等级的消息传递质量来满足不同场景的需要。它允许订阅和发布设置不同的QoS,对于每一个订阅者或者发布者来说,都是独立的。2个客户端的最终等级取决于较低的。举个例子,发布的QoS=1,订阅的QoS=0,那发布者能确保消息传递给broker,但是broker和订阅者之间的QoS=0,不需要确认消息,不能保证消息一定传递成功,所以QoS取决于低者。
下面以eclipse的mosquitto为例,总结下不同发布(Pub)和订阅(Sub)QoS的消息传递情况。

QoS:Pub=0,Sub=0

a)sub在线,发布消息,sub收到消息;sub掉线再上线,消息不会被重复收到
Pub
在这里插入图片描述
Sub
在这里插入图片描述
b)sub不在线,发布消息,sub上线,消息不会被收到

QoS:Pub=1,Sub=0

a)sub在线,pub发布消息,pub收到puback,sub正常收到消息(qos=0);sub掉线再重新上线,该条消息不会重复收到
在这里插入图片描述
b)sub不在线,pub发布消息,pub收到puback,sub上线不会再收到消息
在这里插入图片描述

QoS:Pub=0,Sub=1

a)sub在线,pub发布消息,sub收到消息且不回复puback,重新上线,没有收到重复消息
在这里插入图片描述
b)sub不在线,发布消息,sub上线,收不到该条消息

QoS:Pub=1,Sub=1

a)sub在线,pub发布消息,pub收到puback,sub回复puback,sub掉线上线,不会重复收到消息
在这里插入图片描述
b)sub不在线,发布消息,pub收到puback,sub上线,不会收到消息。
在这里插入图片描述
c)sub在线,发布消息,sub回复错误的ack(模拟pub收不到puback)
在这里插入图片描述
d)sub在线,发布消息,pub收到puback,sub收到publish消息但是不回复puback,sub掉线上线,都会收到消息
在这里插入图片描述

QoS:Pub=2,Sub=1

a)sub在线,发布消息,pub收到rec,rel和comp,sub回复puback,掉线上线不会收到重复消息
在这里插入图片描述
b)sub不在线,发布消息,pub收到rec,rel和comp,sub上线不会收到消息
在这里插入图片描述

QoS:Pub=1,Sub=2

a)sub在线,发布消息,pub收到puback,sub回复puback,sub掉线上线,不会收到
在这里插入图片描述
b)sub不在线,发布消息,pub收到puback,sub上线不会收到
在这里插入图片描述

QoS:Pub=2,Sub=2

a)sub在线,发布消息,pub收到rec,rel和comp,sub回复rec,rel和comp,sub掉线上线不会重复收到消息
在这里插入图片描述
b)sub不在线,发布消息,pub收到rec,rel和comp,sub上线收不到消息
在这里插入图片描述

Retain Flag

  1. sub在线,pub r=1,sub收到的r应该为0
    在这里插入图片描述
  2. b不在线,pub r=1,sub上线,收到的r为1的消息
    在这里插入图片描述
  3. Sub1在线,pub r=1,sub2上线,收到的r为1
    在这里插入图片描述
  4. Pub r=1,sub重复上线,sub重复收到消息
    在这里插入图片描述
  5. #4之后,pub r=0,sub重新上线,重复收到之前保留的消息
    在这里插入图片描述
  6. #5之后,pub r=1的空消息,sub收到空消息,sub重新上线,不会再收到保留的消息
    在这里插入图片描述
  7. #6之后,pub r=0,sub上线,不会收到消息
    在这里插入图片描述

Clean Session Flag

  1. 订阅QoS=0,clean session=0,订阅topic1,连接之后,掉线上线,不订阅任何消息,依然能收到topic1的消息
    在这里插入图片描述
  2. 订阅qos=0,c=0,订阅topic1,连接之后,掉线,发布qos=1,订阅者重新上线,收不到消息
  3. 订阅qos=1,c=0,订阅topic1,连接之后,掉线,发布qos=1,订阅者重新上线,可以收到消息
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值