MQTT介绍

基本概念

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)由 Andy Stanford-Clark(IBM) 和 Arlen Nipper(Arcom, 现为 Cirrus Link) 于 1999 年发布,是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码和有限的带宽,为联网设备提供实时可靠的消息服务。 MQTT 协议广泛应用于物联网、 移动互联网、 智能硬件、 车联网、 智慧城市、 远程医疗、 电力、 石油与能源等领域。

MQTT 协议提供一对多的消息发布,可以解除应用程序耦合,信息冗余小。该协议需要客户端和
服务端,而协议中主要有三种身份:发布者(Publisher)代理(Broker,服务器)订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,而消息发布者可以同时是订阅者。

发布订阅模式(Publish-Subscribe Pattern) 是一种消息传递模式, 它将发送消息的客户端(发布者) 与接收消息的客户端(订阅者) 解耦, 使得两者不需要建立直接的联系也不需要知道对方的存在。MQTT代理(Broker负责所有消息的路由和分发工作, 发布者将带有主题的消息发送给代理, 订阅者则向代理订阅主题来接收感兴趣的消息。MQTT中主题和订阅无法被提前注册或创建, 所以代理也无法预知某一个主题之后是否会有订阅者,以及会有多少订阅者, 所以只能将消息转发给当前的订阅者, 如果当前不存在任何订阅, 那么消息将被直接丢弃。

在 MQTT 发布/订阅模式中, 一个客户端既可以是发布者, 也可以是订阅者, 也可以同时具备这两个身份。当客户端发布一条消息时, 它会被发送到代理, 然后代理将消息路由到该主题的所有订阅者。 当客户端订阅一个主题时, 它会收到代理转发到该主题的所有消息。

一般来说, 大多数发布/订阅系统主要通过以下两种方式过滤并路由消息。

  • 根据主题
    订阅者向代理订阅自己感兴趣的主题, 发布者发布的所有消息中都会包含自己的主题, 代理根据消息的主题判断需要将消息转发给哪些订阅者。
  • 根据消息内容
    订阅者定义其感兴趣的消息的条件, 只有当消息的属性或内容满足订阅者定义的条件时, 消息才会被投递到该订阅者。

MQTT 典型特征
1.使用 TCP/IP 提供网络连接,提供有序、无损、双向连接;
2.具体有三种消息发布的服务质量(设备网络环境复杂);
3.小型传输,开销小,固定长度头部 2 字节,协议交换最小化,降低网络流量,轻量省带宽;
4.使用Last Will(遗言)通知有关各方客户端异常中断的机制(持续地会话感知能力);
5.数据无关(不关心 Payload 数据格式);

常见概念解释:

常见概念解释
MQTT客户端一个使用MQTT协议的设备、应用程序
MQTT服务器MQTT服务器称为Broker(消息代理),其负责接收发布者的消息, 并将消息转发至符合条件的订阅者。 另外, 代理也需要负责处理客户端发起的连接、 断开连接、 订阅、 取消订阅等请求
主题(Topic)主题是 MQTT 进行消息路由的基础, 它类似 URL 路径, 使用斜杠 / 进行分层, 比如sensor/1/temperature。 一个主题可以有多个订阅者, 代理会将该主题下的消息转发给所有订阅者, 一个主题也可以有多个发布者, 代理将按照消息到达的顺序转发
服务质量(QoS)服务质量 ,表明此主题范围内传送到客户端所需的一致程度
会话(Session)每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互
订阅(Subscription)订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS),一个会话可包含多个订阅,MQTT 还支持通过共享订阅的方式在多个订阅者之间实现订阅的负载均衡
发布 (Publish)负责将消息发布到主题上, 发布者一次只能向一个主题发送数据, 发布者发布消息时也无需关心订阅者是否在线
负载(Payload)消息订阅者具体接收的内容
遗言(Last Will)遗言机制,用来通知同一主题下其他设备发送遗言的设备已经断开了连接

主要优点介绍

轻量高效,节省带宽

MQTT 将协议本身占用的额外消耗最小化, 消息头部最小只需要占用 2 个字节, 可稳定运行在带宽受限的网络环境下且MQTT 客户端只需占用非常小的硬件资源, 能运行在各种资源受限的边缘端设备上。

