MQTT 协议入门:轻松上手,快速掌握核心要点

news2024/11/19 3:16:08

文章目录

  • 什么是 MQTT?
  • MQTT 的工作原理
    • MQTT 客户端
    • MQTT Broker
    • 发布-订阅模式
    • 主题
    • QoS
  • MQTT 的工作流程
  • 开始使用 MQTT:快速教程
    • 准备 MQTT Broker
    • 准备 MQTT 客户端
    • 创建 MQTT 连接
    • 通过通配符订阅主题
    • 发布 MQTT 消息
    • MQTT 功能演示
      • 保留消息
      • Clean Session
      • 遗嘱消息

在这里插入图片描述

什么是 MQTT?

MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。

MQTT 的工作原理

要了解 MQTT 的工作原理,首先需要掌握以下几个概念:MQTT 客户端MQTT Broker发布-订阅模式主题QoS

MQTT 客户端

任何运行 MQTT 客户端库的应用或设备都是 MQTT 客户端。例如,使用 MQTT 的即时通讯应用是客户端,使用 MQTT 上报数据的各种传感器是客户端,各种 MQTT 测试工具也是客户端。

MQTT Broker

MQTT Broker 是负责处理客户端请求的关键组件,包括建立连接、断开连接、订阅和取消订阅等操作,同时还负责消息的转发。一个高效强大的 MQTT Broker 能够轻松应对海量连接和百万级消息吞吐量,从而帮助物联网服务提供商专注于业务发展,快速构建可靠的 MQTT 应用。

发布-订阅模式

发布-订阅模式与客户端-服务器模式的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。

下图展示了 MQTT 发布/订阅过程。温度传感器作为客户端连接到 MQTT Broker,并通过发布操作将温度数据发布到一个特定主题(例如 Temperature)。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题(Temperature)的订阅者客户端。
在这里插入图片描述

主题

MQTT 协议根据主题来转发消息。主题通过 / 来区分层级,类似于 URL 路径,例如:

chat/room/1

sensor/10/temperature

sensor/+/temperature

MQTT 主题支持以下两种通配符:+ 和 #。

  • +:表示单层通配符,例如 a/+ 匹配 a/x 或 a/y。
  • #:表示多层通配符,例如 a/# 匹配 a/x、a/b/c/d。

注意:通配符主题只能用于订阅,不能用于发布。

QoS

MQTT 提供了三种服务质量(QoS),在不同网络环境下保证消息的可靠性。

  • QoS 0:消息最多传送一次。如果当前客户端不可用,它将丢失这条消息。
  • QoS 1:消息至少传送一次。
  • QoS 2:消息只传送一次。

MQTT 的工作流程

在了解了 MQTT 的基本组件之后,让我们来看看它的一般工作流程:

  1. 客户端使用 TCP/IP 协议与 Broker 建立连接,可以选择使用 TLS/SSL 加密来实现安全通信。客户端提供认证信息,并指定会话类型(Clean Session 或 Persistent Session)。
  2. 客户端既可以向特定主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它会将消息发送给 MQTT Broker;而当客户端订阅消息时,它会接收与订阅主题相关的消息。
  3. MQTT Broker 接收发布的消息,并将这些消息转发给订阅了对应主题的客户端。它根据 QoS 等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。

开始使用 MQTT:快速教程

下面我们将通过一些简单的示例来展示如何使用 MQTT。在开始之前,需要准备 MQTT Broker 和 MQTT 客户端。

准备 MQTT Broker

您可以选择私有部署或完全托管的云服务来建立自己的 MQTT Broker。或者您也可以使用免费的公共 Broker。

  • 私有部署
    EMQX 是最具扩展性的开源 MQTT Broker,适用于物联网、工业物联网和车联网。您可以运行以下 Docker 命令来安装 EMQX。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx
  • 全托管的云服务
    通过全托管的云服务启动 MQTT 服务是最便捷的方式。如下图所示,EMQX Cloud 可以在几分钟内启动,并在 AWS、Google Cloud 和 Microsoft Azure 的 17 个区域提供运行支持。

在这里插入图片描述

  • 免费的公共 MQTT Broker
    在本文中,我们将使用 EMQ 提供的免费公共 MQTT Broker,它基于完全托管的 MQTT 云服务 - EMQX Cloud 创建。服务器信息如下:
Server: broker.emqx.io

TCP Port: 1883

WebSocket Port: 8083

SSL/TLS Port: 8883

Secure WebSocket Port: 8084

准备 MQTT 客户端

在本文中,我们将使用 MQTTX 提供的支持浏览器访问的 MQTT 客户端工具,访问地址为 http://www.emqx.io/online-mqtt-client 。 MQTTX 还提供了桌面客户端命令行工具

MQTTX 是一款跨平台的 MQTT 5.0 桌面客户端,可在 macOS、Linux、Windows 操作系统上运行。其用户友好的聊天式界面使用户能够轻松创建多个 MQTT/MQTTS 连接,并进行 MQTT 消息的订阅和发布。

