详解MQTT(Message Queuing Telemetry Transport)通信机制

目录

概述

1 认识MQTT

1.1 MQTT的定义

1.2 MQTT实现原理

1.3 MQTT架构的几个概念

1.3.1 MQTT Broker

1.3.2 MQTT Client

1.3.3 发布消息

1.3.4 订阅消息

2 认识MQTT报文结构

2.1 MQTT消息体结构

2.1.1 认识主题(Topic)

2.1.2 认识QoS(Quality of Service levels)

2.1.3 保留标志(retained)

2.2 MQTT心跳包

2.3 MQTT遗嘱机制

2.4 MQTT 用户认证

3 体验MQTT


概述

本文详细介绍了MQTT相关的概念,报文结构内容。还详细对MQTT Message的消息结构体的内容进行分析,介绍每一个参数的具体含义和用法。最后使用EMQX和MQTT.fx工具搭建了一个MQTT工作机制的测试平台,便于深入体验和理解MQTT的运行原理。

1 认识MQTT

MQTT详细协议文档,参看:

https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718061

1.1 MQTT的定义

MQTT(Message Queuing Telemetry Transport) 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。

下表总结一些MQTT协议的特点:

特点描述
实现方式客户端-服务器的消息发布/订阅传输协议,可实现一对多的消息发布
复杂程度MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。 在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)
版本信息MQTT3.1.1 和 MQTT5
QoS 服务质量等级根据消息的重要性不同设置不同的服务质量等级
资源消耗小型传输, 开销很小,协议交换最小化,以降低网络流量。

1.2 MQTT实现原理

MQTT 是一种基于Client------Server架构的消息传输协议,所以,在 MQTT 协议通信中,所有的Client必须经过Server才能进行通信。其基本架构如图一所示,对Broker而言,所有Client的地位都是平等的,其发布或者订阅消息,必须经过MQTT Broker处理,才能实现。

                                                               图一 MQTT通信架构图

1.3 MQTT架构的几个概念

1.3.1 MQTT Broker

MQTT Broker是一种消息传递代理服务器,它实现了MQTT协议并提供了消息传递的功能。

MQTT Broker主要有以下几个功能和特点:

  1. 发布/订阅模式:MQTT Broker支持发布者(publishers)将消息发布到特定的主题(topics),订阅者(subscribers)可以订阅特定的主题来接收消息。这种发布/订阅模式使得消息传递更加灵活和可扩展。

  2. 轻量级:MQTT Broker的协议设计非常轻量级,占用的带宽和资源较少。这使得MQTT Broker非常适合在资源受限的设备和网络条件下使用,如物联网设备和低带宽网络等。

  3. 可靠性:MQTT Broker提供了一些可靠性保证机制,如QoS(Quality of Service)等级。QoS级别分为0、1和2三个级别,提供了不同的消息传递保证和可靠性。

  4. 扩展性:MQTT Broker可以支持大量的发布者和订阅者,并且支持多种不同的消息传递场景。通过合理的架构设计和配置,可以实现高可扩展性和高并发性。

  5. 安全性:MQTT Broker支持基于用户名和密码的身份验证,以及TLS/SSL等加密通信方式,保证消息传递的安全性。

  6. 灵活性:MQTT Broker可以与其他系统和服务进行集成,如消息队列、数据库和Web应用等。这使得MQTT Broker在各种应用场景中都能灵活使用。

1.3.2 MQTT Client

MQTT Client是一种实现了MQTT协议的客户端库或软件,用于连接MQTT代理(也称为MQTT服务器)并进行发布和订阅消息的操作。MQTT Client可以是嵌入式设备上的软件库,也可以是计算机或移动设备上的独立应用程序。

