MQTT协议的工作原理

news2024/11/15 17:34:03

一、MQTT概述

        MQTT由IBM的Andy Stanford-Clark博士和Arcom(现为Eurotech)的Arlen Nipper于1999年发明。

        MQTT 是物联网 (IoT) 最常用的消息传递协议。MQTT 代表 MQ 遥测传输。该协议是一组规则,用于定义物联网设备如何通过互联网发布和订阅数据。 MQTT 用于物联网和工业物联网 (IIoT) 设备之间的消息传递和数据交换, 如嵌入式设备, 传感器, 工业PLC等.该协议是事件驱动的,并使用发布/订阅(发布/订阅)模式连接设备。发送方(发布方)和接收方(订阅方)通过主题进行通信,并且彼此分离。它们之间的连接由 MQTT 代理处理。MQTT 代理过滤所有传入消息并将其正确分发给订阅者。

        MQTT 是一种低开销协议,以适应带宽和 CPU 限制,旨在在嵌入式环境中运行,在那里它可以提供可靠、有效的通信路径。MQTT 适用于连接代码占用量较小的设备,对于由于偶尔的带宽限制或不可靠的连接而经历不同延迟水平的无线网络来说,MQTT 是一个不错的选择。该协议在从汽车到能源再到电信的行业都有应用。

        MQTT官网

开始 (mqtt.org)icon-default.png?t=MBR7https://mqtt.org/getting-started/        MQTT 使用基于主题的简单发布/订阅通信。

 二、MQTT 协议主要组件

1、MQTT 发布者/订阅者

        MQTT 中的第一个主要概念是发布者/订阅者系统。发布者设备发布有关特定主题的消息,订阅者设备订阅将由发布者发送的主题。最重要的是,多个设备可以订阅该主题。

2、MQTT – 消息

        它是我们希望在通过MQTT协议连接的物联网设备之间共享的数据或命令。

3、MQTT- 主题

        主题也是理解 MQTT 的第三个重要概念。在此协议中,多个设备可以订阅发布者,以根据其寄存器兴趣接收特定消息。主题定义我们要发布消息的设备。

4、MQTT 代理

        MQTT 代理充当发送消息的客户端和接收这些消息的订阅者的中间人。在邮局的类比中,经纪人是邮局本身。所有消息都必须通过代理,然后才能传递给订阅者。

        代理可能需要处理数百万个并发连接的 MQTT 客户端,因此在选择 MQTT 代理时,企业应根据其可扩展性、集成性、监控和抗故障能力对其进行评级。

三、MQTT 是如何工作的?

        如前所述,MQTT 协议使资源约束的物联网设备能够将某些主题的信息发布或发送到充当 MQTT 消息代理的服务器。代理的功能是仅将该信息推送到以前订阅该主题的那些客户端。简而言之,我们可以解释这个基本思想,因为发布者负责通过经纪人生成信息并将其传输给订阅者。代理的主要功能是通过检查订阅者和发布者的授权来确保安全性。

        为了解释 MQTT 协议的工作原理,我们将 MQTT 会话分为 4 个阶段,例如连接、身份验证、通信和终止。

        首先,TCP / IP连接通过使用由代理操作定义的标准或自定义端口从客户端到代理启动。
        建立连接时,请务必识别服务器是继续旧会话还是新会话。
        如果向代理提供了重用的客户机身份,则旧会话将继续。

1、连接

        正如我们上面提到的,MQTT协议是一种资源受限的协议,并且由于它在物联网设备中被广泛使用,因此SSL / TLS并不总是一种选择,因此在某些情况下是不可取的。但在这种情况下,此身份验证显示为明文用户名和密码,客户端通过将其附加到连接/connack 数据包序列将其发送到服务器。

2、身份验证和终止

        在通信阶段,客户端可以执行发布、订阅、取消订阅和ping操作等操作。发布的基本功能是发送发布者定义的二进制数据块。内容的格式是特定于应用程序的。对于订阅服务,使用名为订阅/回购的数据包对,对于取消订阅操作,使用取消订阅/取消回购数据包对。

        对于ping操作,客户端可以使用pingreq / pingresp数据包序列检查其与代理的连接。它使客户端与经纪人的连接保持活跃。要记住的重要一点是,发布者和订阅者之间没有直接联系。

四、MQTT 的通信类型

        MQTT 有两种类型的通信,非加密通信/加密通信。

        为这两种类型的通信分配了不同的端口号。如果我们谈论非加密通信的标准端口,则端口号为1883,如果我们需要使用标准端口进行加密通信,则端口号为8883,并且它们使用SSL / TLS

        对于所需的SSL / TLS握手进程ID,在此过程中,客户端通过验证服务器证书来验证它将要使用的服务器。当客户端要与代理建立连接时。

        客户端在连接建立握手期间向代理提供客户端证书。代理使用此证书对客户端进行身份验证。期望代理在SSL / TLS客户端证书的帮助下支持客户端的身份验证。

五、相关参考

MQTT 要点 - 所有核心概念解释 (hivemq.com)icon-default.png?t=MBR7https://www.hivemq.com/mqtt-essentials/        MQTT client/server for C++

GitHub - redboltz/mqtt_cppicon-default.png?t=MBR7https://github.com/redboltz/mqtt_cpp        MQTT python库

泛美卫生组织-MQTT ·皮皮 (pypi.org)icon-default.png?t=MBR7https://pypi.org/project/paho-mqtt/

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

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

相关文章

二叉树16:找树左下角的值

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:513.找树左下角的值 题目: 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边…

Android每周一轮子:Nvwa(热修复)

前言 (废话) 最近发现了一个问题,一些平时博客写的很多的程序员,反倒在日常的工作中,却是业务写的很一般,只会摆理论的人,甚至还跑出来教别人如何找工作,如何做架构,其实…

