学习入门 MQTT 协议原理与应用场景

2023-11-12

学习认识 MQTT 协议

掌握学习MQTT协议
本文章学习借鉴于太极创客团队,以表感谢。官网http://www.taichi-maker.com/
在这里插入图片描述



一、MQTT是什么?

MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。以上MQTT(消息队列遥测传输)协议规范中的介绍很好地描述了MQTT的全部含义。它是一种很轻的通讯协议。与HTTP之类的协议相比,MQTT在通过网络传输数据时表现出众。该协议的另一个重要特点是易于在客户端实现。因此,MQTT成为了当今世界上最受欢迎的物联网协议。它已广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。目前通过MQTT协议连接的设备已经过亿,这些都得益于MQTT 协议为设备提供了稳定、可靠、易用的通信基础。


1.MQTT版本

目前MQTT主流版本有两个,分别是MQTT3.1.1和MQTT5。MQTT3.1.1是在2014年10月发布的,而MQTT5是在2019年3月发布的。由于MQTT3.1.1与MQTT5的时间相差了将近五年,且MQTT5的发布时间距今不久,因此在本文书写时(2020年10月),MQTT3.1.1仍然主流版本。

  1. MQTT3.1.1是MQTT5的基础,因此掌握了MQTT3.1.1后可以通过进一步学习掌握MQTT5的使用。
  2. 当前多种流行编程语言的MQTT客户端库仍然只支持MQTT3.1.1,而不支持MQTT5。
  3. 目前物联网环境中的大量设备仍然使用MQTT3.1.1协议而不支持MQTT5协议。

如果想要使用MQTT5。那么无需重新学习MQTT5,而只要利用MQTT3.1.1的基础再学习MQTT5的新功能就可以了。

二、MQTT基本原理

在MQTT协议通讯中,有两个最为重要的角色。它们分别是服务端和客户端。首先我们来初步了解一下它们。

1. MQTT服务端

MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。

2. MQTT客户端

MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为成为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。

MQTT主题

刚刚我们在讲解MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个“主题”。MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。

服务端是如何通过主题来控制客户端之间的信息通讯,流程如下图所示
在这里插入图片描述
在以上图示中一共有三个MQTT客户端。它们分别是汽车,手机和电脑。MQTT服务端在管理MQTT通讯时使用了“主题”来对信息进行管理的。比如上图所示,假设我们需要利用手机和电脑获取汽车的速度,那么我们首先要利用电脑和手机向MQTT服务器订阅主题“汽车速度”。接下来,当汽车客户端向服务端的“汽车速度”主题发布信息后,服务端就会首先检查以下都有哪些客户端订阅了“汽车速度”这一主题的信息。当它发现订阅了该主题的客户端有一个手机和一个电脑,于是服务端就会将刚刚收到的“汽车速度”信息转发给订阅了该主题的手机和电脑客户端。

MQTT客户端在通讯时,往往角色不是单一的。它既可以作为信息发布者也可以同时作为信息订阅者。如下图所示:

在这里插入图片描述

3. MQTT 发布/订阅 特性

服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步

相互可独立:

MQTT客户端是一个个独立的个体。它们无需了解彼此的存在,依然可以实现信息交流。比如以上实例中汽车客户端在发布“汽车速度”信息时,汽车客户端本身可以完全不知道有多少个MQTT客户端订阅了“汽车速度”这一主题。而订阅了“汽车速度”主题的手机和电脑客户端也完全不知道彼此的存在。大家只要订阅了“汽车速度”主题,MQTT服务端就会在每次收到新信息时,将信息发送给订阅了“汽车速度”主题的客户端。

空间可分离:

空间分离相对容易理解,MQTT客户端在通讯必要条件是连接到了同一个MQTT通讯网络。这个网络可以是互联网或者局域网。只要客户端联网,无论他们远在天边还是近在眼前,都可以实现彼此间的通讯交流。

时间可异步:

MQTT客户端在发送和接收信息时无需同步。这一特点对物联网设备尤为重要。有时物联网设备会发生意外离线的情况。我们使用以上实例二的场景来作为示例。当我们的汽车在行驶过程中,可能会突然进入隧道,这时汽车可能会断开与MQTT服务端的连接。假设在此时我们的手机客户端向汽车客户端所订阅的“空调温度”主题发布了信息,而汽车恰恰不在线。这时,MQTT服务端可以将“空调温度”主题的新信息保存,待汽车再次上线后,服务端再将“空调温度”信息推送给汽车。

三、MQTT客户端连接服务端

1. 首先MQTT客户端将会向服务端发送连接请求。

该请求实际上是一个包含有连接请求信息的数据包。这个数据包的官方名称为CONNECT。
在这里插入图片描述

2. MQTT服务端收到客户端连接请求后,会向客户端发送连接确认。

同样的,该确认也是一个数据包。这个数据包官方名称为CONNACK。
在这里插入图片描述

2. CONNECT – 连接服务端

在上面的描述中我们看到。MQTT客户端要想连接服务端,首先要向服务端发送CONNECT报文。如果此CONNECT报文的格式或内容不符合MQTT规范,则服务器会拒绝客户端的连接请求。

CONNECT报文内容如下图所示
在这里插入图片描述

MQTT客户端要想连接服务端,首先要向服务端发送CONNECT报文。如果此CONNECT报文的格式或内容不符合MQTT规范,则服务器会拒绝客户端的连接请求。

报文 如上图红框所示这个题数据包

所谓报文就是一个MQTT数据包。这个数据包中可能包含有多个信息。比如以上图片就是描绘了一个CONNECT报文(数据包)的详细内容。

信息 如上图绿色的信息栏的内容

在这个CONNECT报文(数据包)中包含有多个信息。上图左侧栏中的内容是CONNECT报文所包含的信息名称。右侧是信息的具体内容。如上图示例中,此CONNECT报文包含有名称为clientId的信息,该信息的内容是”client-1″。当然,上图只是一个示例,不是所有的CONNECT报文中的clientId信息内容都是”client-1″。

clientId – 客户端ID

ClientId是MQTT客户端的标识。MQTT服务端用该标识来识别客户端。因此ClientId必须是独立的。如果两个MQTT客户端使用相同ClientId标识,服务端会把它们当成同一个客户端来处理。通常ClientId是由一串字符所构成的,如上图所示,此示例中的clientID是“client-1”。

该表示类似与网络IP 一样独立,

cleanSession – 清除会话

为了保证重要的MQTT报文可以被客户端准确无误的收到。在服务端向客户端发送报文后,客户端会向服务端返回一个确认报文。如果服务端没有收到客户端返回的确认报文,那么服务端就会认为刚刚发送给客户端的报文没有被准确无误的送达。在这种情况下,服务端将会执行以下两个操作:

操作1:将尚未被客户端确认的报文保存起来

操作2:再次尝试向客户端发送报文,并且再次等待客户端发来确认信息。

如果cleanSession 被设置为“true”。那么服务端不需要客户端确认收到报文,也不会保存任何报文。在这种情况下,即使客户端错过了服务端发来的报文,也没办法让服务端再次发送报文。其实我们从字面上也很容易理解。cleanSession 的第一个词是clean。这个词的意思是clean(干净)的。服务端一旦发送完报文,就会把报文忘得“干干净净”了。

反过来,如果我们将cleanSession 设置为”false”。那么服务端就知道,后续通讯中,客户端可能会要求我保存没有收到的报文。

从以上的描述不难看出,如果某个客户端用于收发非常重要的信息(比如前文示例中汽车自动驾驶系统),那么该客户端在连接服务端时,应该将cleanSession设置为”false”。这样才能让服务端保存那些没有得到客户端接收确认的信息。以便服务端再次尝试将这些重要信息再次发送给客户端。

