【基础】MQTT -- MQTT 协议详解

这篇具有很好参考价值的文章主要介绍了【基础】MQTT -- MQTT 协议详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文内容针对 MQTT 3.1.1 版本,从连接、发布与订阅等方面对协议内容进行介绍。

MQTT 基础内容可以参看文章:【基础】MQTT – MQTT 协议基础

与 Broker 建立连接

客户端 Client 在进行消息的订阅与发布之前,需要与 Broker 服务器进行连接:

  • Client 向 Broker 发送 CONNECT 数据包;

  • Broker 接收到 CONNECT 数据包后,若允许 Client 接入,则生成返回码为 0 的 CONNACK 包表示连接建立成功;若允许接入则生成返回码为非零值的 CONNACK 包以标识接入失败原因,并断开 TCP 连接;

CONNECT 数据包

数据包结构包括固定头、可变头以及消息体三部分。

固定头

固定头中字节1的高四位为 1 标识为 CONNECT 数据包,如下图所示。

【基础】MQTT -- MQTT 协议详解

可变头

可变头由四部分构成,分别为协议名称、协议版本、连接标识以及 Keepalive。

协议名称是一个 UTF-8 编码的字符串,该字符串存在两个字节的前缀用于指示字符串的长度。协议名称的值固定为“MQTT”,加上长度指示字段共 6 个字节,入下图所示。

若协议的名称不正确,Broker 将会断开与 client 的连接。

【基础】MQTT -- MQTT 协议详解

协议版本占据一个字节,是一个无符号的整数,MQTT 3.1.1 版本的版本号为 4,如下图。

【基础】MQTT -- MQTT 协议详解

连接标识占据一个字节,字节不同的位用于标识不同的连接选项,如下所示。

  • 用户名标识(User Name Flag):标识消息体中是否含有用户名字段,占据 1 bit,取值为 0 或 1;

  • 密码标识(Password Flag):标识消息体重是否含有密码字段,占据 1bit,取值为 0 或 1;

  • 遗嘱消息 Retain 标识(Will Retain):标识遗嘱消息是否为 Retain 消息,占据 1 bit,取值为 0 或 1;

  • 遗嘱消息 QoS 标识(Will QoS):标识遗嘱消息的 QoS,占据 2 bit,取值为 0、1、2;

  • 遗嘱标识(Will Flag):标识是否使用遗嘱消息,占据 1 bit,取值为 0 或 1;

  • 会话清除标识(Clean Session):标识 client 是否建立持久会话,占据 1 bit,取值为 0 或 1。当该标识为 0 时代表建立持久化连接,Broker 将存储该 client 订阅的主题和未接收的消息;若标识为 1 则 Broker 不会存储上述数据,同时会在建立连接时清除之前保存的该 client 的数据。

【基础】MQTT -- MQTT 协议详解

Keepalive 占据两个字节,代表连接保活设置,该设置是一个单位为秒的时间间隔,在所设置的时间间隔内 Broker 与 client 至少要由一次消息交互,否则 Broker 与 client 会认为他们之间的连接已经断开。

【基础】MQTT -- MQTT 协议详解

消息体

消息体可存在五部分内容,分别为客户端标识符、遗嘱主题、遗嘱 QoS、遗嘱消息、用户名和密码。处客户端标识符外,其余四部分内容是可选的,根据可变头内的对应标识来判断相应的内容是否存在。

消息体包含有两个字节的前缀,用于指示数据内容的长度,如下图所示。

【基础】MQTT -- MQTT 协议详解

消息体内容详情如下:

  • 客户端标识符(Client Identifier):用于标识 Client 的字段。MQTT 3.1.1中该字段的长度为 1~23 个字节,且只能包含数字和英文字母的大小写。Broker 通过该字段唯一标识 Client。(MQTT 协议中要求 Client 在连接时必须携带客户端标识符,但也允许 Broker 实现连接时接受标识符为空的 CONNECT 数据包,此时该客户端的标识由 Broker 唯一分配。若需要使用持久性会话,则必须为 Client 设定一个唯一的标识符);

  • 用户名(Username):若可变头中用户名标识为 1,则证明消息体中包含用户名字段,Broker 可根据用户名和密码对接入的 Client 进行身份校验。(不同的 Client 需要使用不用的客户端标识符,但可以使用相同的用户名密码进行连接,类似于端游的客户端);

  • 密码(Password):若可变头中密码标识为 1,则证明消息体中包含密码字段;

  • 遗嘱主题(Will Topic):若可变头中遗嘱标识为 1,则证明消息体中将包含遗嘱主题。当 Client 非正常断开连接时,Broker 将向指定的主题发布遗嘱消息;

  • 遗嘱消息(Will Message):若可变头中遗嘱标识为 1,则证明消息体中将包含遗嘱消息。当 Client 非正常断开连接时,Broker 将向指定的遗嘱主题发布遗嘱消息字段的内容;

