TCP/IP协议—MQTT

TCP/IP协议—MQTT

  • MQTT协议
    • MQTT协议特点
    • MQTT通信流程
    • MQTT协议概念
  • MQTT报文
    • 固定报头
    • 可变报头
    • 有效载荷

MQTT协议

消息队列遥测传输(Message Queuing Telemetry Transport,MQTT)是一个基于客户端-服务器的消息发布/订阅传输协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。
MQTT基于TCP协议(1883端口),同时支持TLS协议加密(8883端口)以及WebSocket协议。

MQTT协议源文档

MQTT协议特点

  • 开放消息协议,简单易实现
  • 发布订阅模式,一对多消息发布
  • 基于TCP/IP网络连接,提供有序,无损,双向连接。
  • 消息QoS支持,可靠传输保证

MQTT通信流程

在这里插入图片描述
客户端
使用MQTT的程序或设备。根据功能的不同也可称为发布者或者订阅者

  • 打开连接到服务端的网络连接
  • 发布应用消息给其它相关的客户端
  • 订阅以请求接受相关的应用消息
  • 取消订阅以移除接受应用消息的请求
  • 关闭连接到服务端的网络连接

服务端
作为发送消息的客户端和请求订阅的客户端之间的中介。也被称为MQTT代理,因为服务器只做消息管理,不处理应用数据,而是转发应用数据。

  • 接受来自客户端的网络连接
  • 接受客户端发布的应用消息
  • 处理客户端的订阅和取消订阅请求
  • 转发应用消息给符合条件的已订阅客户端
  • 关闭来自客户端的网络连接

MQTT协议概念

  • 会话(Subscription):客户端和服务端之间的状态交互。每一个与服务端交互的客户端都会有一个client ID,这个ID是唯一ID,如果与其他的客户端重复,将会被服务器踢下线。
  • 主题(topic):主题是应用消息的标签,发布以及订阅都是通过主题进行的。主题支持通配符,可以通过通配符实现同时向多个主题发布数据。
  • 订阅(Subscription):通过订阅主题,接受服务器的数据。可以理解为微信订阅公众号。
  • 发布(Public):通过主题讲信息发送到服务器。可以理解为微信公众号发推文。
  • 服务质量(QoS):服务质量是MQTT控制数据可靠性的一个特性。QoS有三个等级,当双方的QoS等级不一致时,以等级低的一方为准。
    • QoS 0:“最多一次”,尽操作环境所能提供的最大努力分发消息。只发送一次,数据可能会丢失或者因重发导致重复。
    • QoS 1:“至少一次”,保证消息可以到达,但是可能会重复。发送多次,当服务器回复后停止发送,可能会因网络延迟导致对端收到多次。
    • QoS 2:“仅一次”,保证消息只到达一次。确保只收到一次,分4步进行确认。
      1. 发布者发送消息到服务器: 发布者将消息发送到MQTT服务器。
      2. 服务器发送确认消息给发布者: 服务器收到消息后发送确认消息给发布者,告知消息已经收到。
      3. 服务器将消息发送给订阅者: 服务器将消息发送给所有订阅者。
      4. 订阅者发送确认消息给服务器: 订阅者收到消息后发送确认消息给服务器,告知消息已经收到。
  • 遗嘱消息(Will Message):在网络连接非正常关闭的情况下,由服务端发布的应用消息。
  • 消息保留(Retained Messages):发布者可以选择保留消息,这意味着 MQTT 服务器将保留最新的消息,并在订阅者订阅该主题时立即发送给它们。这对于传递状态信息或配置信息很有用。

MQTT报文

在这里插入图片描述

MQTT报文包含3部分

  1. 固定报头(Fixed Header):所有控制报文都包含,表示数据包类型及数据包的分组标识。
  2. 可变报头(Variable Header):部分控制报文包含,数据包类型决定可变报头是否存在。
  3. 有效载荷(Payload):部分控制报文包含,数据包类型决定可变报头是否存在。

固定报头

在这里插入图片描述
固定报头包含3部分

  • MQTT报文类型(MQTT Control Packet type)
  • MQTT报文类型标志位(Flags specific to each MQTT Control Packet type)
  • 剩余长度(Remaining Length)

MQTT报文类型可以参考👇表格

