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.mzph.cn/diannao/84.shtml

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

相关文章

windows上安装make

下载地址 https://sourceforge.net/projects/gnuwin32/ 点击框中的下载,下载后安装。把安装路径添加到环境变量 PATH 中. 打开cmd,验证是否生效 安装包下载地址: https://download.csdn.net/download/qq_36314864/89163210

python读取DBF数据

DBF文件通常是由数据库软件(如FoxPro或dBASE)创建的数据库文件。Python中并没有直接读取DBF文件的内置库,但你可以使用第三方库如dbfread来读取DBF文件。 首先,你需要安装dbfread库。你可以使用pip来安装: pip insta…

【人工智能书籍分享】从ChatGPT到AIGC:人工智能重塑千行百业

今天又来给大家推荐一本人工智能方面的书籍<从ChatGPT到AIGC&#xff1a;人工智能重塑千行百业>。本书介绍了ChatGPT的前世今生&#xff0c;重点聚焦普通人如何使用ChatGPT获得工作和生活效率的提升&#xff0c;各行各业如何通过ChatGPT来改变自己的赛道状态。 使用Chat…

免费SSL证书的不香吗?四步轻松搞定

随着技术的发展和普及&#xff0c;现在有许多机构提供免费的SSL证书&#xff0c;使得即便是拥有有限预算的网站也能够享受到基本的加密服务。几乎所有的公有云服务商都提供了免费版ssl&#xff0c;如阿里云曾推出免费型DV SSL证书&#xff0c;腾讯云和百度云也有类似的免费SSL证…

平衡车设计——硬件篇

在本文开始之前我忍不住想吐槽一个事情&#xff0c;就在前两天晚上&#xff0c;我满意地装完平衡车&#xff0c;给他取了个名字叫瓦力&#xff08;没错&#xff0c;就是机器人总动员里的瓦力&#xff09;&#xff0c;他长这个样子。 把他放到桌子上放了一夜&#xff0c;第二天早…

ffmpeg buffer管理

除了内存管理之外&#xff0c;数据的前后级流转也涉及到buffer管理. 个人觉得ffmpeg里面的buffer管理实现极为巧妙&#xff0c;也很值得借鉴. 概述 重要数据结构 AVBufferPool 在libavutil/buffer_internal.h中定义&#xff0c;为内部数据结构&#xff0c;不能在应用程序中直…

基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例

目录 前言 一、信息网站介绍 1、网站介绍 2、 地震历史信息 3、 历史信息接口分析 二、XxlCrawler组件 1、关于XxlCrawler 2、核心概念介绍 三、实际信息爬取 1、新建maven项目 2、新建model层对象 3、实际爬取 总结 前言 如今&#xff0c;只要谈起网络信息爬取也就…

TCP/IP协议—HTTP

TCP/IP协议—HTTP HTTP协议HTTP通讯特点HTTP通讯流程 HTTP请求报文请求方法 HTTP应答报文状态码 HTTP协议 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一种请求-响应的协议&#xff0c;用户可以通过HTTP向服务器上传、下载数据。HT…

Java调用WebServices接口

当拿到一个WebServices接口时&#xff0c;首先用接口测试工具调用一下接口&#xff0c;看是否可以正常发送请求和获取返回接口&#xff0c;确保接口是没有问题的&#xff0c;可以用SoapUI工具进行测试。 下面以一个免费的天气预报接口为例&#xff0c;记录整个接口的调用过程。…

初学python记录:力扣2007. 从双倍数组中还原原数组

题目&#xff1a; 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双倍 数组&#xff0c;那么请你返…

如何解决PPT中获取加载项是灰色的,无法链接到Power BI的问题?

问题描述&#xff1a; 最近有朋友留言询问:“在尝试之前我发布的如何在PPT中展示Power BI报告的操作步骤的时候&#xff0c;想要在PPT中展示Power BI报告&#xff1f;只需这样做&#xff01; (qq.com) 碰到在PowerPoint中【获取加载项选项】是灰色&#xff0c;无法链加载Powe…

【数据库】Oracle11g与Oceanbase3.2.3对比

一、数据库体系结构对比 数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理&#xff0c;以及数据在数据库中的组织与管理机制。 Oracle11g作为传统关系数据库的代表、Oceanbase作为分布式关系数据库的代表&#xff0c;体系结构上的设计差别很大。 &a…

【NLP】大语言模型基础之Transformer结构

大语言模型基础之Transformer结构 1. Transformer结构总览2. 嵌入表示层2. 注意力层3. 前馈层4. 残差连接与层归一化5. 编码器和解码器结构参考文献 Transformer是一种深度学习模型架构&#xff0c;由Vaswani等人于2017年在论文《Attention is All You Need》中首次提出。它在自…

【练习】二分查找思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 二分查找算法介绍 1.二分查找 题目描述 讲解 ​编辑 代码实现 2.…

STM32应用开发——BH1750光照传感器详解

STM32应用开发——BH1750光照传感器详解 目录 STM32应用开发——BH1750光照传感器详解前言1 硬件介绍1.1 BH1750简介1.2 硬件接线 2 软件编程2.1 软件原理2.1.1 IIC设备地址2.1.2 IIC读写2.1.3 BH1750指令集2.1.4 BH1750工作流程2.1.5 BH1750测量模式 2.2 测试代码2.3 运行测试…

【剪映专业版】10时间线工具:主轨磁吸、自动吸附、联动、预览轴、全局缩放预览

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 主轨&#xff1a;有封面标志的轨道才是主轨。 主轨磁吸&#xff1a;开启后&#xff0c;在主轨上移动素材&#xff0c;自动向前磁吸&#xff0c;在其他轨道上移动无此效果&#xff1b;关闭后&#xff0c;不自动向前磁吸&…

6个步骤轻松实现Postman接口压力测试(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里讲是postman做接口并发测试&#xff0c;基础用法不做…

这些年背过的面试题--MySQL篇

MySQL一直是面试中的热点问题&#xff0c;也难道了很多的面试者。其实MySQL没那么难&#xff0c;只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏向底层的知识。 本手册&#xff0c;已总结成完整的PDF文档。想获取该文档&am…

opencv的cmake报错

opencv编译报错 CMakeDownloadLog.txt #use_cache "D:/opencv/.cache" #do_unpack "ippicv_2021.8_win_intel64_20230330_general.zip" "71e4f58de939f0348ec7fb58ffb17dbf" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/1…

遇事不决 量子力学?

文章目录 引入量子力学产生的必然性量子力学名称的由来粒子&#xff1f;波&#xff1f;波粒二象性测不准原理 &#xff08;不确定原理&#xff09;叠加态原理 量子纠缠态叠加量子纠缠量子纠缠实验 逻辑判断&#xff0c;量子力学到底完善吗观测量子纠缠&#xff1f;那我们宏观世…