在这里插入图片描述

目前,各种编程语言都拥有成熟的开源 MQTT 客户端库。我们在流行的 MQTT 客户端库和 SDK 中精选了多个编程语言的 MQTT 客户端库,并提供了详细的代码示例,旨在帮助您快速了解 MQTT 客户端的使用。

创建 MQTT 连接

在使用 MQTT 协议进行通信之前,客户端需要创建一个 MQTT 连接来连接到 Broker。

在浏览器中打开 http://www.emqx.io/online-mqtt-client , 点击页面中间的 New Connection 按钮,将看到如下页面。

在这里插入图片描述

我们在 Name 中输入 Simple Demo,然后点击右上角的 Connect 按钮,建立一个 MQTT 连接。如下图所示,表示连接成功。

在这里插入图片描述

通过通配符订阅主题

接下来,我们在上面创建的 Simple Demo 连接中通过通配符订阅主题 sensor/+/temperature,这样就可以接收所有传感器发送的温度数据了。

如下图所示,点击 New Subscription 按钮,在弹出框中的 Topic 字段中输入主题 sensor/+/temperature,QoS 保持默认值 0。

在这里插入图片描述

订阅成功后,会在订阅列表的中间看到新增了一条记录。

在这里插入图片描述

发布 MQTT 消息

接下来,我们点击左侧菜单上的 + 按钮创建两个连接,分别命名为 Sensor 1Sensor 2,用来模拟两个温度传感器。

在这里插入图片描述

连接创建成功后,会看到三个连接,每个连接左侧的在线状态指示灯都是绿色的。

在这里插入图片描述

选择 Sensor 1 连接,在页面下方的发布主题中输入 sensor/1/temperature,在消息框中输入以下 JSON 格式的消息,然后点击右下方的发布按钮发送消息。

{
  "msg": "17.2"
}

在这里插入图片描述

如下图所示,消息发送成功。

在这里插入图片描述

使用相同的步骤,在 Sensor 2 连接中发布以下 JSON 消息到 sensor/2/temperature 主题。

{
  "msg": "18.2"
}

您会看到 Simple Demo 连接收到两条新消息。

在这里插入图片描述

点击 Simple Demo 连接,会看到两个传感器发送的两条消息。

在这里插入图片描述

MQTT 功能演示

保留消息

当 MQTT 客户端向服务器发布消息时,可以设置保留消息标志。保留消息存储在消息服务器上,后续订阅该主题的客户端仍然可以收到该消息。

如下图所示,我们在 Sensor 1 连接中勾选 Retain 选项,然后向 retained_message 主题发送两条消息。

在这里插入图片描述

接着,我们在 Simple Demo 连接中订阅 retained_message 主题。订阅成功后,会收到 Sensor 1 发送的第二条保留消息,这说明服务器只会为主题保留最近的一条保留消息。

在这里插入图片描述

Clean Session

MQTT 客户端通常只能在在线状态下接收其它客户端发布的消息。如果客户端离线后重新上线,它将无法收到离线期间的消息。

但是,如果客户端连接时设置 Clean Session 为 false,并且使用相同的客户端 ID 再次上线,那么消息服务器将为客户端缓存一定数量的离线消息,并在它重新上线时发送给它。

本次演示使用的公共 MQTT 服务器设置为缓存 5 分钟的离线消息,最大消息数为 1000 条,且不保存 QoS 0 消息。

下面,我们创建一个 MQTT 3.1.1 连接,并用 QoS 1 来演示 Clean Session 的使用。

MQTT 5.0 中将 Clean Session 拆分成了 Clean Start 与 Session Expiry Interval。

创建一个名为 MQTT V3 的连接,设置 Clean Session 为 false,选择 MQTT 版本为 3.1.1。

在这里插入图片描述

连接成功后,订阅 clean_session_false 主题,并将 QoS 设置为 1。

在这里插入图片描述

订阅成功后,点击右上角的断开按钮,断开连接。

在这里插入图片描述

然后,创建一个名为 MQTT_V3_Publish 的连接,MQTT 版本也设置为 3.1.1。连接成功后,向 clean_session_false 主题发布三条消息。

在这里插入图片描述

接着,选择 MQTT_V3 连接,点击连接按钮重新连接到服务器,会收到三条离线消息。

在这里插入图片描述

遗嘱消息

MQTT 客户端在向服务器发起 CONNECT 请求时,可以选择是否发送遗嘱消息标志,并指定遗嘱消息的主题和有效载荷。

如果 MQTT 客户端异常离线(在断开连接前没有向服务器发送 DISCONNECT 消息),MQTT 服务器会发布遗嘱消息。

我们创建一个名为 Last Will 的连接来演示这个功能。为了快速看到效果,我们把 Keep Alive 设置为 5 秒。

  • Last-Will Topic 设置为 last_will
  • Last-Will QoS 设置为 1
  • Last-Will Retain 设置为 true
  • Last-Will Payload 设置为 offline

在这里插入图片描述