2022年终总结:少年不惧岁月长,彼方尚有荣光在。

2022年终总结:少年不惧岁月长,彼方尚有荣光在。 🎬 博客主页:王同学要努力 🎬个人简介:大三小白,喜欢前端 ,热爱分享 🎥 本文由 王同学要努力 原创,首发于…

Eureka 注册中心

Eureka 注册中心目录概述需求:设计思路实现思路分析1.快速上手2.增加 Maven 依赖3.Client端配置注册中心Server端配置注册中心参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip ha…

R 语言 管道操作符

背景 关于代码的简洁性,就是你使用了比较简化的高级操作符,但是有时候会增加代码的可读性。这种可读性在于你是否真正的去了解R的高级语法。你了解高级语法,他就不难,你不了解,他就难,可读性差。 这里我们来讲解一下,关于管道操作符,使R语言编程简化一些。 管道操作…

【登录流程执行逻辑】

1)整体流程图 2.main.js是入口,里面require("permission")时会触发方法体 在进行require("权限时"),会进行一系列初始化。 重定向。 接着走login方法。 vuex其实就是store。 触发vuex里面的方法: await store.dispatch(user/getInf…

CDN消耗速度太快,解决办法

前段时间发现我网站的CDN消耗速度太快了,20多块钱100G的流量,半个月甚至十几天左右都消耗完了。 于是我看CDN的访问ip并不多,发现大部分消耗的都是静态资源,js等文件。 后来找到了解决办法,目前100G还有这么多 方法 …

基于MVC的网上汽车城网站平台开发

摘要 随着现代都市生活节奏的不断加快、网络覆盖面的日益扩大,越来越多的人们加入了网上购物的行列。如今,网购已经成为人们生活的一部分。本系统主要是使用 B/S架构开发出的一个基于 ASP.NET的网上汽车城网站平台开发。前台页面使用CSSDIV,后…

Torch包学习

创建 torch.from_numpy(ndarray) → Tensor:将numpy.ndarray 转换为pytorch的 Tensor。两者共享内存。返回的张量不能改变大小。orch.linspace(start, end, steps100, outNone) → Tensor:生成一个 从start 到 end 的tensor。tensor的长度为steps。包括…

JVM【字节码与类的加载篇】

Class文件结构 字节码文件的跨平台性(了解) 1.Java语言:跨平台的语言 当Java源代码成功编译为字节码后,如果想在不同的平台上运行,则无须再次编译这个优势不再那么吸引人了。Python PHP perl ruby lisp等有强大的解释器跨平台似乎已经快成…

二叉树的遍历大全(前序,中序,后序)+(递归,迭代,Morris方法)

文章目录二叉树的前序遍历递归迭代Morris遍历二叉树的中序遍历递归迭代Morris遍历二叉树的后序遍历递归迭代Morris遍历二叉树的前序遍历 力扣传送门: https://leetcode.cn/problems/binary-tree-preorder-traversal/description/ 递归 递归的解法非常简单&#x…

快过年了,Python实现12306查票以及自动购票....

嗨害大家好鸭!我是小熊猫~ 明天就是2023年啦~ 还有谁像我小熊猫一样没有回家的? 这次康康能不能12306抢票回家!!! Python实现12306查票以及自动购票 [代码来源]: 青灯教育-自游老师 [环境使用]: Python 3.8Pycha…

构造函数和原型

1、概述 在典型的 OOP 的语言中(如 Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在 ES6之前, JS 中并没用引入类的概念。ES6, 全称 ECMAScript 6.0 ,201…

计算机组成原理实验——三、存储器实验

一、实验目的 1.掌握存储器的工作原理和接口。 2.掌握存储器的实现方法和初始化方法。 3.掌握RISC-V中存储器的存取方式。 二、实验内容 1.利用vivado IP核创建6432的ROM,并在 系数文件中设置数据为123489ab; 2.利用vivado IP核创建6432的RAM&#xf…

猿如意---初学者的一盏明灯---程序员的宝藏app

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​ 📣系列专栏:我的CSDN活动之旅 💬总结:希望你看完…

Rabbit客户端操作不同交换机[包含延迟类型]

文章目录一:direct-直投交换机0.0: 说明 --- 只有队列和交换机绑定,且routing key路由键一致才会收到消息1.1: 先后创建两个队列1.2: 队列绑定Direct交换机,和routing key1.3: 未指明路由键:1.4: 指明路由键1.5: 两个队列绑定一个…

Python中基本输入和输出

文章目录前言一、使用input()函数输入二、使用print()函数输出前言 从我们接触第一个Python程序开始,就一直在使用 print() 函数向屏幕上输出一些字符,如下图代码所示: print() 函数就是Python的基本输出函数。那既然有输出,肯定…

[牛客复盘] 牛客2022跨年场 20221212

[牛客复盘] 牛客2022跨年场 20221212 一、本周周赛总结二、 A 猜群名1. 题目描述2. 思路分析3. 代码实现三、B 分赃1. 题目描述2. 思路分析3. 代码实现四、C 翻卡牌1. 题目描述2. 思路分析3. 代码实现五、D ygg的分数运算1. 题目描述2. 思路分析3. 代码实现六、E 摇色子1. 题目…

多线程生产者消费者——分别使用条件变量、信号量实现

生产者消费者 概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不…

超好用!win10安装Eiseg标注软件及使用(CPU版本)

写在前面的话 众所周知,标注分割掩膜的软件一般使用labelme,但是一个一个点太麻烦了,工作量太大,,之前,我的思路就是先标少量的数据然后训练个初始模型,再用初始模型对剩下的图像预测掩膜&…