MQTT(详解)

什么是MQTT

        MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,用于在设备之间传输消息它通常用于物联网(IoT)和传感器网络中,可以在不同设备之间进行可靠的通信,而且资源消耗相对较低。MQTT基于发布/订阅模型,允许设备发布消息到特定主题(topic),并让订阅了相同主题的设备接收这些消息。这使得MQTT成为了在资源受限或需要实时通信的环境中非常有用的协议,比如监控系统、传感器网络、智能家居等领域。

MQTT原理

        MQTT 是基于 TCP/IP 协议栈实现的,它使用了一个轻量级的客户端-服务器通信模式。以下是 MQTT 的基本实现原理:

        客户端和服务器:MQTT 通信涉及两个主要组件:客户端和服务器(或称为代理,Broker)。客户端可以是任何能够实现 MQTT 协议的设备或应用程序。

        发布/订阅模型:MQTT 使用了一种发布/订阅模型。客户端可以发布(Publish)消息到特定的主题(Topic),也可以订阅(Subscribe)特定主题以接收相关消息。

        主题(Topic):主题是消息的标识符,它允许客户端识别并选择感兴趣的消息类别。客户端可以订阅一个或多个主题,也可以发布到一个或多个主题。

        质量服务(QoS):MQTT 提供了不同级别的消息传递服务质量,从最多一次(QoS 0)到至少一次(QoS 1)以及只有一次(QoS 2)传递。这决定了消息的可靠性。

        连接和保持活动:客户端通过 TCP/IP 连接到 MQTT 代理。一旦连接建立,客户端可以发送订阅请求、发布消息等。为了保持连接活跃,客户端可以定期发送心跳包(PINGREQ)给服务器。

        持久会话:客户端可以选择建立持久会话,这允许客户端在重新连接后接收到其在离线期间发布的消息。

        消息保留:服务器可以选择保留某个主题的最新消息,以便新订阅者在订阅后立即收到消息。

        安全性:MQTT 可以通过添加安全层(例如TLS/SSL)来保护通信内容,确保数据的安全性。

相关概念知识

        1. 协议基础

        MQTT 是一种发布/订阅(Publish/Subscribe)消息传递协议,专为低带宽、高延迟或不稳定网络环境设计。它基于 TCP/IP 或其他网络协议实现,可以运行在任何与网络相关的设备上。

        2. 客户端和服务器

        MQTT 包含两个主要角色:客户端和代理(Broker)。

        客户端:可以是设备、应用程序或其他系统,它们可以发布消息或订阅主题以接收消息。

        代理:是中介,负责接收来自客户端的消息,并将其传递给感兴趣的订阅者。

        3. 主题(Topics)

        主题是 MQTT 中消息的主要标识符。它是一个简单的字符串,用于标识发布和订阅的消息类别。

        订阅者可以订阅一个或多个主题以接收相关消息。

        发布者发布消息时,可以选择指定一个或多个主题。

        4. 发布(Publish)

        客户端可以发布消息到一个或多个主题。发布消息时,可以指定消息的质量服务等级(QoS)。

        5. 订阅(Subscribe)

        客户端可以订阅一个或多个主题,以接收相关的消息。订阅者可以选择订阅特定主题的所有消息,或者只接收保留的最新消息。

        6. 质量服务等级(QoS)

        MQTT 提供了三个不同级别的消息传递服务质量。

        QoS 0:至多一次,消息可能会丢失或重复传递。

        QoS 1:至少一次,确保消息至少传递一次,但可能会重复传递。

        QoS 2:只有一次,确保消息仅传递一次。

        7. 保留(Retained)

        服务器可以选择保留某个主题的最新消息,以便新订阅者在订阅后立即收到消息。

        8. 持久会话(Clean Session)

        客户端可以选择建立持久会话,允许客户端在重新连接后接收其在离线期间发布的消息。

        9. 心跳包(Keep Alive)

        为了保持连接活跃,客户端和服务器之间定期发送心跳包以确认连接状态。

        10. 安全性

        MQTT 可以通过添加安全层(例如TLS/SSL)来保护通信内容,确保数据的安全性。

MQTT优点

        1. 轻量级通信:MQTT 的消息头部相对较小,占用的带宽和资源较少,使其在受限的网络环境下表现良好。

        2. 实时通信:支持快速响应,适用于需要实时交互的应用,如远程控制或监控。

        3. 发布/订阅模型:采用发布/订阅模型,支持多设备之间的消息传递,不需要直接连接到特定设备。

        4. 消息保证:提供多个服务质量(QoS)级别,从最多一次传递到确保至少一次传递,可以根据需要保证消息的可靠传递。

        5. 持久会话:允许客户端建立持久会话,使得在客户端离线时,可以保留未发送的消息,等待下次连接时发送。

        6. 消息保留:服务器可以保留特定主题的最新消息,以便新订阅者在订阅后立即接收消息。

        7. 安全性:可以通过添加安全层(例如TLS/SSL)来保护通信内容,确保数据的安全性。

        8. 跨平台:MQTT 是一个开放的协议,可以在不同的硬件平台和操作系统上实现。