连接成功后,我们断开电脑网络超过 5 秒(模拟客户端异常断开连接),然后再恢复网络。

接着启动 Simple Demo 连接,并订阅 last_will 主题。您会收到 Last Will 连接设置的遗嘱消息。

在这里插入图片描述
本文详细介绍了 MQTT 的基本概念和使用流程,您可以按照本文所学的内容尝试使用 MQTT 协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1294693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】7-32 刮刮彩票 分数 20

7-32 刮刮彩票 分数 20 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示: 每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9&#xf…

前端自动化测试Vue中TDD和单元测试示例详解

1、简单用例入门 Vue 提供了 vue/test-utils 来帮助我们进行单元测试,创建 Vue 项目的时候勾选测试选项会自动帮我们安装 先来介绍两个常用的挂载方法: mount:会将组件以及组件包含的子组件都进行挂载shallowMount:浅挂载&…

计算机网络复习资料

一、题型 选择题(包括单选和多选,共30分。其中单选每题1分,计20分;多选每题2分,计10分) 简答题(每题5分,共20分) 分析计算题(共40分,共4题) 论述题(本题10分,共1题) 二、考试大纲[人工智能…

防止企业敏感数据泄露

敏感数据泄露是指意外或故意泄露关键信息,例如个人身份信息(PII)、支付卡信息(PCI)、受保护的电子健康信息(ePHI)和知识产权(IP),数据保护措施不足的组织会在…

点滴生活记录2

我从小跟着我爷爷奶奶,小学六年级转到县城上小学,就没跟我奶奶他们住一起了。十一回家,把奶奶接到我这住,细想,自六年级之后,就很少跟奶奶住一起了。 奶奶(间歇性)耳聋,为…

Linux 驱动开发需要掌握哪些编程语言和技术?

Linux 驱动开发需要掌握哪些编程语言和技术? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家&#xf…

(C语言实现)高精度除法 (洛谷 P2005 A/B Problem II)

前言 本期我们分享用C语言实现高精度除法,可通过该题测试点我点我,洛谷 p2005。 那么话不多说我们开始吧。 讲解 大家还记不记得小学的时候我们是怎么做除法的?我们以1115为例。 我们的高精度除法也将采用这个思路进行,分别用两…

JavaSE基础50题:23. 数组拷贝(数组练习题)

文章目录 概述方法一:运用for循环进行拷贝方法二:Java内置方法进行拷贝方法三:指定区间进行拷贝 概述 数组拷贝。 注意: public static void main(String[] args) {int[] array1 {1,2,3,4};System.out.println(myToString(array…

python爬取 HTTP_2 网站超时问题的解决方案

问题背景 在进行网络数据爬取时,使用 Python 程序访问支持 HTTP/2 协议的网站时,有时会遇到超时问题。这可能会导致数据获取不完整,影响爬虫程序的正常运行。 问题描述 在实际操作中,当使用 Python 编写的爬虫程序访问支持 HTT…

第一课【习题】给应用添加通知和提醒

构造进度条模板通知,name字段当前需要固定配置为downloadTemplate。 给通知设置分发时间,需要设置showDeliveryTime为false。 OpenHarmony提供后台代理提醒功能,在应用退居后台或退出后,计时和提醒通知功能被系统后台代理接管…

【开源】基于Vue+SpringBoot的教学过程管理系统

项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载

在 KubeCon CN 2023 的「 Open AI 数据 | Open AI Data」专题中,火山引擎软件工程师胡元哲分享了《使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载|Sailing Ray workloads with KubeRay and Kueue in Kubernetes议题。以下是本次演讲的文字…

区块链实验室(28) - 拜占庭节点劫持区块链仿真

在以前的FISCO环境中仿真拜占庭节点攻击区块链网络。该环境共有100个节点,采用PBFT作为共识机制,节点编号分别为:Node0,Node,… ,Node99。这100个节点的前2010区块完全相同,自区块2011开始分叉。…

Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

一、前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以…

一文了解半导体检测的利器—探针台

探针台是半导体行业重要的检测装备之一,其广泛应用于复杂、 高速器件的精密电气测量,旨在确保质量及可靠性,并缩减研发时间和器件制造工艺的成本。 半导体测试可以按生产流程可以分为三类:验证测试、晶圆测试测试、封装检测。探针…

王炸升级!PartyRock 10分钟构建 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些 keynote 和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

首次发布亚马逊云科技生成式AI技术堆栈,re:Invent大会重磅发布

亚马逊云科技总是在不断重构,以推动创新,而今年re:Invent的主角毫无疑问是生成式AI。这从亚马逊云科技副总裁、首席布道师Jeff Barr在re:Invent 2023之前就迫不及待地写了一篇关于PartyRock的体验试玩教程即可窥见一斑。 事实也确实如此。在Las Vegas&am…

echarts绘制一个环形图2

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个柱状图&#xff0c;柱状折线图 echarts绘制一个饼图 效果&#xff1a; 组件代码&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…

node14升级node16之后无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 新版的依赖 "scripts": {"dev": "webpack-dev-se…