MQTT Client提供了许多功能和接口,使开发人员可以轻松地使用MQTT协议进行通信。一般来说,MQTT Client具有以下主要功能:

  1. 连接管理:MQTT Client可以与MQTT代理建立稳定的网络连接并维持心跳保持活动状态。

  2. 认证和安全性:MQTT Client可以提供认证机制,确保只有经过授权的设备可以连接和发送消息。同时,它还可以支持加密传输,保护消息的机密性。

  3. 发布和订阅消息:MQTT Client可以发布消息到指定主题(Topic)或订阅特定主题来接收消息。它可以支持不同的消息质量等级,如最多一次、至少一次和只有一次。

  4. 消息保留:MQTT Client可以选择将消息保留在服务器上,以便新的订阅者能够获取最新的消息。

  5. 遗嘱消息:MQTT Client可以设置一个遗嘱消息,以便在连接异常断开时,代理可以将该消息发送给所有订阅者。

  6. QoS级别:MQTT Client可以选择消息的传输质量等级(Quality of Service),以确保可靠的消息传递。

  7. 异步通信:MQTT Client可以使用异步机制来处理消息,以避免阻塞主线程。

1.3.3 发布消息

MQTT采用发布-订阅模式,其中消息的发布方被称为发布者,而消息的接收方被称为订阅者。

要发布消息到MQTT中,首先需要连接到MQTT代理(broker)。连接时需要提供代理的地址和端口号,并且可以选择是否使用安全连接(例如使用TLS/SSL)。

连接成功后,发布者可以选择一个主题(topic)来发布消息。主题是消息的分类标签,订阅者可以根据主题来过滤接收到的消息。发布者可以将消息内容以及主题信息发送给MQTT代理,代理负责将消息传递给订阅了该主题的订阅者。

发布消息的具体步骤如下:

  1. 建立与MQTT代理的连接。

  2. 发布者选择一个主题。

  3. 发布者确定消息的质量等级。

  4. 发布者将消息内容和主题信息发送给MQTT代理。

  5. MQTT代理负责将消息传递给订阅了该主题的订阅者。

通过发布消息,可以实现设备之间的实时通信和数据传输,使得物联网设备的集成和交互更加灵活和可靠。

1.3.4 订阅消息

在MQTT中,设备可以通过订阅主题来接收消息。订阅主题类似于消息的分类,每个主题可以有多个订阅者。当有新的消息发布到主题时,所有订阅了该主题的设备都会收到相应的消息。

设备订阅消息的过程如下:

  1. 设备连接到MQTT代理服务器。

  2. 设备发送订阅请求,指定要订阅的主题。

  3. MQTT代理服务器确认订阅请求,并记录设备与主题之间的关系。

  4. 当有新消息发布到设备订阅的主题时,MQTT代理服务器将消息发送给所有订阅该主题的设备。

  5. 设备接收到消息,并进行相应的处理。

通过MQTT订阅消息,设备可以实时获取感兴趣的数据,并根据需要进行相应的操作。这种发布-订阅模式使得设备之间的通信更加灵活和高效,适用于各种物联网应用场景。

2 认识MQTT报文结构

2.1 MQTT消息体结构

MQTT发布一则消息,需要如下内容,如图二所示

功能内容注释
主题(Topic)switchMQTT发布Message必须指定一个“主题”
消息体(Payload){ "switch": false }主题(Topic)下的消息内容
服务质量等级(QoS)QoS0可选择QoS0、QoS1、QoS2
保留标志(retained)DisableBroker上是否保留消息

                                                                    图二 发布消息体内容

2.1.1 认识主题(Topic)

  • 主题的一般范例

Topic就是代表某种含义的一串字符,例如: "humidity", "lux_value","relay-1"。编写Topic必须注意如下规范:

1)主题是区分大小写的

2)主题可以使用空格

3)使用英文主题

  • 主题分级

MQTT协议为了更好的对主题进行管理和分类,支持主题分级,对主题进行分级处理,各个级别之间使用" / "符号 进行分隔。 举个例子:

"fac/tsb/rly/state"

在以上示例中一共有四级主题,分别是第 1 级 fac、第 2 级 tsb、第三级 rly、第 4 级 state。

  • 通配符