相反的,如果某个客户端用于收发不重要的信息(比如前文示例中车载音乐系统)那么该客户端在连接服务端时,应该将cleanSession设置为”true”。

keepAlive – 心跳时间间隔

MQTT服务端运行过程中,当有客户端因为某种原因断开了与服务端的连接,服务端需要实时了解这一情况。KeepAlive (心跳时间间隔)正是用于服务端了解客户端连接情况的。不过关于KeepAlive (心跳时间间隔)目前讲解还为时过早,我们会在后续的课程中给您做详细介绍。目前您只需要记住,KeepAlive用于服务端实时了解客户端是否与其保持连接的情况。

3. CONNACK – 确认连接请求

下图是CONNACK报文所包含的信息内容

在这里插入图片描述

returnCode – 连接返回码

当服务端收到了客户端的连接请求后,会向客户端发送returnCode(连接返回码),用以说明连接情况。如果客户端与服务端成功连接,则返回数字“0”。如果未能成功连接,连接返回码将会是一个非零的数值,具体这个数值的含义,请见下图所示:

在这里插入图片描述

sessionPresent – 当前会话

对于不重要的MQTT客户端,它们在向服务器发送连接请求时,CONNECT报文中的cleanSession通常设置为true。原因是这类不重要的MQTT客户端即使丢失信息也不会影响整体系统运行。因此服务端在看到客户端的cleanSession为true时,就不会保存发送给它们的信息。

然而对于汽车导航系统这类重要的MQTT客户端来说。当它在连接服务端时,cleanSession肯定时设置为false。原因是重要客户端需要服务端确保信息发送准确无误。如果服务端发现发送给重要客户端的信息没有得到确认,会将报文进行保存。

当重要客户端连接服务端时,服务端可能保存着没有得到确认的报文。如果是这样的话,那么客户端在连接服务端时,就会通过sessionPresent来了解服务端是否有之前未能确认的信息。
首先,

当客户端发送的CONNECT报文中的cleanSession设置为true。在这种情况下,客户端是不需要服务端保存任何报文的。那么服务端发送的确认连接CONNACK报文中,sessionPresent肯定是false,也就是说,服务端没有保存任何报文。

当客户端发送的CONNECT报文中的cleanSession设置为false时,客户端是要求服务端保存报文的。在这种情况下,如果服务端的确保存了没有收到客户端接收确认的报文信息,那么cleanSession为true,否则为false。

简言之,CONNACK报文的sessionPresent与CONNECT报文的cleanSession相互配合。其作用是客户端发送连接请求时,服务端告知客户端有没有保存报文信息。这个被服务端保存的报文信息是来自于上一次客户端连接时,服务端曾经发送此报文给客户端,但是发送后没有收到客户端接收确认。