CONNACK 数据包

当 Broker 收到 Client 发送的 CONNECT 数据包后,将会检查并校验数据报的内容,然后回复 CONNACK 数据包给 Client。

固定头

固定头中的数据包类型字段值为 2 代表 CONNACK 数据包,且其数据包剩余长度固定为 2。

【基础】MQTT -- MQTT 协议详解

可变头

可变头包含两个字节,分别指示连接确认标识和连接返回码:

  • 连接确认标识:高 7 位都是保留的,必须设置为 0;最后 1 位为会话存在标识,值为 0 或者 1。若 Client 连接时设置的 Clean Session = 1,则该值始终为 0;若 Client 连接时设置的 Clean Session = 0,则存在两种情况:当 Broker 中保存了该 Client 之前的持久性会话时,该值为 1,若不存在会话数据,则该值为 0。

  • 返回码:用于标识 Client 与 Broker 的连接是否建立成功:

    • 0:表示连接已建立;

    • 1:表示连接被拒绝,不允许的协议版本;

    • 2:表示连接被拒绝,Client Identifier 被拒绝(格式不规范);

    • 3:表示连接被拒绝,服务器不可用;

    • 4:表示连接被拒绝,错误的用户名或密码;

    • 5:表示连接被拒绝,未授权(该返回码一般用于不使用用户名和密码而使用 ip 地址和 Client Identifier 进行验证时标识客户端没有通过验证);

消息体

CONNACK 数据包没有消息体。

断开连接

MQTT 协议中,断开连接可以由 Client 或 Broker 二者任意一方发起。

Client 主动断开连接

Client 主动断开连接需要向 Broker 发送一个 DISCONNECT 数据包,该数据包只存在固定头,不存在可变头和消息体。

Broker 主动断开连接

MQTT 协议规定,在没有收到 Client 的 DISCONNECT 数据包之前都应该保持连接,只有当 Broker 在 Keepalive 的时间间隔内没有收到 Client 发送的任何 MQTT 协议数据包时才会主动断开连接。

Broker 在主动断开连接之前不需要像 Client 发送任何数据包,直接关闭底层 TCP 连接即可。

DISCONNECT 数据包

主动断开连接的数据包主要涉及 MQTT 遗嘱消息的特性,Broker 会依据该数据包断定 Client 是正常断开连接。若直接断开 TCP 连接,则 Broker 会认为是异常断开,则会向指定的主题推送遗嘱消息。

固定头

【基础】MQTT -- MQTT 协议详解

订阅与发布

这里需要首先明确两组概念:发布者(Pubhsher)和订阅者(Subscriber)、发送方(Sender)和接收方(Receiver)。

发布者(Pubhsher)和订阅者(Subscriber)

Pubhsher 与 Subscriber 是相对于 Topic 来说的概念,其对象只能是 Client。当一个 Client 向某个 Topic 推送消息时,那么它就是发布者;当 Client 订阅了某个 Topic,那么它就是订阅者。

发送方(Sender)和接收方(Receiver)

Sender 与 Receiver 是相对于消息来说的概念,其对象可以为 Broker 或者 Client。谁输出消息,谁就是发送方;消息的送达点则为接收方。

PUBLISH 数据包

PUBLISH 包用于在 Sender 与 Receiver 之间传输消息数据。

固定头

固定头中数据包类型字段值为 3 标识 PUBLISH 数据包,当前字节的低四位为标识位,存在如下三个字段:

  • 消息重复标识(DUP):占据 1 bit,值为 0 或 1。当该字段值为 1 时,表示该消息是一条重发消息,因为接收方没有确认收到之前的消息。该标识只在 QoS 大于 0 时使用;

  • QoS:占据 2 bit,值为 0、1、2,该字段代表 PUBLISH 消息的服务质量级别;

  • 保留标识(Retain):占据 1 bit,值为 0 或 1。当消息的发送方为 Client 且该字段为 1 时,表示 Broker 应保存该消息,并在之后有新的 Client 订阅该消息中指定的主题时主动向该客户端推送该条消息(这种消息也被称为 Retain 消息);当消息的发送方为 Broker 且该字段为 1 时,表示该消息是一条 Retain 消息;

