一文读懂物联网 MQTT 协议之基础特性篇(1)

3.2 MQTT Broker

与 MQTT Client 对应的就是 MQTT Broker,Broker 是任何发布/订阅协议的核心,根据实现的不同,代理可以处理多达数百万连接的 MQTT Client。

Broker 负责接收所有消息,过滤消息,确定是哪个Client 订阅了每条消息,并将消息发送给对应的 Client,Broker 还负责保存会话数据,这些数据包括订阅的和错过的消息。Broker 还负责客户端的身份验证和授权。

3.3 MQTT Connection

MQTT 协议基于 TCP/IP。客户端和代理都需要有一个 TCP/IP 协议支持。

在这里插入图片描述

MQTT 连接始终位于一个客户端和代理之间。客户端从不直接相互连接。要发起连接,客户端向代理发送 CONNECT 消息。代理使用 CONNACK 消息和状态代码进行响应。建立连接后,代理将保持打开状态,直到客户端发送断开连接命令或连接中断。

在这里插入图片描述

四、消息列表


4.1 CONNECT

为了创建连接,客户端向代理发送命令消息。如果此 CONNECT 消息格式错误(根据 MQTT 规范)或打开网络套接字和发送连接消息之间的时间过长,代理将关闭连接。

一个 MQTT 客户端发送一条 CONNECT 连接,这条 CONNECT 连接可能会包含下面这些信息:

在这里插入图片描述

我们将重点关注以下选项:

  • ClientId:ClientId 的长度可以是 1-23 个字符,在一个服务器上 ClientId 不能重复。如果超过 23 个字符,则服务器返回 CONNACK 消息中的返回码为 Identifier Rejected。在 MQTT 3.1.1 中,如果您不需要代理持有状态,您可以发送一个空的 ClientId。空的 ClientId 导致连接没有任何状态。在这种情况下,clean session 标志必须设置为 true,否则代理将拒绝连接。

  • Clean Session:Clean Session 标志告诉代理客户端是否要建立持久会话。在持久会话 (CleanSession = false) 中,代理存储客户端的所有订阅以及以服务质量(QoS)级别 1 或 2 订阅的客户端的所有丢失消息。 如果会话不是持久的 (CleanSession = true ),代理不为客户端存储任何内容,并清除任何先前持久会话中的所有信息。

  • Username/Password:MQTT 可以发送用户名和密码进行客户端认证和授权。但是,如果此信息未加密或散列,则密码将以纯文本形式发送。我们强烈建议将用户名和密码与安全传输一起使用。像 HiveMQ 这样的代理可以使用 SSL 证书对客户端进行身份验证,因此不需要用户名和密码。

  • Will Message:LastWillxxx 表示的是遗愿,client 在连接 broker 的时候将会设立一个遗愿,这个遗愿会保存在 broker 中,当 client 因为非正常原因断开与 broker 的连接时,broker 会将遗愿发送给订阅了这个 topic(订阅遗愿的 topic)的 client。

  • KeepAlive:keepAlive 是 client 在连接建立时与 broker 通信的时间间隔,通常以秒为单位。这个时间指的是 client 与 broker 在不发送消息下所能承受的最大时长。

4.2 CONNACK

当 broker 收到 CONNECT 消息时,它有义务回复 CONNACK 消息进行响应。CONNACK 消息包括两部分内容:

  • The session present flag:会话当前标志

  • A connect return code:连接返回码

在这里插入图片描述

  • Session Present flag

会话当前标志,这个标志会告诉 client 当前 broker 是否有一个持久性会话与 client 进行交互。SessionPresent 标志和 CleanSession 标志有关,当 client 在 CleanSession 设置为 true 的情况下连接时,SessionPresent 始终为 false,因为没有持久性会话可以使用。如果 CleanSession 设置为 false,则有两种可能性,如果 ClientId 的会话信息可用,并且 broker 已经存储了会话信息,那么 SessionPresent 为 true,否则如果没有 ClientId 的任何会话信息,那么 SessionPresent 为 false。

在这里插入图片描述

  • Connect return code

CONNACK 消息中的第二个标志是连接确认标志。这个标志包含一个返回码,告诉客户端连接尝试是否成功。连接确认标志有下面这些选项:

在这里插入图片描述

4.3 PUBLISH

MQTT 客户端可以在连接到 broker 后立即发布消息,MQTT 使用的是基于 topic 主题的过滤。每条消息都必须包含一个主题,broker 可以使用该主题将消息转发给感兴趣的客户端。通常,每条消息都有一个负载(Payload),其中包含要以字节格式传输的数据。MQTT 是数据无关性的,也就是说数据是由发布者 - publisher 决定要发送的是 XML 、JSON 还是二进制数据、文本数据。

MQTT 中的 PUBLISH 消息有几个我们想要详细讨论的属性:

在这里插入图片描述

  • Topic Name:主题名称是一个简单的字符串,它以正斜杠作为分隔符进行分层结构。例如,“我的家/客厅/温度”或“德国/慕尼黑/十月节/人”。

  • QoS:此数字表示消息的服务质量 (QoS)。有三个级别:0、1 和 2。服务级别决定了消息到达预期接收者(客户端或代理)的保证类型。

  • Retain Flag:此标志表示 broker 将最近收到的一条 RETAIN 标志位为 true 的消息保存在服务器端(内存或者文件)。

  • Payload:这个是每条消息的实际内容。MQTT 是数据无关性的。可以发送任何文本、图像、加密数据以及二进制数据。

  • Packet Identifier:这个 packetId 标识在 client 和 broker 之间唯一的消息标识。packetId 仅与大于零的 QoS 级别相关。

  • DUP flag: 该标志表明该消息是重复的并且由于预期的接收者(客户端或代理)没有确认原始消息而被重新发送。这仅与 QoS 大于 0 相关。

