【MQTT】MQTT协议和相关概念介绍

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、MQTT工作原理及术语
  • 🎄三、MQTT的 QoS、Keepalive、Retained、LWT
    • ✨3.1 QoS
    • ✨3.2 Keepalive
    • ✨3.3 Retained消息
    • ✨3.1 LWT(遗言)
  • 🎄四、MQTT的工具和开源库
    • ✨4.1 MQTT Broker 相关工具、开源库
    • ✨4.2 MQTT 客户端 相关工具、开源库
  • 🎄五、总结


在这里插入图片描述

在这里插入图片描述

🎄一、概述

MQTT,全称是 Message Queuing Telemetry Transport(消息队列遥测传输协议),是一种轻量级的发布/订阅消息传输协议,最初由IBM和Arcom(后来成为Eurotech的一部分)在1998年左右创建。MQTT是OASIS标准。最新版本是5.0,有多种格式可供选择。MQTT 3.1.1也是一个ISO标准(ISO/IEC 20922)。

MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网(IoT)、小型设备、移动应用等方面有较广泛的应用。

关于MQTT的更多资料可以到其官网查看:https://mqtt.org/
也可以参考 MQTT中文网。

MQTT的特点:

  • 开放消息协议,简单易实现
  • 轻量级、占用带宽低(1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。)
  • 发布/订阅模式,一对多消息发布;
  • 基于TCP/IP网络连接,提供有序,无损,双向连接;
  • 消息QoS(Quality of Service)支持,可靠传输保证(至多一次、最少一次、只有一次);
  • 可传输任意类型的数据
  • 收发消息都是异步的,发送方不需要等待接收方应答;

在这里插入图片描述

🎄二、MQTT工作原理及术语

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publisher)、代理(Broker)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理(Broker)是服务器,消息发布者可以同时是订阅者。

  • MQTT 客户端:任何运行 MQTT 客户端库的应用或设备都是 MQTT 客户端,消息的发布者订阅者都是客户端。例如,使用 MQTT 的即时通讯应用是客户端,使用 MQTT 上报数据的各种传感器是客户端,各种 MQTT 测试工具也是客户端。
  • MQTT 代理(Broker):MQTT Broker 是负责处理客户端请求的关键组件,包括建立连接、断开连接、订阅和取消订阅等操作,同时还负责消息的转发。一个高效强大的 MQTT Broker 能够轻松应对海量连接和百万级消息吞吐量,从而帮助物联网服务提供商专注于业务发展,快速构建可靠的 MQTT 应用。
  • 发布/订阅模式发布/订阅模式客户端/服务器模式 的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。
    1、发布方和订阅方都建立了到Broker的TCP连接;
    2、订阅方告知Broker它要订阅的Topic;
    3、发布方将消息发送到Broker,并指定消息主题(Topic);
    4、Broker接收到消息后,检测哪些订阅方订阅了对应的Topic,然后将消息发送到订阅方;
    5、订阅方从Broker获取消息;
    6、如果某个订阅方处于离线状态,Broker可以先保存对应的消息,当订阅方下次连接到Broker的时候,再将之前的消息发送给订阅方;
  • 订阅(Subscription):订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
  • 会话(Session):每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
  • 主题(Topic):MQTT 消息的标签,MQTT 协议根据主题来转发消息。主题通过 / 来区分层级,类似于 URL 路径,例如:chat/room/1sensor/+/temperature
    MQTT 主题支持以下两种通配符:+ 和 #。通配符主题只能用于订阅,不能用于发布。
    +:表示单层通配符,例如 a/+ 匹配 a/x 或 a/y。
    #:表示多层通配符,例如 a/# 匹配 a/x、a/b/c/d。
  • 负载(Payload):消息订阅者所具体接收的内容。
    在这里插入图片描述

在这里插入图片描述

🎄三、MQTT的 QoS、Keepalive、Retained、LWT

✨3.1 QoS

QoS,全称是Quality of Service(服务质量)。

MQTT协议设计初衷是提供一套保证消息稳定传输的机制,用于网络带宽窄,信号不稳定环境下的数据传输,这套机制包括消息应答,存储和重传。在这套机制下提供了三种不同层次的QoS(Quality of Service),QoS是 发送方接收方 之间达成的协议,而不是PublisherSubscriber之间达成的协议。

MQTT有以下三种QoS:

  • QoS 0:消息最多传送一次。如果当前客户端不可用,它将丢失这条消息。
  • QoS 1:消息至少传送一次。
  • QoS 2:消息只传送一次。

关于QoS的实现可以参考文章:
MQTT协议QoS2 准确一次送达的实现
MQTT协议零基础快速入门


✨3.2 Keepalive

在实际使用MQTT协议时,无论是Broker还是Client都需要及时感知到MQTT是否断开;MQTT是基于TCP协议的应用层协议,理论上TCP断开时会通知上层应用,但是TCP协议有个半打开连接的问题,这种状态下,一段的TCP连接已经失效,但是另一端并不知情,需要很长时间才能感知到对端连接已经断开;因此仅仅依赖TCP层的连接状态监测是不够的,于是MQTT设计了一套keepalive机制,