固定头结构如下所示:

【基础】MQTT -- MQTT 协议详解

可变头

PUBLISH 数据包的可变头包含两部分信息:主题名以及包标识符,其中包标识符仅在 QoS 为 1 或 2 的 PUBLISH 数据包中存在。

主题名是一个 UTF-8 编码的字符串,其前两个字节用于指示主题字符串的长度,因此主题名的最大长度为 65535 字节。

主题的命名建议遵守下列规范:

  • 主题名称应包含层级,不同的层级之间使用\划分;

  • 主题名称开头不要使用\

  • 主题中不要使用空格;

  • 主题只使用 ASCII 字符;

  • 主题名称应在保证可读性的前提下尽量短;

  • 主题名称对大小写敏感;

  • 可以将设备的唯一标识添加到主题当中;

  • $开头的主题为 Broker 的预留主题,应用程序不要使用该字符开头的主题;

可变头的结构如下所示:

【基础】MQTT -- MQTT 协议详解

消息体

PUBLISH 数据包的消息体中即要发送的额数据,其可以为任意格式的数据(二进制数据、JSON、文本…)。消息体的长度可以用固定头中的数据包剩余长度减去可变头的长度获取。

SUBSCRIBE 数据包

Client 若想接收某个主题的消息,则需要向 Broker 发送 SUBSCRIBE 数据包订阅对应主题。

固定头

固定头中数据包类型字段的值为 8,表示 SUBSCRIBE 数据包。

【基础】MQTT -- MQTT 协议详解

可变头

可变头内容为包标识符,占据两字节。数据包标识需要保证从 Sender 到 Receiver 的一次消息交互中唯一。

【基础】MQTT -- MQTT 协议详解

消息体

SUBSCRIBE 数据包的消息体由 Client 要订阅的主题列表构成。其主题名可以包含通配符,包括单层通配符+和多层通配符#。使用通配符可以订阅满足匹配条件的所有主题。通常将该包中的主题名称为主题过滤器。

其中:

  • 单层通配符可用于指代任意一个层级,例如company/2ndfloor/+/electric

  • 多层通配符可用于指代任意多个层级,但其必须用在/后面,且必须为最后一个字符,例如company/2ndfloor/#

每一个主题过滤器都是一个 UTF-8 编码的字符串,该字符串后会跟着一个字节用于描述订阅该主题的 QoS,其格式如下:

【基础】MQTT -- MQTT 协议详解

SUBACK 数据包

Broker 在收到 SUBSCRIBE 数据包后,都会回复一个 SUBACK 数据包作为应答。

固定头

固定头中的数据包类型字段为 9 标识 SUBACK 数据包。

【基础】MQTT -- MQTT 协议详解

可变头

可变头仅包含占据两个字节的包标识符。

【基础】MQTT -- MQTT 协议详解

消息体

SUBACK 数据包的消息体包含一组返回码,返回码的数量与 SUBSCRIBE 数据包的订阅列表相对应,用于指示订阅结果。

返回码及其含义如下所示:

  • 0:订阅成功,且最大可用 QoS 为 0;

  • 1:订阅成功,且最大可用 QoS 为 1;

  • 2:订阅成功,且最大可用 QoS 为 2;

  • 128:订阅失败;

【基础】MQTT -- MQTT 协议详解

UNSUBSCRIBE 数据包

UNSUBSCRIBE 数据包用于取消某些主题的订阅。

固定头

固定头中数据包类型字段的值为 10,表示 UNSUBSCRIBE 数据包。

【基础】MQTT -- MQTT 协议详解

可变头

可变头仅包含占据两个字节的包标识符。

【基础】MQTT -- MQTT 协议详解

消息体

UNSUBSCRIBE 数据包的消息体主要包含要取消的主题过滤器列表,主题过滤规则与 SUBSCRIBE 数据包规则相同,但是不包含 QoS 字段。

需要注意,在取消订阅时,主题名中的通配符不起作用,仅作为字符使用。当且仅当取消订阅的主题名的每一个字符都与订阅时指定的主题名相同时,才会取消主题的订阅。

【基础】MQTT -- MQTT 协议详解

UNSUBACK 数据包