可靠的消息传递

MQTT 协议提供了 3 种消息服务质量等级(Quality of Service),保证了在不同的网络环境下消息传递的可靠性。除QoS外,MQTT还提供了清除会话机制。

  • QoS 0: 消息最多传递1次。如果当时客户端不可用, 则会丢失该消息。 发布者发送一条消息之后, 就不再关心它有没有发送到对方, 也不设置任何重发机制。
  • QoS 1: 消息传递至少 1 次。包含了简单的重发机制, 发布者发送消息之后等待接收者的 ACK, 如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次, 但无法保证消息重复。
  • QoS 2: 消息只传送1次。设计了重发和重复消息发现机制, 保证消息到达对方并且严格只到达一次。
  • 清除会话(Clean Session) 机制。 对于那些想要在重新连接后, 收到离线期间错过的消息的客户端, 可在连接时设置关闭清除会话, 此时服务端将会为客户端存储订阅关系及离线消息, 并在客户端再次上线后发送给客户端。

安全的双向通信

依赖于发布订阅模式, MQTT 允许在设备和云之间进行双向消息通信。 发布订阅模式的优点在于: 发布者与订阅者不需要建立直接连接, 也不需要同时在线, 而是由消息服务器负责所有消息的路由和分发工作。
MQTT 支持通过 TLS/SSL 确保安全的双向通信, 同时 MQTT 协议中提供的客户端 ID、 用户名和密码允许我们实现应用层的身份验证和授权。

在线状态感知

为了应对网络不稳定的情况, MQTT 提供了心跳保活(Keep Alive) 机制。 在客户端与服务端长时间无消息交互的情况下, Keep Alive 保持连接不被断开, 若一旦断开, 客户端可即时感知并立即重连。
同时, MQTT 设计了遗愿(Last Will) 消息, 让服务端在发现客户端异常下线的情况下, 帮助客户端发布一条遗愿消息到指定的 MQTT 主题。

MQTT 与其他协议对比

MQTT是应用层协议,和HTTP(S)/FTP/POP3/DNS/TELNET等处于同一级别,TCP/UDP是传输层协议。

MQTT vs HTTP

  • MQTT 的最小报文仅为 2 个字节, 比 HTTP 占用更少的网络开销。
  • MQTT 与 HTTP 都能使用 TCP 连接, 并实现稳定、 可靠的网络连接。
  • MQTT 基于发布订阅模型, HTTP 基于请求响应, 因此 MQTT 支持双工通信。
  • MQTT 可实时推送消息, 但 HTTP 需要通过轮询获取数据更新。
  • MQTT 是有状态的, 但是 HTTP 是无状态的。
  • MQTT 可从连接异常断开中恢复, HTTP 无法实现此目标。
  • 针对松耦合下发布者对订阅者接收处理消息不清楚的情况,MQTT 5.0 增加了请求响应特性, 订阅者收到消息后向某个主题发送应答, 发布者收到应答后再进行后续操作

MQTT vs XMPP

  • MQTT 报文体积小且编解码容易, XMPP 基于繁重的 XML, 报文体积大且交互繁琐。
  • MQTT 基于发布订阅模式, 相比 XMPP 基于 JID 的点对点消息路由更为灵活。
  • MQTT 支持 JSON、 二进制等不同类型报文。 XMPP 采用 XML 承载报文, 二进制必须 Base64 编码等处理。
  • MQTT 通过 QoS 保证消息可靠传输, XMPP 主协议并未定义类似机制。

MQTT vs TCP