当客户端订阅主题时,可以使用通配符同时订阅多个主题。通配符只能在订阅主题时使用,下面我们将 介绍两种通配符:单级通配符和多级通配符。

通配符说明范例
+单级通配符可以匹配任意一个主题级别, 注意是一个主题级别fac/tsb/+/state 可以匹配: fac/tsb/rly-1/state fac/tsb/rly-2/state fac/tsb/rly-3/state
#多级通配符自然是可以匹配任意数量个主题级别, 而不再是单一主题级别fac/tsb/# 可以匹配: fac/tsb/rly-1/state fac/tsb/humidity/value fac/tsb/fun/state

2.1.2 认识QoS(Quality of Service levels)

MQTT 设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同级别的 QoS(Quality of Service) ,也就是 MQTT 协议有三种服务质量等级:

QoS值描述
0MQTT 服务端和客户端不会对消息传输是否成功进行确认和检查。消息能否成功 传输全看网络环境是否稳定。
1发送端在消息发送完成后,会检查接收端是否已经成功接收到了消息。发送端向接收端发送 PUBLISH 报文,当接收端收到 PUBLISH 报文后会向发送端回复一个 PUBACK 报 文, 如果发送端收到 PUBACK 报文,那么它就知道消息已经被接收端成功接收
2MQTT 协议可以确保接收端只接收一次消息

为了更好的理解 QoS,下面通过3张图来描述其工作流程:

1)QoS = 0

2)QoS = 1

3)QoS = 2

MQTT 服务质量最高级是 2 级,即 QoS=2。当 MQTT 服务质量为 2 级时, MQTT 协议可以确保接收端只接收一次消息。 为了确保接收端只接收到一次消息, PUBLISH 报文的收发过程相对更加复杂 ,其具体步骤如下:

执行Step完成的任务
1publiser向subscriber发送 报文
2subscriber接收到 PUBLISH 报文后,向publiser回复一个 PUBREC 报文
3publiser收到 PUBREC 报文后,会再次向subscriber发送 PUBREL 报文
4subscriber接收到 PUBREL 报文后,会再次向publiser回复一个 PUBCOMP 报文。 如果publiser接收到 PUBCOMP 报文表示消息传输成功,它确认subscriber已经成功接收到消息

2.1.3 保留标志(retained)

MQTT Broker对MQTT Client发布的消息进行保留,如果有其它MQTT Client订阅了该消息对应的主题时,MQTT Broker会立即将保留消息推送给subscriber, 而不必等到publiser向主题发布新消息时subscriber才会收到消息。

现在使用以MQTT.fx作为MQTT Client, 连接EMQX ( MQTT Broker )

使能Retained后,发布一个switch消息,在EMQX 上可以看见保留消息面板存在 topic为switch的消息

2.2 MQTT心跳包

MQTT Client在没有向MQTT Broker发送消息的空闲时间里,定时向MQTT Broker发送一个心跳包, 这个心跳包被称为心跳请求,其实质就是向MQTT Broker发送一个 PINGREQ 报文;当MQTT Broker收到PINGREQ 报文后就知道该MQTT Client依然在线,然后向MQTT Client回复一个 PINGRESP 报文,称为心跳响应。

登录到EMQX服务器上,可以看见每个Client 都有心跳时间。

2.3 MQTT遗嘱机制

客户端断开与服务端的连接通常是有两种方式的:

断开方式描述
主动断开连接Client主动向Broker发送 DISCONNECT 报文,请求断开连接,
异常断开连接Client意外掉线。被动与Broker断开了连接。

MQTT 协议允许Client在“Onlive”状态写好遗嘱,一旦Client意外断线,Broker就可以将Client的遗嘱消息广播出去。下面总结遗属Message被广播的步骤:

step - 1: Client在“Onlive”状态写好遗嘱messge

step - 2: Client意外原因断开与Broker连接

