MQTT协议理解并实践
MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计
MQTT协议根据主题来分发消息进行通信,支持通配符匹配,可以低开销的使用数百万Topic进行一对一,一对多双向通信。
协议特点
1. 开放消息协议,简单易实现2. 发布订阅模式,一对多消息分发和应用程序分离3. 基于TCP/IP网络连接,有序,无损,双向连接的网络协议4. 字节固定包头,字节心跳报文,报文结构紧凑,协议交换最小化,以减少网络流量5. 消息QoS支持,可靠传输保证
服务质量等级
QoS 0:消息可能丢失
QoS 1:消息不会丢失但可能重复
QoS 2:消息不会丢失也不会重复
MQTT报文类型
- 连接
CONNECT,CONNACk,DISCONNECT
- 发布
PUBLISH,PUBACk,PUBREC(publish receive),PUBREL(publish release),PUBCOMP(publish complete)
- 订阅
SUBSCRIBE,SUBACk,UNSUBSCRIBE,UNSUBACk
- 心跳
PINGREQ,PINGRESP
主要报文类型
- CONNECT
客户端标识符
用户名
密码
遗嘱消息
- PUBLISH
主题
QoS
Payload(负载)
- SUBSCRIBE
主题
QoS
发布订阅模式
发布者&订阅者 <----> Broker代理服务 <----> 订阅者&发布者
- 发布,订阅和取消订阅的相关报文
如何发布消息
client ------> publish(Topic Name,QoS,Payload) -------> brokerTopic Name(String):
示例:temperature livingroom/temperature kitchen/temperatureQos(Integer):
Qos 0 消息可能丢失
Qos 1 消息不会丢失但可能重复
Qos 2 消息不会丢失也不会重复Payload(Binary):
可为Json类型:
{“from":"client","temperature":26
}可为Binary类型进制数据
4d 69 72 61 63 6c 65 73...可为Ciphertext类型加密数据
UFsdGVkX1/PucJg+taTQ...
如何订阅消息
client ------> subscribe(Packet ID,Subscription List) ------> brokerPacket ID:
Subscribe: Packet ID 45678
Suback: Packet ID 45678Subscription List:
Topic Filter 1(QoS 1)
Topic Filter 2(Qos 2)
Topic Filter 3(Qos 3)Topic Filter subscribe可以使用主题通配符
subscribed topic a/+
代表: publish to topic a/1
也可代表: publish to topic a/2 等
如何订阅响应
client -----> suback(Packet ID,Reason Codes) ------>BrokerReason Codes(原因码):
成功:
0x00:订阅成功且最大QoS等级为0
0x01: 订阅成功且最大QoS等级为1
0x02:订阅成功且最大QoS等级为2
失败:
0x80:订阅失败
如何取消订阅
client -----> unsubscribe(Packet ID,Topic Filters) -----> broker想要取消订阅的Topic Filter ------ 完全的文本匹配 ----- 实际订阅的Topic Filter
取消订阅响应
client ----- unsuback(Packet ID,Person Codes) ------ broker
Topic主题定义:
UTF-8字符串类型,最大长度65535长度,区分大小写home/livingroom/temperature + 主题通配符 = 一次订阅多个主题主题通配符类型:
1. 单层通配符(+): /home/+/temperature2. 多层通配符(#): 也可匹配0个层级 /home/#3. 以$开头的主题:$SYS/ (客户端上下线事件通知,报文收发统计,Broker状态信息)注意:通配符+和#可以同时使用,不建议主题以“/”开头或者结尾
准备条件
需要用到的工具
1.EMQX - MQTT Broker2.MQTTX- MQTT Client3.Wireshark-网络抓包工具
拉取EMQX镜像
docker pull emqx:5.0.19
运行EMQX
docker run -d --name emqx -p 18083:18083 -p 1883:1883 emqx:5.0.19
修改EMQX日志等级为 Debug
docker exec -i emqx /opt/emqx/bin/emqx ctl log set-level debug
查看EMQX日志
docker logs -f emgx
mqtt题目练习
1. 发布两条QoS1消息,这两条消息将使用不同的 Packet ID,并且Packet ID 不需要我们自己设置。2. 订阅未授权的主题 ($SYS/#),EMQX将返回 Reason Code 为 0x80的SUBACK。3. 订阅 a/+,可以收到 a/1、a/2 等主题的消息。4. 订阅 a/+ 和 a/1,当有客户端发布消息到主题 a/1时,订阅者将收到两条消息。5. 使用相同的主题过滤器进行多次订阅,新的订阅会覆盖旧的订阅,不会失败,也不会收到重复的消息。6. 订阅时设置最大 QoS为 1,发布 QoS为2的消息,订阅者收到的消息的 QoS为17. 订阅a/1 和a/+,取消订阅 a/+ 主题,只会取消订阅 a/+ 这个主题。8. example和Example、example/ 属于不同的主题。9. /example 主题必须用/+ 来匹配,仅使用+是匹配不到的。10. 单层通配符可以多次出现,订阅 a/+/+/d,可以接收来自 a/1/2/d 和 a/3/4/d 主题的消息。11. 订阅 a/#,可以接受来自 a/1 和 a/1/2 主题的消息12. 单层通配符和多层通配符可以同时使用,订阅 a/+/# 主题,发布消息到 a/1/2/3 主题13. 系统消息,订阅 $SYS/brokers/+/clients/#,可以接收到客户端上下线事件消息。
相关文章:
MQTT协议理解并实践
MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计 MQTT协议根据主题来分发消息进行通信,支持通配符匹配,可以低开销的使用数百万Topic进行一对一,一对多双向通信。 协议特点 1. 开放…...
实现一个简单的网络通信下(udp)
时间过去好久了,先回忆一下上一篇博客的代码!! 目前来看,我们客户端发一条消息,我服务器收到这一条消息之后呢,服务器也知道了是谁给我发来的消息,紧接这就把这条消息放进buffer当中,…...
Linux中office环境LibreOffice_7.6.2下载
阿里云盘:LibreOffice_7.6.2 使用:下载的文件为exe文件,双击exe文件即可获取到文件 LibreOffice_7.6.2安装: 解压:tar -zxvf LibreOffice_7.6.2_Linux_x86-64_rpm.tar.gz 移动到RPMS目录:cd LibreOffice_7…...
Linux快捷控制
Linux快捷控制 工具安装 yum -y install lrzsz wget curl net-tools git防火墙 systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service宝塔 yum install -y wget && wget -O install.sh https://download.bt.…...
免费插件集-illustrator插件-Ai插件-重复复制-单一对象页面排版
文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件>重复复制4.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行制卡专用分层分色。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/8789050…...
GO基础之变量与常量
标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。 举几个例子:abc, _, _123, a123。 关键字 关键…...
Docker Compose简单入门
Docker Compose 简介 Docker Compose 是一个编排多容器发布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。 Docker Compose 真正的作用是在一个文件(docker-compose.yml)中定义并运…...
使用 PHPMailer 实现邮件的实时发送
💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 今天我们利用GitHub上20K星星的项目 PHPMailer…...
在Spring Boot中使用JavaMailSender发送邮件
用了这么久的Spring Boot,我们对Spring Boot的了解应该也逐步进入正轨了,这篇文章讲的案例也在我们的实际开发中算是比较实用的了,毕竟我们完成注册功能和对用户群发消息,都可以采用到邮箱发送功能,往下看,…...
python动态圣诞下雪图
运行图片 代码 import pygame import random# 初始化Pygame pygame.init()# 创建窗口 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(Christmas Tree)# 定义颜色 GREEN (34, 139, 34) RED (255, 0, 0) WHITE (255…...
随心玩玩(十)git
写在前面:研究生一年多了,一直浑浑噩噩的,在深度学习的泥潭挣扎了好久,终于走出了精神内耗的泥潭…好久没有写博客了,决定重新捡起来…记录一下学习吧~ 之前写了一篇git的博客,【github 从0开始的基本操作…...
每日一练【盛最多水的容器】
一、题目描述 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&…...
Linux C语言 38-进程间通信IPC之信号
Linux C语言 38-进程间通信IPC之信号 本节关键字:C语言 进程间通信 信号量 semaphore 相关库函数:sem_init、sem_post、sem_wait、sem_destroy 提示:先做内容框架梳理,后期进行完善补充! 什么是信号量? …...
前端使用 xlsx.js 工具读取 excel 遇到时间日期少 43 秒的解决办法
在使用 xlsx 读取 excel 的时间格式的数据时,如 ‘2023-11-30’,‘2023/11/30’ ,默认会读取一串数字字符串,如:‘45260’,此时需要在 read 的时候传入一个配置项: import { read } from xlsxc…...
问题记录-maven依赖升级或替换(简单版)
问题背景 项目被检测到有高危漏洞,需要对部分jar进行升级。以一个jar为例记录一下升级过程。 1 找到高危漏洞的包 如果装了maven helper插件则可以在下面查看当前模块依赖包 2 使用maven命令 执行下面这个命令,会将当前项目的信息打印出来,…...
00Hadoop数据仓库平台
在这里是学习大数据的第一站 什么是数据仓库常见大数据平台组件及介绍 什么是数据仓库 在计算领域,数据仓库(DW 或 DWH)也称为企业数据仓库(EDW),是一种用于报告和数据分析的系统,被认为是商业智…...
java-jar包
jar包类似于压缩包,主要是组织和分享自己的Java代码方便,将一组特定的java文件打包,一般是.class文件,不过并不限制文件类型,都可以打包。 jar包中包好清单文件,如果没有指定就会自动生成默认的࿰…...
Flink运行时架构核心概念
Flink运行时架构 JobManager:协调,决定何时调度下一个task,对失败任务做恢复。 ResourceManager: 负责Flink集群中的资源提供、回收、分配,它负责管理task slot。standalone模式下,不能自行启动新的taskmanagerDispatc…...
docker安装达梦数据库并挂在数据卷
离线包下载地址:请点击 1.在线下载 wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar2. 导入镜像 docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar3. 运行容器 docker run -d -p 5236:5236 --restartalwa…...
ROS第一个程序——helloworld
目录 一、工作空间的创建 1.创建工作空间并初始化 2.进入 src 创建 ros 包并添加依赖 二、C实现helloworld C源码实现 编辑 ros 包下的 Cmakelist.txt文件 进入工作空间目录并编译 执行 三、python实现helloworld 进入 ros 包添加 scripts 目录并编辑 python 文件 …...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
