MQTT协议零基础快速入门

news2024/12/26 10:46:57

MQTT协议零基础快速入门

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网(IoT)和机器对机器(M2M)通信场景。它具有简单、开放、易于实现等优点,特别适合在受限的环境中运行,例如资源有限、网络带宽有限或需要远程连接的设备。

MQTT协议基于TCP/IP或其他提供有序、无损、双向连接的网络协议运行,属于应用层协议,与HTTP协议位于同一层。

一、MQTT的特点

  1. 发布订阅模式:MQTT支持发布/订阅消息传输模式,可以实现服务解耦和一对多消息分发。
  2. 与有效负载内容无关的消息传输:MQTT协议对消息内容不做任何限制,可以传输任何类型的数据。
  3. 三种服务质量保证:MQTT根据定义的服务质量(QoS)级别来传递应用消息。包括以下三种级别:
    • At most once(QoS 0):根据底层网络能力,消息可能丢失。
    • At least once(QoS 1):确保消息到达,但可能出现重复。
    • Exactly once(QoS 2):确保消息精确到达一次。

二、如何实现服务质量保证

MQTT根据定义的服务质量(QoS)级别来传递应用消息。以下是不同QoS级别的详细说明:

At most once(QoS 0)

在这种服务质量级别下,消息的传递是基于底层网络的能力进行的。接收方不发送响应,发送方也不重试。消息要么一次性到达接收方,要么根本就没有到达。

发送方:
必须发送一个带有QoS=0,DUP=0的PUBLISH包。

如果DUP=0,它表明这是客户端或服务器第一次尝试发送这个MQTTPUBLISH包。如果DUP标志=1,它表明这可能是之前尝试发送包的重新交付。

接收方:
当接收到PUBLISH包时,接收方接受消息的所有权(包括消息分发和是否保留存储等)。
在这里插入图片描述

At least once(QoS 1)

这种服务质量级别保证了消息至少一次到达接收端。一个QoS 1 PUBLISH包在其变量头部有一个包标识符,并被PUBACK包确认。

发送方:

  1. 每次有新的消息要发布时,必须分配一个未使用的包标识符。
  2. 发送一个包含此包标识符的PUBLISH包:QoS=1,DUP=0。
  3. 将PUBLISH包视为“未确认”包,直到它收到接收方的相应PUBACK包。

注意: 包标识符在发送端接收到PUBACK包后可以被重用。发送方在等待接收确认时,允许发送更多带有不同包标识符的PUBLISH包。

接收方:

  1. 必须响应一个包含来自发送方传入PUBLISH包的包标识符的PUBACK包,表示接受了应用消息的所有权。
  2. 在它发送了一个PUBACK包之后,接收方必须将任何传入的包含相同包标识符的PUBLISH包视为一个新的发布,而不考虑它的DUP标志的设置,也就是说包标识符是可以复用的。
  3. 在发送PUBACK之前,接收方不需要完成应用消息的传递。当其原始发送方接收到PUBACK包时,应用消息的所有权就转移到接收方。
    在这里插入图片描述

Exactly once(QoS 2)

这是最高的服务质量,用于既不能丢失消息也不能重复消息的情况。这种服务质量会增加开销。

发送方:

  1. 当有一个新的消息要发布时,必须分配一个未使用的包标识符。
  2. 必须发送一个包含此包标识符的PUBLISH包:QoS=2,DUP=0。
  3. 必须将PUBLISH包视为“未确认”包,直到从接收方收到相应的PUBREC包。
  4. 当从接收端收到一个PUBREC数据包时,必须发送一个PUBREL数据包。这个PUBREL数据包必须包含与原始PUBLISH数据包相同的数据包标识符。
  5. 必须将PUBREL包视为“未确认”包,直到从接收方收到相应的PUBCOMP包。一旦发送了相应的PUBREL包,绝对不能重新发送相同包标识符的PUBLISH包。

注意:包标识符在发送端接收到PUBCOMP包后可以被重用。发送方在等待接收确认时,允许发送更多带有不同包标识符的PUBLISH包。

接收方:

  1. 必须响应一个包含来自传入的PUBLISH包的包标识符的PUBREC,同时接受了消息的所有权。
  2. 在接收到相应的PUBREL数据包之前,接收端必须通过发送一个PUBREC来确认任何后续的具有相同数据包标识符的PUBLISH数据包。在这种情况下,它绝对不能导致重复的消息被传递到任何后续其他的接收方。
  3. 必须通过发送包含与PUBREL相同包标识符的PUBCOMP包来响应PUBREL包。
  4. 在它发送了一个PUBCOMP之后,接收方必须将任何包含该包标识符的后续PUBLISH包视为一个新的发布,也就是说包标识符是可以复用的。

注意:在发送PUBREC或PUBCOMP之前,接收方不需要完成应用消息的传递。当其原始发送方接收到PUBREC包时,应用消息的所有权就转移到接收方。

在这里插入图片描述

该图显示了接收方可以用两种方法来处理QoS2。 它们的区别在于消息在流中的哪个位置可以被用于后续的传递,至于对应的实现相关的。只要一个实现只选择了其中一种方法, 就不会影响对QoS2流的保证。

三、总结