TCP协议诞生于1974年冷战期间。MQTT诞生于1999年互联网初期,TCP协议比MQTT协议诞生早了25年。TCP是OSI第四层的传输层协议。MQTT是第五层应用层协议。

  • 协议定位
    TCP设计考虑的是面向连接的、可靠的、基于字节流的传输层通信协议。
    MQTT则是在低带宽高延迟不可靠的网络下进行数据相对可靠传输的应用层协议。

  • 设计思想
    TCP的核心思想是分组交换。
    MQTT的核心思想是简单并适应物联网环境。

  • 传输单位
    TCP的传输单位是packet,当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。
    MQTT的传输单位是消息,每条消息字节上限在MQTT Broker代理服务器上进行设置,可以设置超过1M大小的消息上限。这样,就可以用一条消息就发送上千条采集的数据,或者比较大的设备阴影文件。

  • 技术挑战
    TCP需要解决的问题是在IP包传输过程中,处理异构网络环境下的网络拥塞、丢包、乱序、重复包等多种问题。
    MQTT解决的问题是,在低带宽高延迟不可靠的网络下和资源有限的硬件环境内,进行相对可靠的数据传输。

  • 服务质量
    TCP是一个可靠的流传输服务,通过ACK确认和重传机制,能够保证发送的所有字节在接收时是完全一样的,并且字节顺序也是正确的。
    MQTT提供三种可选的消息发布的QoS服务等级。MQTT客户端和MQTT代理服务器通过session机制保证消息的传输可靠性。开发人员可以根据业务需要选择其中一种。

  • 应用案例
    TCP用于许多互联网应用程序,如WWW、email、FTP、SSH、P2P、流媒体。MQTT也是基于TCP的。
    MQTT可以用于物联网数据传输、IM聊天软件等。

MQTT vs MQ(消息队列)

  • 二者很多行为和特性非常接近, 比如都采用发布/订阅模式, 但是他们面向的场景却有着显著的不同。 消息队列主要用于服务端应用之间的消息存储与转发, 这类场景往往数据量大但客户端数量少。 MQTT 是一种消息传输协议, 主要用于物联网设备之间的消息传递, 这类场景的特点是海量的设备接入、 管理与消息传输。
  • 在一些实际的应用场景中, MQTT 与消息队列往往会被结合起来使用, 以使 MQTT 服务器能专注于处理设备的连接与设备间的消息路由。 比如先由 MQTT 服务器接收物联网设备上报的数据, 然后再通过消息队列将这些数据转发到不同的业务系统进行处理。
  • 不同于消息队列, MQTT 主题不需要提前创建。 MQTT 客户端在订阅或发布时即自动的创建了主题, 开发者无需再关心主题的创建, 并且也不需要手动删除主题。

快速开始教程:https://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqtt

ref:https://assets.emqx.com/resources/ebooks/beginners-guide-to-the-mqtt-protocol.pdf

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

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

相关文章

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

真的是性能优化(压测)-纯思想

文章目录 概要优化指标-MD都是文字看看就行性能优化操作1、代码优化:2、系统配置与环境优化:3、架构与设计:4、~~实施与监控:~~5、~~开发流程和环境管理:~~ 总结 概要 性能优化是一个持续的过程,需要监控、…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为:感知机(Neuron)的学习算法主要包括以下步骤:感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法,用于将输入…

代码随想录算法训练营|day39

第九章 动态规划 62.不同路径63.不同路径II代码随想录文章详解总结 62.不同路径 dp[i][j] 表示从(0 ,0)出发到(i, j) 有dp[i][j]的路径数 边界值处理,(0 ,0)到(i,0)或(0, j),只有一条路径 对于当前位置,只能由左方和上方位置到达&#xff0c…

android input命令支持多指触摸成果展示-千里马framework实战开发

hi input命令扩展提示部分 generic_x86_64:/ # input -h Error: Unknown command: -h Usage: input [<source>] <command> [<arg>...]The source…

数智化转型的三大关键点

一、重新认识数智化转型 消费红利时代&#xff0c;伴随中国宏观经济向好发展&#xff0c;相当一部分企业可以轻松实现快速增长&#xff0c;如同搭乘了一架高速运转的电梯一路飞升。然而&#xff0c;随着宏观经济增速放缓&#xff0c;时代的电梯逐渐失去效力&#xff0c;中国商…

Chrome插件开发(一)—manifest.json文件介绍

创建Chrome插件的manifest.json文件&#xff0c;这是插件的元数据文件&#xff0c;用于定义插件的基本信息&#xff0c;权限&#xff0c;前台页面&#xff08;如弹出窗口的HTML&#xff09;&#xff0c;以及其他脚本等。 以下是根据Chrome扩展Manifest V3规范的一个较全面的字…