Broker 在收到 UNSUBSCRIBE 后,会回复给 Client 一个 UNSUBACK 包作为响应。

固定头

固定头中数据包类型字段的值为 11,表示 UNSUBACK 数据包。

【基础】MQTT -- MQTT 协议详解

可变头

可变头仅包含占据两个字节的包标识符。

【基础】MQTT -- MQTT 协议详解

消息体

UNSUBACK 数据包不存在消息体。文章来源地址https://www.toymoban.com/news/detail-487832.html

到了这里,关于【基础】MQTT -- MQTT 协议详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是MQTT,物联网MQTT协议详解

    老俊目前正在从事物联网行业,对MQTT有一定的了解,本文为您简述什么是MQTT,以及MQTT怎么使用 物联网 (IoT) 和机器对机器 (M2M) 通信对我们与技术交互的方式产生了持久影响。到 2022 年底,全球连接的物联网设备数量增长了 18%,达到 144 亿, 到 2025 年估计连接的物联网设备将

    2024年02月12日
    浏览(40)
  • MQTT协议版本Mosquitto移植到嵌入式arm平台

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智

    2024年02月06日
    浏览(41)
  • Mqtt通信协议详解

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级” 通讯协议 ,该协议构建于TCP/IP协议上。 mqtt实现:需要客户端和服务端,不同的客户端通过服务端来获取消息,服务端相当于是个中转站,与各个客户端相连

    2024年02月15日
    浏览(27)
  • 【数据结构】C--顺序表1.0版本(本文非常适合小白观看,已尽力详解,以及图解也是尽量列举)

    目录 0.前言 什么是数据结构? 1.逻辑结构: 1.1线性结构: 1.2非线性结构:         (1)集合         (2)树形结构         (3)图形结构或者网状结构 2.存储结构 一.线性表 二.顺序表 顺序表与数组的关系:(非常容易混淆) 1.静态顺序表:使用定长数组存储元素 2.动态顺序表

    2024年02月06日
    浏览(39)
  • 基于OpenWrt使用MQTT物联网协议详解和应用

    大家好,这篇文章给大家介绍MQTT协议以及如何在OpenWrt系统中使用MQTT客户端和开发,并给出相关实例代码。 MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,设计用于在低带宽和不稳定的网络环境中传输消息。它最初由IBM开发,用于连接远程设备和传感器到网络,

    2024年02月02日
    浏览(45)
  • HTTP超本文传输协议

    HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。 HTTP基于TCP/IP通信协议 来传递数据。 HTTP协议工作于客户端-服务端

    2024年02月16日
    浏览(30)
  • 【001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂】

    学历代表过去、能力代表现在、学习力代表将来。 一个良好的学习方法是通过输出来倒逼自己输入。写博客既是对过去零散知识点的总结和复盘,也是参加了 零声教育 写博客活动。 零声教育体验课:https://xxetb.xetslk.com/s/3fbO81 本文是开发过程中的知识点总结,供大家学习交

    2024年04月22日
    浏览(25)
  • HTTP 协议 版本详解

    HTTP(Hypertext Transfer Protocol)是一种用于在客户端和服务器之间进行通信的协议。它是现代互联网中最常用的应用层协议之一。HTTP 的主要目的是实现超文本资源的传输,例如 HTML 文档、图像和音频文件等。 HTTP 使用客户端-服务器模型进行通信,其中客户端发送请求并等待服务

    2024年02月14日
    浏览(21)
  • Vue2.0针对设备调节显示内容方法

    一晚上完成0.2.2、0.3.0、0.3.1三个版本的更新,很高兴,总结一下 项目地址: 穆音博客 文章首发地址:Vue针对设备调节显示 总体来说有两种方法,其一是css的媒体查询,另一种是vue-mq库进行对设备断点,从而区分不同的设备,我这里用的是mq库进行。以下是使用方法: 使用

    2024年02月11日
    浏览(32)
  • DHCP协议详解,报文内容,如何查看报文,为什么offer报文会以广播的形式进行发送

    dhcp地址分配协议,目前有dhcpv4以及dhcpv6,分别作用于ipv4与ipv6的网络中。 主要作用:dhcp服务端通过dhcp协议下发ip地址给到客户端(pc,终端),使得pc能有上网的能力。 1.dhcp交互图 2.dhcp报文交互过程中,有大部分的报文都是广播报文。 客户端拥有ip前,是可以接收所有的广

    2024年02月06日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包