MQTT从入门到精通之MQTT入门
MQTT入门
1 MQTT概述
1.1 MQTT简介
MQTT(Message Queuing Telemetry Transport)由IBM于1999年开发的一种基于**"发布订阅模式"的轻量级的消息传输协议**!
发布订阅模式是一种传统的客户端-服务器架构的替代方案
,因为一般传统的客户端-服务器是客户端能够直接和服务器进行通信完成消息的传输。发布订阅模式会将发送消
息的发布者publisher与接收消息的订阅者subscribers进行分离
,publisher与subscribers 并不会直接通信,他们甚至都不清楚对方是否存在,他们之间的交流由
第三方组件broker
代理。
pub/sub 最重要的方面是 publisher 与 subscriber 的解藕,这种耦合度有下面二个维度:
1、空间解耦:publisher 与 subscriber 并不知道对方的存在。
2、时间解藕:publisher 与 subscriber 并不一定需要同时运行。
MQTT它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。非常适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。
1.2 MQTT特性
它的主要特点包括:
1、**轻量级:**物联网设备通常在处理能力、内存和能耗方面受到限制。MQTT开销低、报文小
的特点使其非常适合这些设备,因为它消耗更少的资源,即使在有限的能力下也
能实现高效的通信。
2、**可靠:**物联网网络常常面临高延迟或连接不稳定的情况。MQTT支持多种QoS等级、会话感知和持久连接
,即使在困难的条件下也能保证消息的可靠传递,使其非常适合
物联网应用。
3、**安全通信:**安全对于物联网网络至关重要,因为其经常涉及敏感数据的传输。为确保数据在传输过程中的机密性,MQTT提供传输层安全(TLS)和安全套接层(SSL)
加密功能
。此外,MQTT 还通过用户名/密码凭证或客户端证书提供身份验证和授权机制,以保护网络及其资源的访问。
4、**双向通信:**MQTT的发布-订阅模式为设备之间提供了无缝的双向通信方式。客户端既可以向主题发布消息,也可以订阅接收特定主题上的消息
,从而实现了物联网生态
系统中的高效数据交换,而无需直接将设备耦合在一起。这种模式也简化了新设备的集成,同时保证了系统易于扩展。
5、**语言支持:**物联网系统包含使用各种编程语言开发的设备和应用。MQTT具有广泛的语言支持
,使其能够轻松与多个平台和技术进行集成,从而实现了物联网生态系统中
的无缝通信和互操作性。常见编程语言的支持:PHP、Node.js、Python、Golang、Node.js、java等。
1.3 MQTT核心概念
MQTT客户端
任何运行MQTT客户端库[MQTT开发工具包]
的应用或设备都是MQTT客户端。例如使用MQTT的即时通讯应用是客户端,使用MQTT上报数据的各种传感器是客户端,各种MQTT
测试工具也是客户端。
MQTT Broker
MQTT Broker是负责处理客户端请求的关键组件,包括建立连接、断开连接、订阅和取消订阅等操作,同时还负责消息的转发。一个高效强大的MQTT Broker能够轻松应
对海量连接和百万级消息吞吐量,从而帮助物联网服务提供商专注于业务发展,快速构建可靠的MQTT应用。
主题
MQTT主题本质上是一个UTF-8编码的字符串,是MQTT协议进行消息路由的基础。可以理解为就是通过主题对消息进行分类
。MQTT主题类似URL路径,使用斜杠/
进行分
层:
chat/room/1
sensor/10/temperature
为了避免歧义且易于理解,通常不建议主题以/
开头或结尾,例如 /chat
或 chat/
。MQTT主题不需要提前创建。MQTT 客户端在订阅或发布时即自动的创建了主题,开
发者无需再关心主题的创建,并且也不需要手动删除主题。
2 MQTT快速入门
2.1 EMQX概述
EMQX,是一款实现了MQTT协议的,开源的MQTT消息代理软件
。MQTT定义了消息通讯的规则和流程,而EMQX则是遵循这些规则的软件,使得设备能够依据MQTT协议进行有
效通信。在新版本的EMQX中同时支持MQTT3.1.1协议和5.0协议
。
官网地址:https://www.emqx.com/zh
其他代理软件:https://www.emqx.com/en/blog/the-ultimate-guide-to-mqtt-broker-comparison
2.2 EMQX部署
选择EMQX企业版进行部署:https://docs.emqx.com/zh/enterprise/latest/deploy/install-docker.html
购买火山引擎服务器,安装Docker:
# 移除旧版本docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 配置docker yum源。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装 最新 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 启动& 开机启动docker; enable + start 二合一
systemctl enable docker --now# 配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker run -d --name emqx-enterprise \-p 1883:1883 -p 8083:8083 \-p 8084:8084 -p 8883:8883 \-p 18083:18083 \-v emqx_data:/opt/emqx/data \-v emqx_log:/opt/emqx/log \-v emqx_etc:/opt/emqx/etc \emqx/emqx-enterprise:5.6.1
常见端口介绍:
端口号 | 说明 |
---|---|
1883 | TCP端口 |
8083 | WebSocket端口 |
8084 | WebSocket Secure 端口 |
8883 | SSL/TLS 端口 |
18083 | Broker的Dashboard访问端口号 |
2.3 Dashboard介绍
EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。
主要功能:
1、监控和管理EMQX中的相关信息与数据
:支持查看运行中的EMQX集群的整体连接数,订阅主题数,消息收发数量和流入流出速率,还包括节点列表和节点信息和一些系
统指标信息,同时也可以对一些客户端连接与订阅数据进行查看与管理。
2、访问控制(认证与授权)管理
:支持通过可视化的方式来新增和配置管理 EMQX 中的认证与授权机制。
3、数据集成
:使用强大的基于SQL的规则引擎和数据桥或流量编辑器的可视化功能进行低代码数据处理和集成,以帮助实时提取、过滤、丰富、转换和存储 MQTT 数据。
4、在线配置热更新
:支持在线修改和更新包括 MQTT、日志,监听器等配置项,更新成功后即刻生效。
首次访问:
访问地址:http://localhost:18083/
用户名和密码:admin/pubic
可以通过CLI的admins
命令进行密码重置:
./bin/emqx ctl admins passwd <Username> <Password>
2.4 EMQX客户端
2.4.1 MQTTX简介
MQTTX 是EMQX开源的一款跨平台 MQTT 5.0 客户端工具,它支持 macOS, Linux 并且支持自定义脚本模拟测试、MQTT 消息格式转换、日志记录等多个功能。
MQTTX 包含三种类型的工具:
1、MQTTX Desktop:MQTTX Desktop是一款跨平台的 MQTT 桌面客户端工具。
2、MQTTX CLI:MQTTX CLI是EMQ开源的一款 MQTT 5.0 命令行客户端工具
3、MQTT Web:MQTTX Web是一款基于浏览器访问客户端工具。
官网地址:https://mqttx.app/zh
2.4.2 MQTTX Desktop的使用
具体步骤:
1、下载并安装MQTTX Desktop: https://mqttx.app/zh/downloads?os=windows
2、新建链接
3、输入主题名称发送消息
4、创建新链接订阅主题
注意:
1、发送消息的时候没有选择Retain,那么在订阅该主题之前所发送的消息不能被客户端接收到
2、可以通过Dashboard来管理链接和订阅信息
2.2.3 MQTTX CLI的使用
具体步骤:
1、下载MQTTX CLI:https://mqttx.app/zh/downloads?os=windows
2、建立链接订阅主题
mqttx-cli-win-x64.exe sub -t 'test/1' -h 192.168.136.147 -p 1883 -v
-t
:订阅主题
-h
:服务器地址,填写对应监听器的IP地址,默认为localhost
-p
:服务器端口,默认为1883
-v
:在接收到的Payload前显示当前Topic
3、向主题发送消息
mqttx-cli-win-x64.exe pub -t 'test/1' -q 0 -h 192.168.136.147 -p 1883 -m "from MQTTX CLI"
2.2.4 MQTTX Web的使用
使用 MQTTX Web 进行测试操作基本上与使用MQTTX Desktop相同。
docker pull emqx/mqttx-web
docker run -d --name mqttx-web -p 80:80 emqx/mqttx-web
3 MQTT控制报文
3.1 控制报文简介
报文是网络中交换与传输的数据最小单元,通俗来讲就是站点一次性要发送的数据块
。它包含了将要发送的完整数据信息,其长短不一致,长度不限且可变。MQTT 客户端
和服务端通过交换控制报文来完成它们的工作,比如订阅主题和发布消息。
3.2 常见的控制报文
MQTT 目前定义了 15 种控制报文类型,如果按照功能进行分类,我们可以将这些报文分为连接、发布、订阅三个类别:
3.3 MQTT报文格式
在 MQTT 中,无论是什么类型的控制报文,它们都由固定报头、可变报头和有效载荷三个部分组成。
固定报头固定存在于所有控制报文中
,而可变报头和有效载荷是否存在以及它们的内容则取决于具体的报文类型。
例如用于维持连接的 PINGREQ 报文就只有一个固定报
头,用于传递应用消息的 PUBLISH 报文则完整地包含了这三个部分。
3.3.1 固定报头
固定报头由报文类型、标识位和报文剩余长度三个字段组成。
报文类型
占4个bit位,是一个无符号的整数
常见的报文类型:https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901022
标识位
占4个bit位,不过到 MQTT 5.0 为止,只有 PUBLISH
报文的这四个比特位被赋予了明确的含义:
1、Bit 3:DUP,表示当前 PUBLISH 报文是否是一个重传的报文。
2、Bit 2,1:QoS,表示当前 PUBLISH 报文使用的服务质量等级。
3、Bit 0:Retain,表示当前 PUBLISH 报文是否是一个保留消息。
其他所有的报文中,这 4 位都仍是保留的。
剩余长度
剩余长度指示了当前控制报文剩余部分的字节数,也就是可变报头和有效载荷
这两个部分的长度。MQTT 控制报文的总长度= 固定报头的长度 + 剩余长度。
3.3.2 可变报头
可变报头的内容取决于具体的报文类型。
举例:
1、CONNECT 报文的可变报头按顺序包含了协议名、协议级别、连接标识、Keep Alive 和属性这五个字段
2、PUBLISH 报文的可变报头则按顺序包含了主题名、报文标识符和属性这三个字段。
属性是 MQTT 5.0 引入的一个概念。属性字段基本上都是可变报头的最后一部分,由属性长度和紧随其后的一组属性组成
,这里的属性长度指的是后面所有属性的总长度
所有的属性都是可选的,因为它们通常都有一个默认值,如果没有任何属性,那么属性长度的值就为0。属性通常都是为了某个专门的用途而设计的,不同的报文所支持的属
性都是不一样的,具体的对应情况可以查看官网地址:https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901027
3.3.3 有效载荷
有效载荷是用于实现对应报文的核心功能。
1、在 PUBLISH 报文中,Payload 用于承载具体的应用消息内容,这也是 PUBLISH 报文最核心的功能。
2、在 SUBSCRIBE 报文中,Payload 包含了想要订阅的主题以及对应的订阅选项,这也是 SUBSCRIBE 报文最主要的工作。
3.4 报文验证
接下来我们通过Wireshark工具,抓取一下各种通讯操作所涉及到的报文。
链接相关报文验证:
发布相关报文:
上述发布的消息QoS的值设置为0,因此看不到发布消息的时候的其他的报文数据,如果此时把消息的QoS等级设置为1、2就可以看到发送消息的时候其他的报文:
QoS的值设置为2以后,抓取的报文数据如下所示:
订阅相关报文:
相关文章:

MQTT从入门到精通之MQTT入门
MQTT入门 1 MQTT概述 1.1 MQTT简介 MQTT(Message Queuing Telemetry Transport)由IBM于1999年开发的一种基于**"发布订阅模式"的轻量级的消息传输协议**! 发布订阅模式是一种传统的客户端-服务器架构的替代方案,因为…...

Hadoop生态系统主要包括哪些组件以及它们的作用
Hadoop生态系统是一个开源的大数据处理框架,它主要由一系列组件构成,每个组件都承担着不同的功能和作用。以下是Hadoop生态系统的主要组件及其作用的详细解释: HDFS(Hadoop Distributed File System) 作用:…...

OpenResty 1.27.1.1 已经正式发布
OpenResty 1.27.1.1 已经正式发布,这是一个基于 NGINX 和 LuaJIT 的 web 平台。以下是关于此次发布的一些重点信息和更新内容: 下载与安装 你可以在此处下载最新版本的 OpenResty。提供了便携式源代码分发、Win32/Win64 二进制分发以及为 Ubuntu、Debi…...

定高虚拟列表:让大数据渲染变得轻松
定高虚拟列表 基本认识 在数据如潮水般涌来的今天,如何高效地展示和管理这些数据成为了开发者们面临的一大挑战,传统的列表渲染方式在处理大量数据时,往往会导致页面卡顿、滚动不流畅等问题,严重影响用户体验(在页面…...

python request与grequests该如何选择
requests & grequests requests 和 grequests 是Python中用于发送HTTP请求的不同库。requests 是一个同步、阻塞式库,而 grequests 是基于 requests 封装的异步非阻塞库,它利用了 gevent 库提供的协程机制,能够并发发送多个请求。 选择…...

Unity3D UI 拖拽
Unity3D 实现 UI 元素拖拽功能。 UI 拖拽 通常画布上的 UI 元素都是固定位置的,我们可以通过实现拖拽接口,让 UI 元素可以被拖拽到其他位置。 拖拽接口 创建一个脚本 UIDrag.cs,在默认继承的 MonoBehaviour 后面,再继承三个接…...

介绍一下memcpy(c基础)
memcpy函数void *memcpy(void *dest, const void *src, size_t n); dest:指向目标内存区域的指针,即复制的目的地。src:指向源内存区域的指针,即要被复制的内容的来源。n:要复制的字节数 主要功能是将src所指向的内存…...

【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
目录 一、相关面试题 1. HTTP 与 HTTPS 有哪些区别? 2. HTTPS 的工作原理?(https 是怎么建立连接的) (1)ClientHello (2)SeverHello (3)客户端回应 &a…...

python-23-一篇文章帮你理解Python推导式
python-23-一篇文章帮你理解Python推导式 一.简介 在 Python 中,推导式(Comprehensions)是一个简洁的语法,用于通过某种可迭代对象快速生成新的对象(如列表、字典、集合等!来开始我们今天的日拱一卒&…...

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查
目录 开始前准备的数据库dbblog如下: 第一步:创建项目后下载四个NuGet程序包 第二步:删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…...

CesiumJS 案例 P15:检测标记、鼠标点击移动标记、鼠标拖动标记
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、检测标记 <!DOCTYPE html> <html lang"en&…...

Webserver(4.9)本地套接字的通信
目录 本地套接字 本地套接字 TCP\UDP实现不同主机、网络通信 本地套接字实现本地的进程间的通信,类似的,一般采用TCP的通信流程 生成套接字文件 #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h&…...

[IAA系列] Image Aesthetic Assessment
Preface 本文旨在记录个人结合AI工具对IAA这个领域的一些了解,主要是通过论文阅读的方式加深对领域的了解。有什么问题,欢迎在评论区提出并讨论。 什么是IAA Image Aesthetic Assessment(图像美学评估)是一种评估图像在视觉上的…...

基于springboot的高校科研管理系统(源码+调试+LW)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…...

Flutter环境配置
配置环境变量 PUB_HOSTED_URLhttps://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 这个命令是用来配置 Flutter 的镜像源地址,主要是为了解决在中国大陆地区访问 Flutter 官方资源较慢的问题 具体的操作做如下: 右键点击"此…...

Rip动态路由及Rip动态路由优化
动态路由Rip Tip:Rip动态路由实现多个路由间不同网段通信。 本次实验目的,通过给ar1,ar2,ar3配置rip动态路由,实现pc1 ping通 pc2。 AR1配置如下: <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]…...

双路快速排序和三路排序算法
双路快速排序 一、概念及其介绍 双路快速排序算法是随机化快速排序的改进版本,partition 过程使用两个索引值(i、j)用来遍历数组,将 <v 的元素放在索引i所指向位置的左边,而将 >v 的元素放在索引j所指向位置的…...

SQL server增删改查语句和实例
在 SQL Server 中,增删改查操作分别对应 INSERT、DELETE、UPDATE 和 SELECT 语句。以下是具体介绍及实例: 一、插入数据(INSERT) 语法: INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, val…...

强化学习_06_pytorch-PPO2实践(ALE/Breakout-v5)
一、环境适当调整 数据收集:RecordEpisodeStatistics进行起始跳过n帧:baseSkipFrame一条生命结束记录为done:EpisodicLifeEnv得分处理成0或1:ClipRewardEnv叠帧: FrameStack 图像环境的基本操作,方便CNN捕捉智能体的行动 向量空间reset处理修…...

《JVM第8课》垃圾回收算法
文章目录 1.标记算法1.1 引用计数法1.2 可达性分析法 2.回收算法2.1 标记-清除算法(Mark-Sweep)2.2 复制算法(Coping)2.3 标记-整理算法(Mark-Compact) 3.三种垃圾回收算法的对比 为什么要进行垃圾回收&…...

SpringBoot整合Freemarker(二)
if分支 语法: <#if condition>... <#elseif condition2>... <#elseif condition3>... <#else>... </#if> 例子: <#if x 1>x is 1 </#if> --------------------------------- <#if x 1>x is 1 <…...

element plus el-form自定义验证输入框为纯数字函数
element plus 的el-form 使用自定义验证器,验证纯数字,禁止输入小数、中文、字母、特殊符号。input的maxlength为最大输入多少位长度 效果图 <el-form ref"dataFormRef" :model"dataForm" :rules"dataRules" label-w…...

Android笔记(三十一):Deeplink失效问题
背景 通过deeplink启动应用之后,没关闭应用的情况下,再次使用deeplink会失效的问题,是系统bug导致的。此bug仅在某些设备(Nexus 5X)上重现,launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…...

图神经网络初步实验
实验复现来源 https://zhuanlan.zhihu.com/p/603486955 该文章主要解决问题: 1.加深对图神经网络数据集的理解 2.加深对图神经网络模型中喂数据中维度变化的理解 原理问题在另一篇文章分析: 介绍数据集:cora数据集 其中的主要内容表示为…...

创建线程时传递参数给线程
在C中,可以使用 std::thread 来创建和管理线程,同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时ÿ…...

兴业严选|美国总统都是不良资产出身 法拍市场是否将大众化
北京时间11月6日,特朗普赢得美国大选。 说起特朗普那就不得不提他的发家史,那可真是一笔笔不良资产投资堆出来的。 没错,特朗普就是处理不良资产的高手,战果丰硕。 改造斯威夫特小镇、 康莫德酒店、打造特朗普(TRUM…...

C#-拓展方法
概念:为现有的非静态变量类型,添加方法 语法: 访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型 参数名,参数类型 参数名....){} 而public static void F(this Console()){ }是错的。Console是静态类不可以为静态类添加方…...

加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践
本文导读 从事京东零售供应链库存业务,库存数量操作增减十分频繁,并且项目开发中会常常遇到各种并发情况,一旦库存数量操作有误,势必给前台销售产生损失影响,因此需要关注对库存数量并发操作下的一致性问题。 大部分…...

vue3 传值的几种方式
一.父组件传子组件 父组件 //父组件 <Decisionobject :Decisionselected"Decisionselected"></Decisionobject> <script lang"ts" setup> let Decisionselected ref(false); </script>子组件 <script lang"ts" s…...

AUTOSAR CP NVRAM Manager规范导读
一、NVRAM Manager功能概述 NVRAM Manager是AUTOSAR(AUTomotive Open System ARchitecture)框架中的一个模块,负责管理非易失性随机访问存储器(NVRAM)。它提供了一组服务和API,用于在汽车环境中存储、维护和恢复NV数据。以下是NVRAM Manager的一些关键功能: 数据存储和…...