MQTT协议约定:在1.5*keepalive时间间隔内,如果Broker没有收到来自Client的任何数据包,Broker就认为和Client的连接断开;同理Client在这个时间间隔内没有收到Broker的任何数据包,Client也会认为他和Broker的连接断开;

MQTT协议设计了一对PINGREQ/PINGRESP数据包,当Broker和Client之间没有任何数据交互时,可以通过这对数据包满足keepalive的约定和网络状态监测;

keepalive特性

  • 如果一个Keepalive时间间隔内,Client和Broker有过数据包传输,Client就没有必要再使用PINGREQ数据包了;
  • Keepalive的值时有Client在发送CONNECT数据包时指定,不同的Client可以指定不同的值;
  • Keepalive的最大值是18时12分15秒
  • Keepalive 的值为0时代表不使用Keepalive机制

✨3.3 Retained消息

会有这样一种场景,Publisher发布了一个消息后,Subscriber订阅了这个主题,那么这个 Subscriber就不会收到在它订阅之前Publisher发布的消息。

Retained消息就是为了解决这个问题,Retained消息是指在PUBLISH数据包中将Retained标识设为1的消息,Broker收到这样的PUBLISH数据包后,将会为该主题保存这个消息,当一个新的订阅者订阅该主题时,Broker会将这个消息发送给订阅者。

Retained消息特点

  • 一个Topic只有一个Retained消息,发布新的Retained消息将覆盖旧的Retained消息;
  • 如果订阅者使用通配符订阅主题,会收到所有匹配主题的Retained消息;
  • 只有新的订阅者会收到Retained消息,如果订阅者重复订阅一个主题,会被当做新的订阅者收到Retained消息;
  • 向主题发布一个payload长度为0的Retained消息就可以删除这个主题的Retained消息;

✨3.1 LWT(遗言)

LWT全称为Last Will and Testament(遗言),包括遗言主题,遗言QoS,遗言消息等,具体见MQTT协议,遗言具有以下特点:

  • 遗言的相关设置是建立连接时,在CONNECT数据包里面指定的;
  • 遗言用于非正常断开连接的情况,当Broker检测到Client非正常的断开连接时,就会向Client的遗愿主题发布一条消息;
  • Client发布DISCONNECT数据包断开连接,属于正常断开,不会触发LWT机制,而且Broker会丢掉Client连接时指定的LWT参数

在这里插入图片描述

🎄四、MQTT的工具和开源库

✨4.1 MQTT Broker 相关工具、开源库

MQTT Broker 是MQTT协议的核心,主要作用是接收发布者的消息,然后转发给对应的订阅者。Broker可以对Clinet接入进行授权,并对Client进行权限控制。
常用的C语言编写的 MQTT Broker 开源库有Mosquitto,其Github路径:https://github.com/eclipse/mosquitto
更多MQTT Broker 开源库可以查看:https://github.com/mqtt/mqtt.github.io/wiki/servers。

如果学习MQTT需要Broker环境,可以通过这些开源库自建,也可以用各大云平台提供的Broker服务,如阿里云、腾讯云。


✨4.2 MQTT 客户端 相关工具、开源库

MQTT客户端工具:paho.mqtt-spy,其Github路径:https://github.com/eclipse/paho.mqtt-spy

实现MQTT客户端的开源库:
C语言编程的可以选择:paho.mqtt.c,其Github路径:https://github.com/eclipse/paho.mqtt.c
C++编程的可以选择:paho.mqtt.cpp,其Github路径:https://github.com/eclipse/paho.mqtt.cpp


在这里插入图片描述

🎄五、总结

👉本文介绍了MQTT是什么,然后介绍MQTT的工作原理及术语:MQTT客户端、MQTT Broker、订阅/发布模式等。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

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

相关文章

转行网络安全的重要建议,助你顺利入门

目录 为什么写这篇文章 为什么我更合适回答这个问题 先问自己3个问题 1.一定要明确自己是否是真喜欢,还是一时好奇。 2.自学的习惯 3.选择网安、攻防这行的目标是什么? 确认无误后,那如何进入这个行业? 1.选择渗透测试集中…

Boost库的使用

1 下载与安装 1.1 下载 网址:Boost C Libraries 进入后选择自己需要的版本安装即可 1.2 安装 1.2.1 解压 1.2.2 编译安装 双击bootstrap.bat 这一步完成后会生成一个b2.exe文件 双击b2.exe文件运行(此步需要花费较长的时间) 之后再stag…

新增分类——后端

实现功能: 代码开发逻辑: 页面发送ajax请求,将新增分类窗口输入的数据以json形式提交到服务端服务端Controller接收页面提交的数据并调用Service将数据进行保存Service调用Mapper操作数据库,保存数据 代码实现: Con…

遇到如此反复的外贸客户,你可以这样做~

