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 文件 …...
Sentinel-3B OLCI 3 级全球分箱地球观测降分辨率(ERR)叶绿素(CHL)数据,版本 2022.0
Sentinel-3B OLCI Level-3 Global Binned Earth-observation Reduced Resolution (ERR) Chlorophyll (CHL) Data, version 2022.0 简介 叶绿素 a 数据集提供全球网格化的表层叶绿素 a 浓度(浮游植物生物量的替代指标)合成数据。CHL 支持时间序列和气候…...
硬件答辩问题总结
一、电源纹波是什么,为什么LDO的小,DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分,表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管(可变电阻) 串联在输入和输出…...
别再死记硬背SMO公式了!用Python手写一个SVM分类器,带你一步步拆解SMO核心逻辑
用Python手写SVM分类器:代码驱动理解SMO算法核心在机器学习领域,支持向量机(SVM)以其优秀的分类性能和坚实的数学基础著称。然而,许多学习者在理解其核心算法——序列最小优化(SMO)时,往往被复杂的数学推导所困扰。本文将采用一种…...
股票买卖最佳时机:LeetCode121题解
题目LeetCode121给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取…...
车载诊断系统(OBD)的原理、演进与未来
本文约8,167字,建议收藏阅读 作者 | 北湾南巷 出品 | 汽车电子与软件 引 言 在现代汽车中,越来越多的故障不再表现为明显的机械损坏,而是以“亮灯”“报码”“性能异常”等电子信号的形式出现。发动机为什么亮起故障灯?排放是否达…...
别再把大模型当搜索框了:一文讲透 LLM 的基本原理、能力边界与局限性
写在前面很多人把大语言模型当成“会聊天的搜索引擎”,结果一上线就遇到幻觉、口径不稳、上下文丢失、成本失控。真正理解 LLM,要先抓住一句话:它是基于 Transformer 的概率生成模型,核心能力来自海量预训练、上下文学习与后训练对…...
告别Appium!用Python+UIAutomator2搞定Android自动化测试(附完整环境搭建与实战代码)
PythonUIAutomator2:Android自动化测试的高效实践指南 在移动应用测试领域,效率与稳定性始终是工程师们追求的核心目标。传统方案如Appium虽然功能全面,但在执行速度和资源消耗方面往往难以满足高频测试需求。本文将带您探索基于Python和UIA…...
SpringBoot WebClient 介绍
目录一、什么是 WebClient?二、 WebClient 能解决什么问题?三、WebClient 和 RestTemplate 的区别四、WebClient 的核心优势1. 非阻塞(Non-Blocking)2. 支持异步3. 链式 API 更现代五、WebClient 的核心对象六、Mono 和 Flux 是什…...
如何高效使用HiveWE:魔兽争霸III地图制作的完整秘籍
如何高效使用HiveWE:魔兽争霸III地图制作的完整秘籍 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 还在为魔兽争霸III原版编辑器加载缓慢、操作卡顿而烦恼吗?HiveWE作为一款专注于速…...
第十五章:Agent产品的监控与可观测性:如何构建“看得见、管得住“的AI系统
导读 想象一下:你上线了一个客服Agent,第一个月运行平稳。第二个月开始,你陆续收到用户投诉说"答案不对"。但你的监控系统显示:请求量正常、延迟正常、错误率正常。你打开日志,发现Agent确实"成功"处理了每个请求——只是它给错了答案。 这不是监控…...