python3 Flask jwt 简易token认证实例

直接上代码 from flask import Flask, jsonify, request, make_response import jwt import datetime from functools import wrapsapp Flask(__name__)# 这是一个示例密钥&#xff0c;实际应用中应该使用一个复杂且随机的密钥 app.config[SECRET_KEY] your_secret_keydef t…

未来智能的发展走势

未来智能的发展走势可以预见是从人工智能走向人机融合智能&#xff0c;再到人机环境系统智能。这一趋势主要包括以下五个特点&#xff1a; 1、主动推荐 未来智能系统将能够主动根据用户的需求和兴趣&#xff0c;提供个性化的推荐和建议。这种推荐将基于大数据和机器学习算法&am…

第九节HarmonyOS 常用基础组件24-Navigation

1、描述 Navigation组件一般作为Page页面的根容器&#xff0c;通过属性设置来展示的标题栏、工具栏、导航栏等。 2、子组件 可以包含子组件&#xff0c;推荐与NavRouter组件搭配使用。 3、接口 Navigation() 4、属性 名称 参数类型 描述 title string|NavigationComm…

源代码管理——码云Gitee

目录 Git安装 Gitee配置SSH 源代码管理常规操作 1.idea配置git 2.常规操作 Git安装 安装Git是进行源代码管理的基本步骤之一。以下是在本地安装Git的通用步骤&#xff0c;适用于Windows系统&#xff1a; 下载Git安装程序: 访问Git官网的下载页面&#xff1a;Git官网下载地…

【前端素材】推荐优质后台管理系统Welly平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

现在学Oracle是49年入国军么?

今天周末&#xff0c;不聊技术&#xff0c;聊聊大家说的最多的一个话题 先说明一下&#xff0c;防止挨喷&#x1f606; 本人并不是职业dba&#xff0c;对数据库就是爱好&#xff0c;偶尔兼职&#xff0c;以下仅个人观点分析&#xff0c;如有不同观点请轻喷&#xff0c;哈哈&…

【动态规划介绍】

文章目录 前言一、动态规划是什么&#xff1f;动态规划的定义动态规划的历史背景动态规划的基本概念最优子结构重叠子问题记忆化 二、动态规划的工作原理1.分解子问题如何分解重叠子问题的重要性 2.存储解决方案存储方法优势 3.构建最终解决方案解决方案的构建 三、动态规划的类…

C语言5道编程题简单介绍

1、水仙花数&#xff08;Narcissistic number&#xff09;又被称为阿姆斯特朗数&#xff08;Armstrong number&#xff09;。水仙花数是指一个3位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身&#xff08;例如&#xff1a;1^3 5^3 3^3 153&#xff09;。 输出100…

vue3中的createApp函数

创建一个应用实例。 function createApp(rootComponent: Component, rootProps?: object): App详情信息&#xff1a; 第一个参数是根组件。第二个参数可选&#xff0c;它是要传递给根组件的 props。 我们在vue3中man.ts中常见的写法如下&#xff1a; createApp(App).use(r…

【数据结构和算法初阶(c语言)】数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)

1.何为数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。本质来讲就是在内存中去管理数据方式比如我们的增删查改。在内存中管理数据的方式有很多种&#xff08;比如数组结构、链式结构、树型结…

【Java程序员面试专栏 数据结构】六 高频面试算法题:字符串

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊数组,包括数组合并,滑动窗口解决最长无重复子数组问题,图形法解下一个排列问题,以及一些常见的二维矩阵问题,所以放到一篇Blog中集中练习 题目…

openGauss学习笔记-228 openGauss性能调优-系统调优-LLVM使用建议

文章目录 openGauss学习笔记-228 openGauss性能调优-系统调优-LLVM使用建议 openGauss学习笔记-228 openGauss性能调优-系统调优-LLVM使用建议 目前LLVM在数据库内核侧已默认打开&#xff0c;用户可结合上述的分析进行配置&#xff0c;总体建议如下&#xff1a; 设置合理的wor…