类型方向描述有效载荷可变报头报文标识符
Reserved0禁止保留不需要不需要
CONNECT1客户端到服务端客户端请求连接服务端需要不需要
CONNACK2服务端到客户端连接报文确认不需要不需要
PUBLISH3两个方向都允许发布消息可选需要(如果QoS>0)
PUBACK4两个方向都允许QoS 1消息发布收到确认不需要需要
PUBREC5两个方向都允许发布收到(保证交付第一步)不需要需要
PUBREL6两个方向都允许发布释放(保证交付第二步)不需要需要
PUBCOMP7两个方向都允许QoS 2消息发布完成(保证交互第三步)不需要需要
SUBSCRIBE8客户端到服务端客户端订阅请求需要需要
SUBACK9服务端到客户端订阅请求报文确认需要需要
UNSUBSCRIBE10客户端到服务端客户端取消订阅请求需要需要
UNSUBACK11服务端到客户端取消订阅报文确认需要需要
PINGREQ12客户端到服务端心跳请求不需要不需要
PINGRESP13服务端到客户端心跳响应不需要不需要
DISCONNECT14两个方向都允许断开连接通知不需要不需要
AUTH15两个方向都允许认证信息交换不需要不需要

MQTT报文类型标志位目前是保留位,当前只有MQTT 5.0 规范中PUBLISH用到。

  • Bit 3:DUP,表示当前 PUBLISH 报文是否是一个重传的报文。
  • Bit 2,1:QoS,表示当前 PUBLISH 报文使用的服务质量等级。
  • Bit 0:Retain,表示当前 PUBLISH 报文是否是一个保留消息。

剩余长度
固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。

可变报头

某些 MQTT 控制报文包含一个可变报头部分。它在固定报头和有效载荷之间。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。
由于可变报头的内容根据报文类型的不同而不同,篇幅过长,具体可以参考👆MQTT协议源文档。

有效载荷

有效载荷是实现某种报文类型的核心,但是MQTT只有几种报文需要有效载荷。

  • CONNECT:包含客户端的ClientID、订阅的Topic、Message以及用户名和密码。
  • PUBLISH:包含客户端要发布的内容,当内容为空时则不存在。
  • SUBSCRIBE:包含一系列的要订阅的主题以及QoS。
  • SUBACK:包含服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
  • UNSUBSCRIBE:包含客户端要订阅的主题。
  • UNSUBACK:包含务器对于UNSUBSCRIBE所申请的主题及QoS进行确认和回复。

学习笔记,有问题欢迎指出
参考链接
https://mqtt.p2hp.com/

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

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

相关文章

C语言指针进阶:各类型指针变量详解

目录 1. 字符指针变量2. 数组指针变量2.1 什么是数组指针变量2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 代码分析4.3.1 typedef 关键字 5. 函数指针数组6. 转移表 正文开始。 1. 字符指针变量 我们可以…

基于SpringBoot + Vue实现的时装购物管理系统设计与实现+毕业论文+开题报告+答辩PPT

介绍 系统包含用户、管理员两个角色 管理员:首页、个人中心、用户管理、商品分类管理、颜色管理、商品信息管理、商品评价管理、系统管理、订单管理 用户:首页、个人中心、商品评价管理、我的收藏管理、订单管理 前台首页:首页、商品信息、商品资讯、个人中心、后台…

vue 的生命周期--图解

生命周期函数中的this指向是vm 或 组件实例对象。 常用的生命周期钩子: mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。 关于销毁Vue实例 销毁后借助Vu…

Spring-datasource事务管理-手动请求事务回滚

什么场景下会触发? 在 Spring 中,调用 setRollbackOnly() 方法会将当前事务标记为 rollback-only,表示事务只能回滚,不能提交。这种情况通常发生在以下情景中: 业务逻辑判断:在方法中根据某些业务逻辑的判…

[GFCTF 2021]wordy

用ida查看可知存在大量jmp跳转语令,编写脚本将其改为空指令

MyBatis Dynamic SQL基本使用

MyBatis Dynamic SQL基本使用 一、概念二、特性Hamcrest是什么 三、MyBatis Dynamic SQL 快速入门3.1 环境准备3.2 定义表和列3.3 创建 MyBatis3 映射器3.4 使用 MyBatis3 执行 SQL 四、数据库对象表示4.1 表或视图表示4.2 表别名4.3 列表示 五、Where 子句支持5.1 简单的 wher…

磁盘损坏无法读取:原因、恢复方案与防范之道

