C#MQTT编程05--发布报文

发布时间:2024年01月15日

1、报文回顾

在MQTT中,消息传递模式是采用发布订阅模式(Publish-Subscribe Pattern),它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立直接的联系也不需要知道对方的存在。看这两图

2、发布报文

看过前面几章的伙伴们应该或多或少都认识服务质量QOS。发布报文跟他的联系最紧的。我们也清楚订阅报文里面虽然也有用到QOS,但是他却没有更进一步的联系,发布的时候跟QOs关系最多。

?1、服务质量QOS

这个概念在社会管理,日常生活,平常工作中都有存在,比如10086的客服电话打完后都有个评价客服质量,12345的市长热线打完后都有回复电话评价百姓的问题解决了吗,买华为手机的售后服务质量怎么样,等等这些东西,都表明了一项业务的质量如何?同样的,在mqtt的消息传送过程中,消息有没有发到对方手上,如果没有收到怎么办,这些东西就要依靠服务质量来评价。

不管是订阅报文还是发布报文都会遇到报文流失的问题,也就是消息丢失的问题,所以才会有了服务质量这一说法,即然报文在发送的过程中可能存在流失的问题,那么最直接的决解方案就是重新发送,重发几次就涉及到质量等级的概念了,所以服务质量事实就是表示报文要发送几次?这就是Qos的意义。QOS有三个值,分别表示着三种不同的处理报文方式,相应的值如下:

QOS 0:最多分发一次,可以零次或一次。一次到很常见。看图

这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1

QOS 1:至少分发一次。

QoS 1 承诺消息将至少传送一次给订阅者。该消息已获取消息 ID。发送方存储消息,直到收到PUBACK订阅方的确认 ( )。发件人第一次将重复标志设置为0(?DUP = 0)。QoS 1 告诉目标设备(接收器)需要确认要求。如果消息被正确接收,接收者会发送一个PUBACK(确认)和正确的消息 ID。但是,如果在没有确认的情况下超过特定时间,则会再次发送消息,这次将重复标志设置为1(?DUP = 1)。同一目标设备可能会多次发生这种情况。此目标设备必须具有必要的逻辑来检测重复项并做出同样的反应。

QOS 2:只分发一次。

使用 QoS 2,我们保证消息仅传送到目的地一次。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流。在第一次发送 (?DUP = 0)之后,发送方重复发送 ((?DUP = 1) 直到它接收到一个PUBREC告诉,该消息已被接收方存储。在第二次交易中,发送方告诉接收方停止传输与PUBREL(release), clear用于存储的缓冲区并发送一个PUBCOMP(完成) 发送方确定已成功被目标设备接收一次后,成功传递已发布的 QoS 2 消息。

不过要注意的是Qos是指客户端到服务端的分发,不是客户端到客户端的分发,比如Qos1是至少分发一次,如果失败的话就一直重复分发,它的发送流程是:?

1)客户端向服务端发起一个发布报文PUBLISH。如果服务端没有接到,请你继续

2)服务端收到一个来看客户端的发布报文。查看一下原来是服务质量QOS为1的报文。服务端就必须回发一个叫发布确认(PUBACK)的报文,而这个时候客户端也在等待着服务端的回应?

3)客户端等了一段时间就是没有接到来自服务端的回应,没有办法客户端只能认为失败了。在重发一次吧。这个时候客户端就必须把固定报头里面的DUP加1了。但是服务端事实上没有问题,并且开始给符合主题的客户端们发分信息了。只是可能这一段时间正在处理一些事情,回应慢了。

4)客户端终于接收到了回应(PUBACK),结束了。

2、PUBLIC报文介绍

发布报文的格式比较单简。即然是发布报文那么主题和发布的内容是一定少了的。所以相对于别的报文来讲,发布报文对固定报头,可变报头,还有有效载荷都有需要

1、固定报头,占2个字节

看列表就是他的固定报头的二进制是00110000或是00110010或是00110100。分别对应QOS 0,QOS 1,QOS2

注意下:第一个字节8个位中4到7位表示报文类型,0到3位表示Qos级别?

2、可变报头,占N个字节

可变报头里面存放了俩个信息对服务端来讲很重要。一个是主题长度,一个是主题内容。除了这俩个没有别的了,表明是向哪个主题发布消息,发布的具体内容在有效载荷里出现。比如向“topic"发布消息的话,主题长度就是5,主题内容就是topic,但是向这个主题topic发布的消息内容是什么呢?是温度还是产量,这个具体的消息内容在后面的”有效载荷“里出现。

3、有效载荷,占N个字节

有效载荷就是要发布的具体内容,可以是设备的水位,汽车电量什么的,因为内容是不同的,所以占N个字节,它的出现必须按:消息标识package identifier,消息长度,消息内容的顺序依次出场,比如要发布用水量45,那么消息长度就是2,消息内容就是45。比如在一个客户端中:

3、PUBACK报文介绍

这里只介绍Qos0和Qos1的回应报文介绍,Qos2的回应报文复杂得多,不去搞它。

1、固定报头,占2个字节

?第1个字节,返回是4,这是固定的

?第2个字节,返回的是剩余字节长度

2、可变报头

对于PUBACK 报文的可变报头里面也只有一个消息ID,专业名称叫package identifier。而且跟PUBLISH报文的消息ID是一样子的。

3、有效载荷

没有

3、小结

发布报文publish和puback就是这些,相对来说,简单一些,但涉及到Qos的定义,小伙伴们慢慢来,不急,一回生,二回熟,三回精。

讲解不易,分析不易,原创不易,整理不易,伙伴们动动你的金手指,你的支持是我最大的动力。

文章来源:https://blog.csdn.net/hqwest/article/details/135592762
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。