我是靠谱客的博主 甜甜蜡烛,最近开发中收集的这篇文章主要介绍【基础】MQTT 协议基础MQTT 协议简介MQTT 数据包结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MQTT

  • MQTT 协议简介
    • 发布和订阅
    • QoS
      • QoS 0
      • QoS 1
      • QoS 2
  • MQTT 数据包结构
    • 固定头 Fixed Header
    • 可变头 Variable Header
    • 消息体 Payload

MQTT 协议简介

MQTT 全称 Message Queuing Telemetry Transport,即消息队列遥测传输协议,是一种基于客户端/服务器的、发布/订阅模式的轻量级的通讯协议。

该协议构建与 TCP/IP 协议之上,可以使用少量的代码和有限的带宽为远程设备连接提供实时可靠的消息服务,故其在物联网、小型设备以及移动应用等方面应用广泛。

发布和订阅

MQTT 基于发布/订阅模式提供一对多的消息分发机制,消息并不是采用点对点的方式进行传递,而是通过 MQTT 服务器(broker)进行消息的分发。

在这里插入图片描述

QoS

为保证消息的稳定传输,MQTT 提供了 3 种不同的服务质量,即 QoS(Quality of Service)。

QoS 是消息的发送方 Sender 与接收方 Receiver 之间达成的协议。

QoS 0

意味着 Sender 发送一条消息,Receiver 至多可以收到一次。即 Sender 发送消息后便不再询问,无论消息发送成功或失败,因此 Receiver 最多仅可能收到一次消息。

在这里插入图片描述

QoS 1

意味着 Sender 发送一条消息,Receiver 至少可以收到一次。Sender 在发送消息结束后,持续等待 Receiver 的接收应答,若没有收到应答,则会继续重新发送消息,直到接收到应答为止,因此 Receiver 至少收到一次消息,并且该模式下 Receiver 可能收到重复的消息。

在这里插入图片描述

QoS 2

意味着 Sender 发送一条消息,Receiver 确保可以收到且仅收到一次。Sender 在发送消息后,首先将消息保存本地,并等待 Receiver 应答。接收到应答之后,根据应答包内容找到本地对应的消息并删除。若长时间没有得到 Receiver 应答,Sender 会重新发送数据,并重复上述过程,因此 Receiver 可以确保消息收到且仅收到一次。
在这里插入图片描述

MQTT 数据包结构

MQTT 数据包结构主要分为 3 部分:

  • 固定头(Fixed Header):存在于所有 MQTT 数据包当中,标识数据包的类型以及分组

  • 可变头(Variable Header):存在于部分 MQTT 数据包当中,标识可变头是否存在以及其具体内容

  • 消息体(Payload):存在于部分 MQTT 数据包当中,标识消息的具体内容

在这里插入图片描述

固定头 Fixed Header

固定头结构的前四个比特位(7-4)标识 MQTT 的消息类型,具体标识和描述如下:

消息类型流向描述
0000Resevered保留
0001CONNECT客户端 -> 服务端客户端请求连接到服务器
0010CONNACK服务端 -> 客户端连接确认
0011PUBLISH双向发布消息
0100PUBACK双向发布确认
0101PUBREC双向发布收到
0110PUBREL双向发布释放
0111PUBCOMP双向发布完成
1000SUBSCRIBE客户端 -> 服务端客户端请求订阅
1001SUBACK服务端 -> 客户端订阅确认
1010UNSUBSCRIBE客户端 -> 服务端客户端请求取消订阅
1011UNSUBACK服务端 -> 客户端取消订阅确认
1100PINGREQ客户端 -> 服务端PING 请求
1101PINGRESP服务端 -> 客户端PING 应答
1110DISCONNECT客户端 -> 服务端中断连接
1111Resevered保留

固定头结构的后四位(3-0)作为标识位使用,在不使用标识位的消息类型当中,标识位作为保留位使用。在 PUBLISH 消息类型中,后四位的标识信息如下:

消息类型Bit 3Bit 2Bit 1Bit 0
PUBLISHDUPQosQosRETAIN
  • DUP:用于保证消息的可靠传输,若设置为 1,则在下边的边长中传递 MessageId,并需要回复确认消息以保证消息传输完成

  • QoS:两比特位 QoS 用于标识服务质量,00 代表 Qos 0,01 代表 QoS 1,10 代表 QoS 2,11 为预留位

  • RETAIN:用于标识本消息是否需要服务端保留,若有新的订阅者出现,则将该消息推送给新的订阅者

可变头 Variable Header

可变头位于固定头和消息负载之间,其内容根据消息类型不同而不同,一般作为包的标识使用。

Bit7 - 0
Byte 1包标签符(MSB)
Byte 2包标签符(LSB)

消息体 Payload

消息体用于传输具体的信息,在不同消息类型中传输的内容不同,主要存在于一下消息体中:

消息类型消息体内容
CONNECT客户端的 clientID、订阅的 topic、消息内容 Message、用户名及密码
SUBSCRIBE订阅的主题、QoS
SUBACK对 SUBCRIBE 所申请订阅的主题和 QoS 进行回复
UNSUBCRIBE订阅的主题

最后

以上就是甜甜蜡烛为你收集整理的【基础】MQTT 协议基础MQTT 协议简介MQTT 数据包结构的全部内容,希望文章能够帮你解决【基础】MQTT 协议基础MQTT 协议简介MQTT 数据包结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部