MQTT协议零基础快速入门

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.hqwc.cn/news/161388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt登录界面

头文件&#xff1a; #ifndef QDLGLOGIN_H #define QDLGLOGIN_H#include <QDialog>namespace Ui { class dlgLogin; }class QDlgLogin : public QDialog {Q_OBJECTprivate:bool m_movingfalse;//表示窗口是否在鼠标操作下移动QPoint m_lastPos; //上一次的鼠标位置Q…

MySQL进阶_5.逻辑架构和SQL执行流程

文章目录 第一节、逻辑架构剖析1.1、服务器处理客户端请求1.2、Connectors1.3、第1层&#xff1a;连接层1.4、第2层&#xff1a;服务层1.5、 第3层&#xff1a;引擎层1.6、 存储层1.7、小结 第二节、SQL执行流程2.1、查询缓存2.2、解析器2.3、优化器2.4、执行器 第三节、数据库…

GNU ld链接器 lang_process()(二)

一、ldemul_create_output_section_statements() 位于lang_process()中11行 。 该函数用于创建与目标有关的输出段的语句。这些语句将用于描述输出段的属性和分配。 void ldemul_create_output_section_statements (void) {if (ld_emulation->create_output_section_sta…

FFmpeg 硬件加速视频转码指南

基于 Windows 下演示&#xff0c;Linux 下也可以适用。 所使用 ffmpeg 版本为 BtbN 编译的 win64-gpl 版&#xff08;非 gpl-share&#xff09;&#xff0c;项目地址&#xff1a;BtbN / FFmpeg-Builds 也可以使用 gyan.dev 编译的 git-full 版&#xff0c;地址&#xff1a;gyan…

YOLO目标检测数据集大全【含voc(xml)、coco(json)和yolo(txt)三种格式标签+划分脚本+训练教程】(持续更新建议收藏)

一、作者介绍&#xff1a;资深图像算法工程师&#xff0c;YOLO算法专业玩家&#xff1b;擅长目标检测、语义分割、OCR等。 二、数据集介绍&#xff1a; 真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;分享的绝大部分数据集已应用于各种实际落地项目。所有数据…

喜讯!极限科技成功签约中国一汽搜索数据库三年许可订阅合同!

中标喜讯&#xff01;极限科技 INFINI Easysearch 成功签约中国第一汽车股份有限公司三年订阅合同&#xff01; 一汽集团作为国内汽车行业龙头企业&#xff0c;数字化转型伴随业务发展不断深化&#xff0c;非结构化数据日益成为各类组织数据的增长主力&#xff0c;逐渐成为数据…

Dubbo远程调用

分布式系统中,各个系统间远程调用的性能决定了这个分布式系统好坏 Dubbo是专门用来解决各个服务间调用的RPC框架,解决分布式系统中的远程调用问题 而Zookeeper(注册调度中心)的作用是:比如说50台用户服务器,与50台订单服务器,但是上线后发现用户服务器使用率较低,那么Zookeep…

软件测试/测试开发丨ChatGPT能否成为PPT最佳伴侣

点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中&#xff0c;无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT&#xff0c;协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等&#xff0c;可以给到观众更好…

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…

通过环境变量实现多个JDK切换

前文: 由于jdk版本需要升级为jdk17,因为jdk8比较常用且稳定,本人又不想卸载掉安装的jdk8,在经过查找资料后找到了可以通过修改环境变量在本地任意切换jdk版本 环境变量配置 网上教程一堆,直接跳过了,这里主要说明怎么通过配置环境变量切换 电脑->属性->高级系统设置-&g…

Java 多线程的线程间的协作

1. 等待与通知 为了支持多线程之间的协作&#xff0c;JDK 中提供了两个非常重要的方法&#xff1a;wait() 和 notify() &#xff0c;这两个方法定义在 Object 类中&#xff0c;这意味着任何 Java 对象都可以调用者两个方法。如果一个线程调用了 object.wait() 方法&#xff0c;…

K8s学习笔记——资源组件篇

引言 前一篇文章我们介绍了K8s的概念理解和常用命令&#xff0c;这篇我们重点介绍K8s的资源组件和相关配置使用。 1. Node & Pod Node: 是 Pod 真正运行的主机&#xff0c;可以是物理机&#xff0c;也可以是虚拟机。为了管理 Pod&#xff0c;每个 Node 节点上至少要运行…