总的来说,MQTT协议是一种轻量级、开放、简单的发布/订阅消息传输协议,适用于受限环境和大规模的物联网(IoT)和机器对机器(M2M)通信。它提供了三种服务质量保证级别,以满足不同场景的需求。通过在发送方和接收方之间建立有序、无损、双向连接,MQTT实现了可靠的消息传递。在实现过程中,发送方和接收方的行为和职责明确,有利于实现服务解耦和一对多消息分发。同时,MQTT协议的设计也考虑了网络拥塞和丢包等问题,以确保消息的可靠传递。因此,MQTT协议是一种非常有前途的消息传递协议,将在未来的物联网和机器对机器通信中发挥越来越重要的作用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品经理入门学习(五):思维导图 原型设计

参考引用 黑马-产品经理入门基础课程 1. 思维导图的作用和应用场景 什么是思维导图? 思维导图是一种将思维进行可视化的实用工具。具体实现方法是用一个关键词去引发相关想法,再运用图文并茂的技巧把各级主题的关系用相互隶属的层级表现出来,…

多态 虚函数表深度剖析 纯干货讲解(2)

💯 博客内容:多态 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准C后端工程师,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSD…

crond服务

目录 一、crond服务基础知识 1、crond服务介绍 2、查看crond服务的状态 3、crond服务配置文件详解 4、额外的配置文件目录 二、crond服务基础命令 1、crond服务使用 2、 管理和操作 crond 服务 3、crond服务命令举例 一、crond服务基础知识 1、crond服务介绍 1、crond…

【redis面试题】双写一致性

文章目录 前言一、什么是双写一致性1. 先删除缓存还是先修改数据库1.1 先删除缓存的情况1.2 先修改数据库的情况 2. 双写一致性的解决方案 二、允许延迟一致的解决方法1. 采用 MQ 中间件2. 采用 canal 中间件 三、强一致性的解决方法1. 采用 Redisson 提供的读写锁 前言 跟着B…

7-2 数论中的模幂运算

solution 欧拉函数法可以解决模幂运算 #include<stdio.h> #include<math.h> int main(){int a, m, n, r1;scanf("%d%d%d", &a, &m, &n);while(m){if(m&1) r(r*a)%n;a(a*a)%n;m>>1; }printf("%d", r);return 0; }给定伪…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…

基于8086家具门安全控制系统设计

**单片机设计介绍&#xff0c;基于8086家具门安全控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 8086家具门安全控制系统设计介绍 8086家具门安全控制系统是一种用于保护家具和保证室内安全的系统。该系统基于808…

类的成员函数总结

前言&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的…

【java学习—十三】处理流之一:缓冲流(1)

文章目录 0. 引言1. 缓冲流2. 缓冲字节流2.1. 缓冲字节输入流2.2. 缓冲字节输出流2.3. 缓冲流实现文件的复制 3. 缓冲字符流 0. 引言 上一章节讲了&#xff1a;文件字符流和字节流&#xff08;基于硬盘&#xff09; 其中&#xff0c;用到的方法有&#xff1a;FlieInuputStream、…

JDBC简单流程

Step1&#xff1a;加载对应数据库&#xff08;比如mysql、oracle、sqlserver&#xff09;的驱动器 1、以mysql驱动器为例&#xff0c;下载好对应的jar包后&#xff0c;在项目对应目录下新建一个lib文件夹&#xff0c;将jar包复制到该文件夹中。 2、然后选中改jar包&#xff0…

链队的练习

链队的练习 相关内容&#xff1a;队列的链式存储结构&#xff08;链队&#xff09; //链队的初始化、入队、出队、取对头 #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 typedef int Status; //结点结构 typedef struct QNode{ int data; …

单链表的应用(1)

移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路&#xff1a;&#xff08;1&#xff09;创建三个结构体指针&#xff0c;分别代表一条新链表的头newhead&#xff0c;…

2023 electron最新最简版打包、自动升级详解

这里我将讲解一下从0搭建一个electron最简版架子&#xff0c;以及如何实现打包自动化更新 之前我有写过两篇文章关于electron框架概述以及 常用api的使用&#xff0c;感兴趣的同学可以看看 Electron桌面应用开发 Electron桌面应用开发2 搭建electron 官方文档&#xff1a;ht…

基于变色龙算法的无人机航迹规划-附代码

基于变色龙算法的无人机航迹规划 文章目录 基于变色龙算法的无人机航迹规划1.变色龙搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用变色龙算法来优化无人机航迹规划。 1.变色龙…

5 ip的分配

如上一节所述&#xff0c;需要和其他设备通信&#xff0c;那么需要先配置ip. 1、如何配置ip 1.可以使用 ifconfig&#xff0c;也可以使用 ip addr 2.设置好了以后&#xff0c;用这两个命令&#xff0c;将网卡 up 一下&#xff0c;就可以了 //---------------------------- 使…

VBA技术资料MF79:将范围级别由工作簿变更为工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

软件测试工作流程

流程体系介绍 在以往的项目工作中&#xff0c;我参与过&#xff0c;需求评审、测试计划制定、测试用例编写、测试用例执行、测试脚本编写、测试脚本的执行&#xff0c;进行回归测试、验收测试、编写阶段性测试报告等工作 需求分析&#xff0c;需求评审&#xff08;RPD、产品原…

基于单片机的车载太阳能板自动跟踪系统研究

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、总体设计开发流程二、机械结构设计与研究3.1 机械系统总体设计3.1.1 太阳能板折叠传动 三、太阳能自动跟踪系统硬…