当客户端向 MQTT broker 发送消息进行发布时,broker 读取消息、确认消息(根据 QoS 级别)并处理消息。broker 的处理包括确定哪些客户端订阅了主题并将消息发送给他们。

在这里插入图片描述

最初发布消息的客户端只关心将 PUBLISH 消息传递给 broker。一旦 broker 收到 PUBLISH 消息,broker 就有责任将消息传递给所有订阅者。发布客户端不会得到关于是否有人对发布的消息感兴趣或有多少客户端从 broker 收到消息的任何反馈。

4.4 Subscribe

client 会向 broker 发送 SUBSCRIBE 消息来接收有关感兴趣的 topic,这个 SUBSCRIBE 消息非常简单,它包含了一个唯一的数据包标识和一个订阅列表。

在这里插入图片描述

  • Packet Identifier:这个 PacketId 和上面的 PacketId 一样,都表示消息的唯一标识符。

  • List of Subscriptions:一个 SUBSCRIBE 消息可以包含一个客户端的多个订阅。每个订阅由一个主题和一个 QoS 级别组成。订阅消息中的主题可以包含通配符,使订阅主题模式而不是特定主题成为可能。如果一个客户端存在重叠订阅,则代理会传送该主题具有最高 QoS 级别的消息。

4.5 Suback

为了确认每个订阅,broker 向客户端发送一个 SUBACK 确认消息。该消息包含原始 Subscribe 消息的数据包标识符(以明确标识该消息)和返回码列表。

在这里插入图片描述

  • Packet Identifier:包标识符是用于标识消息的唯一标识符。它与 SUBSCRIBE 消息中的相同。

  • Return Code:broker 为它在 SUBSCRIBE 消息中收到的每个主题/QoS 对发送一个返回代码。例如,如果 SUBSCRIBE 消息有五个订阅,则 SUBACK 消息包含五个返回码。返回码确认每个主题并显示 broker 授予的 QoS 级别。如果 broker 拒绝订阅,则 SUBACK 消息包含该特定主题的失败返回代码。例如,如果客户端没有足够的权限订阅主题或主题格式错误。

在这里插入图片描述

在这里插入图片描述

客户端成功发送 SUBSCRIBE 消息并收到 SUBACK 消息后,它会获取与 SUBSCRIBE 消息包含的订阅中的主题匹配的每条已发布消息。

4.6 Unsubscribe

SUBSCRIBE 消息的对应是 UNSUBSCRIBE 消息。此消息删除 broker 上客户端的现有订阅。UNSUBSCRIBE 消息与 SUBSCRIBE 消息类似,具有数据包标识符和主题列表。

在这里插入图片描述

4.7 Unsuback

为了确认取消订阅,broker 向客户端发送一个 UNSUBACK 确认消息。此消息仅包含原始 UNSUBSCRIBE 消息的数据包标识符(以明确标识该消息)。

在这里插入图片描述

在这里插入图片描述

客户端收到来自 broker 的 UNSUBACK 后,可以认为 UNSUBSCRIBE 消息中的订阅被删除了。

五、Topics


前面我们说了很多 MQTT 协议的格式以及消息列表,这一节我们来说下 Topics 主题。主题在 MQTT 中很重要,因为我们写代码的时候往往都是需要先确认好 MQTT 的 Topics。

在 MQTT 中,主题一词是指 broker 用于为每个连接的客户端过滤消息的 UTF-8 字符串。主题由一个或多个主题级别组成。每个主题级别由正斜杠(主题级别分隔符)分隔。

在这里插入图片描述

与消息队列相比,MQTT 主题非常轻量级。客户端在发布或订阅它之前不需要创建所需的主题。broker 接受每个有效主题而无需任何事先初始化。

5.1 通配符

当客户端订阅主题时,它可以订阅已发布消息的确切主题,也可以使用通配符同时订阅多个主题。通配符只能用于订阅主题,不能用于发布消息。有两种不同类型的通配符:单级和多级。

  • 单级:+

顾名思义,单级通配符替换一个主题级别。加号代表主题中的单级通配符。

在这里插入图片描述

如果主题包含任意字符串而不是通配符,则任何主题都与具有单级通配符的主题匹配。例如,订阅myhome/groundfloor/+/temperature可以产生以下结果:

在这里插入图片描述

  • 多级:#

多级通配符涵盖多个主题级别。哈希符号代表主题中的多级通配符。为了让代理确定哪些主题匹配,多级通配符必须作为主题中的最后一个字符放置,并以正斜杠开头。

在这里插入图片描述

当客户端订阅带有多级通配符的主题时,无论主题多长或多深,它都会收到以通配符之前的模式开头的主题的所有消息。如果您仅将多级通配符指定为主题 ( # ),您将收到发送到 MQTT 代理的所有消息。如果您期望高吞吐量,单独使用多级通配符订阅是一种反模式(请参阅下面的最佳实践)。

5.2 以 $ 开头的主题

通常,您可以根据需要命名 MQTT 主题。但是,有一个例外:以 $ 符号开头的主题具有不同的目的。当您将多级通配符作为主题 (#) 订阅时,这些主题不是订阅的一部分。$-symbol 主题保留用于 MQTT 代理的内部统计信息。客户端无法向这些主题发布消息。目前,此类主题尚无官方标准化。通常,$SYS/用于所有以下信息,但代理实现各不相同。MQTT GitHub wiki 中提供了对 $SYS-topics 的一项建议 。这里有些例子:

$SYS/broker/clients/connected

$SYS/broker/clients/disconnected

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
715187042724)]

[外链图片转存中…(img-nWzcA7mK-1715187042724)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值