在数字化信息爆炸的时代,磁盘作为数据存储的重要载体,承载着无数重要的文件和资料。然而,当磁盘突然损坏,无法读取数据时,我们往往会陷入困境,焦虑不已。面对这种情况,我们该如何应对&#xff1…

晶圆制造之MPW(多项目晶圆)简介

01、MPW是什么? 在半导体行业中,MPW 是 "Multi Project Wafer" 的缩写,中文意思是多项目晶圆。MPW 的主要思想是将使用相同工艺的多个集成电路设计放在同一晶圆片上进行流片(即制造)。这种方法允许多个设计共…

设计模式-构建者模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 定义 特点 使用场景 优缺点 (1) 优点 …

26.组件传递Props效验

组件传递Props效验 Vue 组件可以更细致地声明对传入的 props 的校验要求 <template><h3>ComponentA</h3><ComponentB title"Props效验" :userInfo"userInfo"/> </template> <script> import ComponentB from ".…

Linux操作系统·Linux简介

1.世界上第一个完善的网络操作系统 Unix是1969年由美国电话电报公司(AT&T)贝尔实验室的两个工程师所创造的操作系统&#xff0c;它允许计算机同时处理多用户和程序。目前大型政府单位、大型企业、航空公司、金融机构多在使用&#xff0c;价钱昂贵&#xff0c;但性能和稳定性…

【数据结构】99%的人都知道的超好用二叉搜索树

【数据结构】99%的人都知道的超好用二叉搜索树 笔者近期学习了二叉搜索树&#xff0c;与其说是学习了此种数据结构&#xff0c;倒不如说是先在力扣上做了相关题目&#xff0c;而后觉得对其了解甚浅&#xff0c;于是再去找资料…今天就结合力扣题目&#xff0c;向大家介绍一下二…

Spring Cloud 运维篇1——Jenkins CI/CD 持续集成部署

Jenkins 1、Jenkins是什么&#xff1f; Jenkins 是一款开源 CI/CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件。 Jenkins 支持各种运行方式&#xff0c;可通过系统包、Docker 或者一个独立的 Java 程序。 Jenkins Docker Compose持续集成流…

没有理由不加倍努力

最近su7很火&#xff0c;各隐藏大佬都纷纷从后台来到前台&#xff0c;把整个网红界的网红等级提升了好几个档次。红衣大叔更是借此机会在疯狂地打造自己的网红IP。 千亿大佬都这还般努力&#xff0c;作为平民的自己哪还有不努力的理由。 加倍努力&#xff01;

如何在PostgreSQL中使用pg_stat_statements插件进行SQL性能统计和分析?

文章目录 一、启用pg_stat_statements插件二、查看统计信息三、定期重置统计信息四、注意事项 PostgreSQL中的pg_stat_statements是一个强大的插件&#xff0c;用于追踪执行时间最长的SQL语句。通过它&#xff0c;我们可以获取有关SQL语句执行频率、总执行时间、平均执行时间等…

[创业之路-106] :经济学十大陷阱与核心思想:系统论、社会进化论、周期论、阴阳互转论

目录 前言&#xff1a; 一、流动性陷阱。 二、中等收入陷阱。 三、修昔底德陷阱。 四、塔西佗陷阱。 五、金德尔伯格陷阱。 六、卢梭陷阱。 七、拉美陷阱。 八、阿喀琉斯之踵。 九、布拉德伯里悖论。 十、李约瑟之谜 结论&#xff1a;上述陷阱的…

C++相关概念和易错语法(5)(析构函数、拷贝构造、运算符重载、赋值重载)

上篇文章分享了一些构造函数和析构函数的易错点&#xff0c;这篇文章则将继续分享一些构造函数、拷贝构造函数的易错点。 1.变量声明处赋缺省值 我们已经知道了自动构造函数的初始化规则了。我们可以认为这个初始化规则比较保守&#xff0c;能不修改成员变量的值就不修改&…

实在RPA设计器试用导引

一、产品概述 实在RPA设计器是一款将人工智能(AI)与机器人流程自动化(RPA)深度融合的可视化自动流程编辑器。它通过AI推荐与桌面嵌入式交互&#xff0c;极大简化了RPA的使用难度&#xff0c;让普通业务人员也能轻松使用。实在RPA设计器具备以下核心优势&#xff1a; 兼容性&a…

Redis详解和Spring Data Redis应用

注意事项 如何快速进入命令行窗口什么是配置类 Redis简介 Redis是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&#xff09…