来源:宜选网,侵删 当你们遇到爽快的买家的时候,你是否有把握一定能把她拿下呢? 还是说即使客户很爽快,你也会耐心认真的沟通呢? 今天要和大家分享的这个买家,我本以为他是一个很爽快的买家&am…

前端使用Compressor.js实现图片压缩上传

前端使用Compressor.js实现图片压缩上传 Compressor.js官方文档 安装 npm install compressorjs使用 在使用ElementUI或者其他UI框架的上传组件时,都会有上传之前的钩子函数,在这个函数中可以拿到原始file,这里我用VantUI的上传做演示 a…

基于TRIZ理论的锂电池生产工艺优化思路

在能源科技迅猛发展的今天,锂电池作为重要的储能元件,其生产工艺的优化与革新显得尤为关键。本文将基于TRIZ理论,探讨锂电池生产工艺的优化路径,以期提升能源产业的效率与环保性。 TRIZ,即发明问题解决理论&#xff0…

三级综合医院微信预约挂号系统源码,PC后台管理端+微信公众号+支付宝小程序全套源码

智慧医院预约挂号系统,微信医疗预约挂号小程序源码,实体医院预约挂号支付系统源码 本系统主要面向中大型的医疗机构,适用于各级公立和民营医院,可对接院内his、lis、pacs系统。 PC后台管理端微信公众号支付宝小程序 系统支持当日…

Apinto下载安装以及集群部署总结

下载 下载官方提供的安装包安装(推荐) wget https://github.com/eolinker/apinto/releases/download/v0.13.3/apinto_v0.13.3_linux_amd64.tar.gz && tar -zxvf apinto_v0.13.3_linux_amd64.tar.gz && cd apinto 安装 先确保已经入解…

浅谈postman设置token依赖步骤

前言: postman做接口测试时,大多数的接口必须在有token的情况下才能运行,我们可以获取token后设置一个环境变量供所在同一个集合中的所有接口使用。 一般是通过调用登录接口,获取到token的值 实战项目:jeecg boot项…

InfluxDB学习之linux上安装InfluxDB

InfluxDB学习之linux上安装InfluxDB 什么是InfluxDB特点使用场景 如何安装windows如何安装linux安装教程(不用登录,) 界面展示特别说明 什么是InfluxDB InfluxDB 是一个用于存储和分析时间序列数据的开源数据库。由 Golang 语言编写&#xff…

什么是HTTP/2?

HTTP/2(原名HTTP 2.0)即超文本传输协议第二版,使用于万维网。HTTP/2主要基于SPDY协议,通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措,来减少网络延迟,提高客户端的页面加载…

分布式锁讲解

概括 分布式锁是一种用于在分布式系统中实现同步机制的锁。在单机系统中,我们可以使用如Java中的synchronized关键字或者 ReentrantLock来实现线程间的同步,但在分布式系统中,由于多个节点(服务器)之间的并发操作&am…

【探索Java编程:从入门到入狱】Day5

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

CSS基础(盒子模型、浮动、定位)

盒子模型 所有HTML元素可以看作盒子,这个盒子包含了内容、内边距、边框和外边距。 Margin(外边距) -边框外的区域,也就是盒子与其他元素之间的空间,外边距是透明的。Border(边框) - 围绕在内边距和内容外的边框。就是边框大小Padding(内边距…

好题总结汇总

好题总结汇总 总结一些做完很有收获的题。 一、经典问题 DP的结合 1、题意: 给定 n n n 种颜色的球的数量 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​,选出一些不同种类的球(也就是在n种球中选球的任意情况),将球…

中国工程院院陈纯一行调研实在智能,助推企业科技创新

2024年5月8日,浙江大学计算机科学与技术学院教授、中国工程院院士陈纯院士一行访问了实在智能公司,针对AI Agent智能体进行了专项调研。实在智能创始人、CEO孙林君,以及公司管理层和研发、市场、产品等部门负责人共同出席了座谈会。 陈纯院士…

DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)

尼恩说在前面: 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: DDD 的外部接口调用,应该放在…

【JAVA】JAVA的垃圾回收机制详解

对于Java的垃圾回收机制,它是Java虚拟机(JVM)提供的一种自动内存管理机制,主要负责回收不再使用的对象以释放内存空间。垃圾回收机制主要包括以下几个方面的内容: 垃圾对象的识别:Java虚拟机通过一些算法&…

element ui的table多选

使用el-table的selection-change事件来获取选中的值&#xff1b; 例&#xff1a; html代码&#xff1a; <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…

替代UCC21550隔离式双通道栅极驱动器

描述 PC86320是一个隔离的双通道栅极驱动器具有可编程死区时间和宽温度范围。它设计有5A峰值源和6A峰值吸收电流来驱动电源高达2MHz的MOSFET、SiC、GaN和IGBT晶体管开关频率。PC86320可以配置为两个低端驱动器&#xff0c;两个高边驱动器&#xff0c;或具有可编程功能的半桥驱…