下一节。开始使用MQTT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习入门 MQTT 协议原理与应用场景 的相关文章

  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 用CHAT写一份标题为职业教育教师教学能力提升培训总结

    CHAT回复 标题 职业教育教师教学能力提升培训总结 一 活动概述 本次由学校组织的职业教育教师教学能力提升培训于8月15日至8月20日顺利进行 来自全校的60位职业教育教师参与了此次培训 主讲人为享有盛名的教育专家马丁先生 二 培训内容与
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • 独家 | 鸿蒙(HarmonyOS)开发详细学习笔记免费分享

    前言 华为宣布 将在1月18日 在北京 上海 杭州 南京 成都 厦门 武汉 长沙 8 大城市同时召开大会 届时将揭秘鸿蒙生态和 HarmonyOS NEXT 进阶新篇章 简单的来说就是 纯血鸿蒙系统 即将彻底揭晓 鸿蒙系统自推出来以来 就一
  • 内网安全:隧道技术详解

    目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一 CS反向连接上线 拿下Win2008 一 使用转发代理上线创建监听器 二 上传后门执行上线 隧道技术 SMB协议 SMB协议介绍
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D
  • 网络安全行业热门认证证书合集

    网络安全认证证书 就和学历一样是敲门砖 拿到了可以用不到 但不能没有 技术大牛可以没有证书 但普通人不能没有 1 初级入门 就像学历在职场上展示一个人的基本素养一样 网络安全认证证书可以展示一个人在网络安全领域具备的基本知识和技能 它为初学
  • 如何使用 MQTT Paho 在 RabbitMQ 队列中订阅

    我正在尝试从我的 Android 应用程序连接到一个名为 消息 的队列 生产者 AMQP 协议下的一种 Web 服务 已连接 可以通过 RabbitMQ 管理面板进行检查 为了从我的 Android 设备进行连接 我正在这样编码 priva
  • AWS-IoT 核心代理的最大消息负载大小是多少?

    在文档中AWS 服务限制 https docs aws amazon com general latest gr aws service limits htmlIoT Core 服务的有效负载大小限制尚不清楚 既然我们可以将本地 mosqu
  • 我可以向通过 MQTT WebSocket 连接的一组 Azure IoT 中心设备发送消息吗?

    Goal 将消息发送到一组通过 MQTT WebSocket 连接的 Azure IoT 中心设备 初步想法 让一组 IoT 中心设备 组 X 订阅主题 X 的消息 Problem On the 使用 MQTT 协议与 IoT 中心通信 h
  • 从 Lambda 向 AWS IoT Core 发布 MQTT 消息

    我是 AWS 世界的新手 目前正在开发一项 Alexa 技能 该技能只需向 AWS IoT Core 代理发布一条 mqtt 消息 与之前创建的 事物 和主题进行交互 目前我正在使用 boto3 但我不确定这是正确的路径 这是代码 但在部署
  • 将消息从 AWS Lambda 发布到 AWS IoT

    我正在尝试使用 Nodejs 将消息从 AWS Lamba 发布到 AWS IoT 我已压缩该项目并上传到 AWS IoT 下面是代码片段 var awsIot require aws iot device sdk var device a