step - 3:Broker监测到Client断开连接,Broker广播遗嘱messge给subcriber

遗属Message的消息体如下:

内容说明
willTopic遗嘱主题
willMessage遗嘱消息
willRetain遗嘱消息的保留标志
willQoS遗嘱消息的 QoS

2.4 MQTT 用户认证

MQTT Client 的用户名和密码是连接MQTT Broker的重要参数,其主要用于Broker可以方便的管理每个Client。登录EMQX服务器,可以看见,使能 password_based 功能后,所有的Client连接该Broker必须输入正确的用户名和密码才能登录。

3 体验MQTT

现在使用EMQX搭建一个MQTT Broker,并创建3个user,使用MQTT.fx连接MQTT Broker实现数据数据发布和订阅功能。

Step-1: 登录EMQX创建3个Client

Step-2:使用MQTT.fx模拟3个Client登录该MQTT Broker

Step-3:

实现功能:

mqtt_user1发布消息:

{
    "switch": false
}

mqtt_user2和mqtt_ubuntu_user订阅这个消息

1) mqtt_user1发布消息

2)mqtt_user2和mqtt_ubuntu_user订阅这个消息

查看订阅消息的内容,其和mqtt_user1发送的消息一致

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

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

相关文章

判断一个数据能否同时被3和5整除

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;//提示用户printf("请输入一个整数\n");//获取用户输入数据&#xff1b;scanf("%d", &am…

WiFiSpoof for Mac wifi地址修改工具

WiFiSpoof for Mac&#xff0c;一款专为Mac用户打造的网络隐私守护神器&#xff0c;让您在畅游互联网的同时&#xff0c;轻松保护个人信息安全。 软件下载&#xff1a;WiFiSpoof for Mac下载 在这个信息爆炸的时代&#xff0c;网络安全问题日益凸显。WiFiSpoof通过伪装MAC地址&…

