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

文章目录

  • 什么是 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 协议。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度拷贝 deepClone

/*** 深度克隆对象* param {*} value 需要克隆的值 * param {WeakMap} cache 使用 WeakMap 解决环形引用问题,防止内存泄漏 */ function deepClone(value, cache new WeakMap()) {// 基础数据if(typeof value ! object || value null) {return value;}// 解决环形…

Enterprise Architect 12版本使用教程

Enterprise Architect 12版本使用教程 1.下载安装Enterprise Architect 122.Enterprise Architect原始DDL模板配置及存在的问题1.DDL Column Definition原始模板(没有default值:可忽略)2.DDL Data Type原始模板(timestamp等时间字…

BCrypt加密解密工具类方法

BCrypt加密解密工具类方法 直接上代码 package com.loit.park.common.utils;import org.springframework.security.crypto.bcrypt.BCrypt;/*** author hanjinqun* date 2023/5/13* BCrypt工具类*/ public class BCryptUtils {/*** 加密*/public static String hashpw(String s…

【JavaEE进阶】 Spring使用注解存储对象

文章目录 🌴序言🍀前置⼯作:配置扫描路径🎄添加注解存储 Bean 对象🌳类注解🚩为什么要这么多类注解🚩注解之间的联系 🎋⽅法注解 Bean🚩⽅法注解需要配合类注解使⽤ ⭕总…

C //习题10.8 将第7题结果仍存入原有的“stu_sort“文件而不另建立新文件。

C程序设计 (第四版) 谭浩强 习题10.8 习题10.8 将第7题结果仍存入原有的"stu_sort"文件而不另建立新文件。 IDE工具:VS2010 Note: 使用不同的IDE工具可能有部分差异。 说明:此题同习题10.7的代码,唯一的区…

大数据毕业设计之前端03:logo、menu的折叠展开实现

关键字:BuildAdmin、pinia、logo、aside、menu、菜单折叠、Vue、ElementUI 前言 上一篇文章中,借助aside的实现讲了一些开发的小技巧,以及css的解读。本篇文章主要写一下如何填充aside的内容。 aside主要是由两个部分组成的:log…

Mysql启动占用内存过高解决

Hi, I’m Shendi Mysql启动占用内存过高解决 前言 最近服务器内存不够用了,甚至还出现了内存溢出问题,导致程序宕机。但请求与用户量并没有多少,所以从各种启动的程序中想方设法的尽可能的减少其占用的内存。 而在我的服务器中,…

数字化和数智化一字之差,究竟有何异同点?

在2023杭州云栖大会的一展台内,桌子上放着一颗番茄和一个蛋糕,一旁的机器人手臂融入“通义千问”大模型技术后,变得会“思考”:不仅能描述“看”到了什么,还能确认抓取的是番茄而不是蛋糕。 “传统的机械臂通常都只能基…

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

ScreenCap---Version:001 说明 从0到1,手把手带你开发windows端的截屏软件ScreenCap 当前版本:ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 支持拖拽截图 支持保存全屏截图 支持另存截图到其他位置 GitHub 仓库master下的Scr…

二百一十四、Linux——Linux系统时间比电脑时间慢5分钟

一、目的 服务器重启后,发现Linux的系统时间比电脑时间慢5分钟,于是看了些博客,终于找到了解决方法,记录一下,以防止后面出现同样的问题 二、问题 通过date查看,Linux系统时间比电脑时间慢5分钟 &#…

solidworks打开图纸零件隐藏看不到怎么办?

solidworks打开图纸零件隐藏看不到怎么办?solidworks打开时看不到零件图像,显示空白文档,该怎么解决这个问题呢?下面我们就来看看详细的教程,需要的朋友可以参考下 1、打开SolidWorks ,并选中需要打开的零…

【公式】逻辑回归的损失函数是什么

目录 一、逻辑回归简介 二、逻辑回归模型的损失函数 2.1 损失函数与其意义 2.2 逻辑回归的损失函数 2.3 从交叉熵角度理解逻辑回归的损失函数 2.4 从对数似然角度推导逻辑回归的损失函数 三、逻辑回归损失函数的梯度 3.1 逻辑回归损失函数的梯度公式 3.2 用梯度下降法…

家用洗地机希亦、追觅和添可哪款好用?测评PK谁是清洁之王

对于上班族来说,时间非常宝贵,打扫卫生就成为了一件比较痛苦的事情。现在的都市上班族都会寄托于智能家电。在当前市场上,洗地机已成为家庭清洁的面部工具。洗地机是一种高效的清洁设备,以其自动化、高效率的清洁功能,…

我想涨工资,请问测试开发该怎么入门?

我是测试开发工程师!欢迎和我交流测试领域相关问题(测试入门、技术、python交流都可以) 我几乎是靠这套方法,从一个只会功能测试的小白,到成为测试开发工程师的。 别急,先慢慢看,只要按照下面的流程走一遍…

Elastic Support Hub 转向语义搜索

作者:Chris Blaisure 我们很高兴与大家分享 Elastic Support Hub 最近的增强功能:它现在由语义搜索提供支持! 但在我们更详细地了解对 Elastic Support Hub 所做的更改及其对客户的影响之前,我们需要花点时间解释语义搜索的概念&…

java死锁的成因和解决方案

一、什么是死锁? 在Java中,死锁是指两个或多个线程互相持有对方所需要的锁,并且在无法继续执行的情况下永久地等待对方释放锁。这种情况下,所有涉及的线程都无法继续执行,程序被卡住,无法正常终止。 死锁通…

Question 1----dlib问题

复现代码时,在环境里边导入dlib包时一直出现setup.py运行失败,查找网上一些解决方法,使用whl文件本地导入 仍然不能解决,通过向师兄请教,成功解决问题。 首先需要先安装两个库:(已经安装好了VS…

pyside/qt03——人机协同的编程教学—直接面向chatGPT实战开发(做中学,事上练)

先大概有个草图框架,一点点丰富 我纠结好久,直接用Python写UI代码 还是用designer做UI 再转Python呢, 因为不管怎么样都要转成Python代码, 想了想还是学一下designer吧,有个中介,有直观理解。 直接这样也可…

“福利”还是“陷阱”?公司给员工放假3个月引发劳动权益争议

近日,广东佛山一家玻璃制造公司的长达3个月放假通知引发广泛关注。这一决策引发了社会对员工福利和公司经营平衡的深入思考。公司表示,此次决策是为了维修老化设备,但随之而来的疑虑则主要集中在员工的收入和劳动权益问题上。 公司表示&…

Java线程池—附阿里巴巴Java开发手册强制规范要求

文章目录 一、线程池概述二、创建线程池三、线程池执行Runnable任务四、线程池执行Callable任务五、线程池工具类(Executors)—不推荐 一、线程池概述 线程池就是一个可以复用线程的技术。 想象一下,如果不使用线程池会有什么问题&#xff1…