MQTT缺点

        1. 消息丢失或重复:在网络不稳定的情况下,可能会发生消息丢失或重复传递的情况,需要额外的措施来处理。

        2. 连接管理:需要有效地管理客户端连接,以避免资源浪费。

        3. 复杂性:在复杂的网络拓扑或大规模部署时,可能需要仔细规划和管理主题和订阅。

        4. 资源消耗:如果配置不当,可能会导致设备的资源消耗过高。

        5. 安全性设置:需要适当地配置安全性设置以保护通信内容,否则可能会存在安全风险。

        MQTT 是一种非常有用的通信协议,特别适用于物联网、传感器网络和实时监控等应用。然而,在使用时需要考虑到其特性以及网络环境,以确保其有效运行。

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

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

相关文章

YOLOv5配置文件之 - yaml

在YOLOv5的目录中,models文件夹里存储了YOLO的模型配置。 ./models/yolov5.yaml 定义了YOLOv5s网络结构的定义文件 yaml的主要内容 参数配置 nc: 80 类别数量 depth_multiple: 0.33 模型深度缩放因子 width_multiple: 0.50 控制卷积特征图的通道个数 anchors配…

【Docker】Docker-Compose内置DNS负载均衡失效问题

Docker Compose实现负载均衡 还是对前面的例子docker-compose.yml稍微修改: version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOSTredis-server- REDIS_PASS${REDIS_PASS}healt…

N-129基于springboot,vue学生宿舍管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vuevue-element-admin 服务端技术:springboot,mybatis…

UML中类之间的六种主要关系

UML中类之间的六种主要关系: 继承(泛化)(Inheritance、Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组…

JDK API Diff Report Generator-Java版本对比工具

今天查资料找到了除了EMT4J之外,其他可以用于Java版本迁移的工具。 这里简单的记录一下。 非Java er,有不同意见欢迎评论区交流。 JDK API Diff Report Generator JDK API Diff是一个用于比较不同Java版本API区别的工具。github地址在这里。 例如&am…

Android---StartActivity启动过程

在手机桌面应用中点击某一个 icon 之后,最终是通过 startActivity 去打开某一个 Activity 页面。我们知道,Android 中的一个 APP 就相当于一个进程。所以,startActivity 操作中还需要判断,目标 Activity 的进程是否已经创建。如果…

竞赛选题 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…

STM32-ADC实验

目录 实验1:单ADC单通道中断 硬件原理图 USART配置 ADC1配置 初始化结构体的参数 ScanConvMode:扫描转换模式 ContinuousConvMode:连续转换模式 ExternalTrigConv:外部触发方式 测试环节 实验现象 实验2:单…

【疑问解决】在自动装箱中Integer赋予一个常量1,为什么会出现==判断true和flase的情况(JDK源码、内部缓冲)

问题来源自讲课时的Integer练习中 当时第一反应是false true true 因为第一段的输出为flase毋庸置疑了,因为已经new了两个新的堆空间,当然指向不同的空间了 但是第二段第三段就没有头绪了,自动装箱了难道不是执行同一个空间吗…

服务网络基础

服务网络基础 目录 前言 从今天开始我们将进入服务网格的学习,服务网格是微服务架构中的一种重要的技术,它可以解决微服务架构中的一些问题,比如服务发现、服务治理、服务监控等等,我们将从服务网格的基础开始,逐步深…

怎么突破反爬虫机制

在当今的数字化时代,网络爬虫已经成为了收集信息和数据的重要工具。然而,许多网站和平台都配备了反爬虫机制,以防止恶意攻击和过度访问。对于普通用户来说,如何突破这些反爬虫机制呢?本文将为你提供一些实用的技巧和建…

权限系统设计(转载)

1 为什么需要权限管理 2 权限模型 2.1 权限设计 2.2 为什么需要角色 2.3 权限模型的演进 2.4 用户划分 2.5 理想的RBAC模型 3 权限系统表设计 3.1 标准RBAC模型表设计 3.2 理想RBAC模型表设计 4 结语 1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们&a…

流程引擎-自定义函数的应用

背景: 某些业务需求比较特殊,需要在表单中校验或实现一些功能,泛微流程表单配置时实现的方式多种多样:JS脚本、SQL语句、公式以及其他一些标准化拖拽功能,本次给大家分享一下流程表单中的公式实现的一些需求场景。泛微…

Python轮廓追踪【OpenCV形态学操作】

文章目录 概要代码运行结果 概要 一些理论知识 OpenCV形态学操作理论1 OpenCV形态学操作理论2 OpenCV轮廓操作|轮廓类似详解 代码 代码如下,可以直接运行 import cv2 as cv# 定义结构元素 kernel cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # print kern…

安装虚拟机找不到虚拟网啦1(eth1)不出现

一、安装虚拟机找不到虚拟网啦1(eth1)不出现 1、先安装virtualbox 2、再安装vagrant 3、在windows使用ipconfig没有VirtualBoxHost-OnlyNetWork解决方法 1) 解决办法 在windows的设置中找到 网络和Internet 选项,选择右侧 更改适配器选项 …

selenium+python web自动化测试框架项目实战实例教程

自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行... 可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到实际项目中&…

Android Studio 导出 jar

AS版本:Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

【Java 进阶篇】Java Request 继承体系详解

在Java编程中,Request(请求)是一个常见的概念,特别是在Web开发中。Request通常用于获取来自客户端的信息,以便服务器能够根据客户端的需求提供相应的响应。在Java中,Request通常涉及到一系列类和接口&#…

CentOS 编译安装TinyXml2

安装 TinyXml2 Git 源码下载地址:https://github.com/leethomason/tinyxml2 步骤1:首先,你需要下载tinyxml2的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …