**QoS**
QoS
MQTT 设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种
不同级别的 QoS(Quality of Service),也就是 MQTT 协议有三种服务质量等级:
QoS = 0****:最多发一次;
QoS = 1****:最少发一次;
QoS = 2****:保证收一次。
QoS是0
服务质量是0的时候,MQTT服务器和客户端不会对消息的传输成功进行确认和检查。全看环境是否稳定。
发送一次之后就不管了,不管发送和失败
Qos是1
服务质量是1的时候,在消息发送完成之后,会检查接收端是否接收到了信息
,但不能保证接收端一次数据只接收一次,可能会出现多次接收
发送端向接收端发送 PUBLISH 报文,当接收端收到 PUBLISH 报文后会向发送端回复一个 PUBACK 报
文,如果发送端收到 PUBACK 报文,那么它就知道消息已经被接收端成功接收!
假如过了一段时间后,发送端没有收到 PUBACK 报文,那么发送端会再次发送消息(发送 PUBLISH报文),然后再次等待接收端的 PUBACK 确认报文,并且会将dup标志设置为true。因此,当 QoS=1 时,发送端在一定时间内没有收到接收端的 PUBACK 确认报文,会重复发送同一条消息。
注意:即使接收方真的接收到了,如果向发送方发送的反馈信号丢失,也会启动重新发送。这样的话就会出现接收端接收同一条消息多次
Qos是2
xxxxxxxxxx12 1// 伪代码,具体寄存器配置因芯片而异(比如STM32的DMA)2DMA_Config dma;3dma.src_addr = (uint32_t)src_buffer;4dma.dest_addr = (uint32_t)dest_buffer;5dma.length = 1024 * 1024; // 1MB6DMA_Start(&dma);78// CPU发起这个请求后就可以去干别的事了,DMA控制器(独立于CPU的硬件电路)9// 会在总线上直接把数据从src地址硬件级别地搬到dest地址,全程不占用CPU的运算资源10while (!DMA_IsComplete()) {11 // CPU可以在这里跑别的任务,甚至进入低功耗模式等中断唤醒12}c
为了确保接收端只接收到一次消息,PUBLISH 报文的收发过程相对更加复杂。发送端需要接收端进行两次消息确认,因此,2 级 MQTT 服务质量是最安全的服务级别,也是最慢的服务级别

①、首先发送端向接收端发送 PUBLISH 报文;
②、接收端接收到 PUBLISH 报文后,向发送端回复一个 PUBREC 报文(官方称其为--发布收到);
③、发送端接收到 PUBREC 报文后,会再次向接收端发送 PUBREL 报文(官方称其为--发布释放);
④、接收端接收到 PUBREL 报文后,会再次向发送端回复一个 PUBCOMP 报文(官方称其为--发布完
成),如果发送端接收到 PUBCOMP 报文表示消息传输成功,它确认接收端已经成功接收到消息,整个过
程结束!
发送一次消息,本来双方都只需要一个操作箭头就行了