随机推荐

  • 数字化升级里,RPA的下一步正在走向哪?

    如果说 API这种能力在2021年并未成为 刚需 那么在2022年其已经一跃成为RPA进入企业真正场景的 必需品 作者 斗斗 编辑 皮爷 出品 产业家 今年八月 调查机构Gartner发布了2022全球RPA魔力象限 数据显示 2021年
  • 科学实验中剔除坏值的方法--肖维勒准则法

    def Chauvenet v c 5 1 65 6 1 73 7 1 8 8 1 86 9 1 92 10 1 96 11 2 12 2 03 n len v ave getAve v stdDev getStdDev v if len
  • mac的find命令

    在mac上使用find查找某个文件夹下面的所有 md文件 find name md 在mac上报如下错误 find illegal option n 在stackoverflow上找到了答案 https stackoverflow com
  • DBus研究笔记(一)

    一 建立连接 要使用DBus进行通信必须首先与系统建立连接 并申请一个 域名 使得其他应用可以找到你 常用DBusConnection dbus bus get DBusBusType DBusError 系列函数来与bus daemon建
  • 关于C++中constexpr的用法

    在C 11 primer中 关于constexpr用法给出的解释是 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式 声明为constexpr的变量一定是一个常量 而且必须用常量表达式初始化 第一句中 c
  • 冬来春往

    二月 我回来了 黄昏与日落 高山与河流 城镇与村庄 冷风 我感觉到了你透过车窗缝隙那透心凉的滋润 随着二月而来 又伴三月而去 二月 你游戏了我春去冬来的过往 如候鸟一般 俯瞰天南地北 归去来兮 候鸟 你是一种循着春节轻装上阵飞翔的姿态 天空
  • Java获取文本文件字符编码的两种方法

    Java判断文本文件字符编码的两种方法 1 通过文件流的前面部分字节判断 2 通过cpdetector库提供的监听方法来判断 1 取文件流方式 public static String codeString String fileName
  • 阿里云oss使用教程

    一 准备工作 1 点击 注册账号账号 输入用户名 密码 手机号 2 实名阿里云账号 点击跳到个人中心 对阿里云账号进行实名 这里我建议选择企业实名 3 购买阿里云OSS 打开OSS入口 选择 OSS资源包 地区 中国大陆 标准 本地冗余存储
  • jeesite框架下获取当前登录人的部门编号部门名称以及姓名:

    部门编号 String dept StringUtils isNotBlank EmpUtils getOffice getOfficeCode EmpUtils getOffice getOfficeCode 部门名称String dep
  • 第十二讲:生成树概念及STP技术应用

    在传统的交换网络中 设备通过单条链路进行连接 当某一个点或是某一个链路发生故障时可能导致网络无法访问 解决这种问题的办法是在网络中提供冗余链路 但是交换机网络中的冗余链路会产生广播风暴 MAC地址失效等现象 最终出现的结果就是网络瘫痪 为避
  • 如何一眼分辨是C还是C++

    C语言的历史 C语言是由贝尔实验室的Dennis Ritchie在20世纪70年代初开发的一种通用程序设计语言 在早期的计算机时代 许多计算机使用不同的汇编语言编写程序 这导致了程序的可移植性和代码的可重用性很低 因此 Dennis Rit
  • markdown模板(个人使用)

    头部1 博客标签规定 文章目录 一 常用可以内嵌的HTML标签 一 标题 知识点 知识点 二 图片 三 字体 五 表格 六 锚链接 七 Typora中的技巧 一 常用可以内嵌的HTML标签
  • 编译原理第二版3.4答案

    3 4 节的练习 3 4 1 给出识别练习 3 3 2 中各个正则表达式所描述的语言状态转换图 解答 解答步骤 NFA gt DFA gt 最少状态的 DFA 状态转换图 a a b a NFA DFA NFA DFA a b 0 A B
  • 报错: 登录异常:Could not read JSON: Could not resolve type id ‘com.macro.mall.tiny.modules.ums.model.UmsAd

    全部报错信息 登录异常 Could not read JSON Could not resolve type id com macro mall tiny modules ums model UmsAdmin as a subtype of
  • 无法登录到你的账户,通常可以通过从你的账户注销,然后重新登录

    1 点击 系统属性 2 点击 高级系统设置 3 点击 高级 点击用户配置文件的设置 删除指定的用户账号 重启才能登录账号
  • C++ 标识符

    标识符 lt cpp language 一个标识符是一个由数字 下划线 小写和大写拉丁字母 和大多数 Unicode 字符 见下文的详细说明 组成的任意长度的序列 有效的标识符必须以一个非数字字符 拉丁语字母 下划线或 Unicode 非数
  • java 事件监听connection_java 事件监听

    事件监听实现 三要素 1 事件源 数据源 要处理的数据 2 事件 承载数据 传递信息并被监听 3 监听器 负责对数据的业务处理 该开发用例采用了Spring的事件监听 1 定义事件类型 public class MyEvent extend
  • unity——Rigidbody类 (刚体)

    unity Rigidbody类 刚体 博客分类 unity3d unity Rigidbody类 转载自 http hi baidu com quibos item 0b035e15e63041b499ce33d8 游戏对象添加Rigid
  • mybatis源码,从配置到 mappedStatement —— mapper.xml 是如何被解析的?

    个人博客导航页 点击右侧链接即可打开个人博客 大牛带你入门技术栈 Ext1 本文源码解析基于 mybatis spring boot starter 2 1 1 即 mybatis 3 5 3 版本 Ext2 本文主要是对源码的讲解 着重点
  • 学习入门 MQTT 协议原理与应用场景

    学习认识 MQTT 协议 掌握学习MQTT协议 本文章学习借鉴于太极创客团队 以表感谢 官网http www taichi maker com 文章目录 学习认识 MQTT 协议 一 MQTT是什么 1 MQTT版本 二 MQTT基本原理