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/

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

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

相关文章

2.Vue简介

Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,V…

5.SpringBoot 配置文件

文章目录 1.配置文件作用2.配置文件格式2.1项目中同时存在两种配置文件2.2application.properties2.2.1 application.properties语法格式2.2.2获取自定义配置项 2.3 application.yml2.3.1 application.yml语法格式2.3.1.1单双引号区别2.3.1.2和application.properties格式对比&…

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…

NIMAX下载安装使用,pyvisa基本使用

NIMAX部分: 1、先在NI官网下载系统配置和NI-VISA: 系统配置: https://www.ni.com/zh-cn/support/downloads/drivers/download.system-configuration.html#532687https://www.ni.com/zh-cn/support/downloads/drivers/download.system-conf…

基于springboot+vue+Mysql的社区维修平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

C++中的继承与多态

一、继承: 1.什么是继承? 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象…

记录:阿里云服务器网站搭建(2)

Docker安装Mysql mysql版本 查看开发环境中mysql版本 :select version();安装时版本尽量保证一致,最低要求大版本要一致 docker 拉取mysql镜像 docker pull mysql:8.0.36 docker启动mysql容器 docker run -d \ # 创建并运行一个容器&…

【Godot4.2】太极八卦图绘制

概述 作为中国传统文化符号之一,太极八卦图,无论是哲学还是玄学,都不可能避开。 之前在ShapePoints函数库实现了太极的点求取函数。当时采用的时圆弧拼接的方式,但是存在某些尺寸下多边形无法三角化的问题。 于是就有了今天的内…

Windows使用freeSSHd搭建sftp服务器

一、安装 1、运行freeSSHd.exe(最好以管理员方式运行) 2、选择安装位置 3、选择全部安装 4、是否创建开始启动栏快捷入口 5、是否创建桌面快捷方式 6、安装 7、安装完成,点击close 8、安装私钥 9、是否要安装为服务 10、全部安装完成 二、配…

不同条件累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;float result1 0;float result2 0;float result…

3、MATLAB中矩阵和多维矩阵介绍

文章目录 一、矩阵二、矩阵举例三、定义变量四、定义矩阵五、获取变量值 一、矩阵 MATLAB中数据的基本格式是矩阵&#xff1b; 二维矩阵是一个带有以行和列排列的元素的矩阵表&#xff1b;如果右m行、n列&#xff0c;这个矩阵的大小就是m x n&#xff1b;多维矩阵的维数大于2…

加速产能!推荐五款制造业项目管理软件

随着技术的不断发展&#xff0c;许多制造企业开始意识到使用制造业项目管理软件的重要性。在本文中&#xff0c;我们将探讨适用于制造业的项目管理软件&#xff0c;制造业项目管理软件推荐&#xff0c;以帮助项目团队更加高效管理资源。 制造业项目管理难题 怎样正确利用工作资…