[图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示

文章目录 工程效果重要代码完整代码参考 工程效果 载入图片&#xff0c;并在左侧显示原始图片、二值化图片和灰度图片。 双击左侧的图片控件&#xff0c;可以在右侧的大控件中&#xff0c;显示双击的图片。 初始画面&#xff1a; 载入图片&#xff1a; 双击左侧的第二个控件…

【uC/OS-III篇】uC/OS-III 移植到 STM32 简明教程

uC/OS-III 移植到 STM32 简明教程 一、uC/OS-III 介绍 二、获取UCOS-III源码 三、建立项目工程 四、解决工程编译报错 五、修改项目文件 下一篇博客&#xff1a; 【uC/OS-III篇】uC/OS-III 创建第一个任务&#xff08;For STM32&#xff09; 一、uC/OS-III 介绍 uC/OS-III…

docker部署开源软件的国内镜像站点

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/le_monitor:latestdocker-compose部署 vim docker-compose.yml version: 3 services:le_monitor:container_name: le_monitorimage: registry.cn-beijing.aliyuncs.com/wuxingge123/le_monitor:latestpo…

【JDK常用的API】包装类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

SQL Server 数据库常见提权总结

前面总结了linux和Windows的提权方式以及Mysql提权&#xff0c;这篇文章讲讲SQL Server数据库的提权。 目录 基础知识 权限判定 系统数据库 存储过程 常见系统存储过程 常见扩展存储过程 xp_cmdshell扩展存储过程提权 xp_dirtree写入文件提权 sp_oacreate提权 xp_re…

每日面经分享(Spring Boot: part2 DAO层)

1. Spring Boot DAO层的作用 a. 封装数据访问逻辑&#xff1a;DAO层的主要责任是封装与数据访问相关的逻辑。负责处理与数据库的交互&#xff0c;包括数据的增删改查等操作。通过将数据访问逻辑统一封装在DAO层中&#xff0c;可以提高代码的可维护性和可重用性。 b. 解耦业务逻…

学习笔记】java项目—苍穹外卖day05

文章目录 苍穹外卖-day05课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍…

vsphere高可用实验

实验要求&#xff1a; 部署高可用集群&#xff0c;在2个EXSI主机上&#xff0c;将该虚拟机断电。这台虚拟机会在另一台主机上自动起来 实验环境要求&#xff1a; 2台EXSI&#xff0c;一台ISCSI&#xff0c;一台vcenter&#xff0c;在一台EXSI上安装一台虚拟机&#xff0c;要求…

武汉大学开设 “雷军班”:计算机专业、今年招收 15 名本科生。武汉大学已经联合小米成立了机器系

更多精彩内容在公众号。 3月25日&#xff0c;武汉大学官方网站发布了一则新闻&#xff0c;报道了校长张平文对计算机学院的调研活动。在报道中&#xff0c;张平文校长特别强调了关于“雷军班”及机器人系的发展规划。他表示&#xff0c;希望计算机学院能够立足于更高层次&#…

AI预测福彩3D第22弹【2024年3月31日预测--第5套算法开始计算第4次测试】

今天&#xff0c;咱们继续进行本套算法的测试&#xff0c;今天为第四次测试&#xff0c;仍旧是采用冷温热趋势结合AI模型进行预测。好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计算并进行权重赋值打分后&#xff0c;3…

MTMT:构建比特币生态平行世界 打造铭文生态繁荣

近年来&#xff0c;随着铭文市场的火爆以及比特币ETF成功通过&#xff0c;比特币生态正经历着一场复兴&#xff0c;尤其是铭文市场作为新一代Web3的叙事&#xff0c;带来了全新的生产方式&#xff0c;可以预见&#xff0c;铭文就像流动性挖矿对于上一轮DeFi Summer的推动一样会…

Mybatis-特殊SQL的执行

1. 模糊查询 在MyBatis中进行模糊查询时&#xff0c;有以下三种常见的实现方式&#xff1a; 1.1. 错误示范 先来个准备操作&#xff0c;并做一个错误示例 根据姓名&#xff0c;模糊查询用户&#xff0c;(x小x) 更新数据表 SQLMapper.java package com.sakurapaid.mybatis3…

python 进程、线程、协程基本使用

1、进程、线程以及协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】互斥锁【3】线程池【4】线程应用 3、多进程实现4、协程实现【1】yield与协程【2】asyncio模块【3】3.8版本【4】aiohttp 1. 并发…

《C++工程方向面试记录》

此系列&#xff0c;是本人免费提供的&#xff0c;大厂面试模拟&#xff0c;经本人同意后发出。如要申请&#xff0c;请查看《大厂面试模拟&#xff08;免费&#xff09;》 面试者画像&#xff1a; 本硕中部985&#xff0c;工作2-3年&#xff0c;本硕均非计算机专业。毕业后一直…

南京观海微电子---Vitis HLS设计流程介绍——Vitis HLS教程

1. 传统的FPGA设计流程 传统的RTL设计流程如下图所示&#xff1a; 传统的FPGA RTL设计流程主要是采用VHDL、VerilogHDL或System Verilog进行工程的开发&#xff0c;同时也是通过硬件描述语言来编写测试案例&#xff08;Test Bench&#xff09;对开发的工程进行仿真验证。 随后…

SpringBoot接收参数的方式

Get 请求 1.1 以方法的形参接收参数 1.这种方式一般适用参数比较少的情况 RestController RequestMapping("/user") Slf4j public class UserController {GetMapping("/detail")public Result<User> getUserDetail(String name,String phone) {log.…

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

leecode 331 |验证二叉树的前序序列化 | gdb 调试找bug

计算的本质是数据的计算 数据的计算需要采用格式化的存储&#xff0c; 规则的数据结果&#xff0c;可以快速的按照指定要求存储数据 这里就不得不说二叉树了&#xff0c;二叉树应用场景真的很多 本题讲的是&#xff0c;验证二叉树的前序序列化 换言之&#xff0c;不采用建立树的…