MQTT协议介绍

2023-11-02

1.MQTT协议简介


MQTTMessage Queuing Telemetry Transport,消息队列遥测传输)是一个轻量的发布/订阅模式消息传输协议,是专门针对低带宽和不稳定网络环境的物联网应用设计的。

特点:

        1.开放消息协议,易实现

        2.发布订阅模式,一对多消息发布

        3.基于TCP/IP网络连接

        4.报文结构紧凑

        5.消息QoS支持,保证可靠传输

MQTT协议原理

        实现MQTT 协议需要客户端和服务器 端建立 TCP 连接, 在通讯过程中, MQTT 协议中 有三种身份 :发布 者( Publish )、代理( Broker )(服务器)、订阅者( Subscribe )。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
MQTT 传输的消息分为 :主 题( Topic )和负载( payload
        (1) Topic ,可以理解为消息的类型,订阅者订阅( Subscribe )后,就会收到该主题 的 消息 内容( payload );

        (2payload可以理解为消息的内容,是指订阅者具体要使用的内容。

MQTT协议服务器 :

        MQTT服务器以称为“消息代理”(Broker),它是位于消息发布者和订阅者之间,服务器可以:

        (1)接受来自客户端的网络连接;

        (2接受客户端发布的信息;

        (3)处理来自客户端的订阅和退订请求;

        (4)向订阅的客户转发消息

 MQTT协议客户端:

        一个使用MQTT协议设备,它总是建立到服务器的网络接,客户端可以:

        (1)发布其他客户端可能会订阅的信息;

        (2)订阅其它客户端发布的消息;

        (3)退订或删除消息;

        (4)断开与服务器连接。

MQTT协议栈

 2.MQTT通信报文


MQTT协议数据包结构:

MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体Payload)三部分构成MQTT数据包结构如下:

 Fixed Header(固定报文头)

 Variable Header &Payload

2.1  CONNECT报文解读

Clean Session:清理会话,用于控制会话状态的生存时间,标志被设置为 1,客户端和服务端 必须丢弃之前的任何会话并开始一个新的会话。标志被设置为 0,服务端 必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信;

Will Flag:遗嘱标志设置为 1,表示如果连接请求被接受了,遗嘱(Will Message)消息 必须被存储在服务端;

QoS:遗嘱消息服务质量等级,遗嘱标志被设置为 0,遗嘱 QoS 也设置为 0;遗嘱标志被设置为 1,遗嘱 QoS 的值可以等于 012

User Name Flag:用户名标志,标志被设置为 0,有效载荷中 不能包含用户名字段,标志被设置为 1,有效载荷中 必须包含用户名字段;

Password Flag:密码标志,标志被设置为 0,有效载荷中 不能包含密码字段,标志被设置为 1,有效载荷中必须包含密码字段;

2.2  CONNACK 报文解读

 返回码说明:

 服务端发送给客户端的第一个报文 是 CONNACK,服务端发送 CONNACK 报文响应从客户端收到的 CONNECT 报文。

Sp: Session Present Flag

当前会话标志

session信息在服务器已保持,置1

未保存,置0

2.3 PUBLISHC<>S发布消息报文解读

DUP:重发标志

QoS2Qos1:如果为0,则表示是第一次发送该包,如果为1,则表示为重复发送的包。

Qos0DUP必须为0

QOS: 指定了该Publish包的Qos等级如下

RETAIN: 保留标志位,如果为1,服务器存储最新一条RETAIN消息,以便分发给新的订阅者;

2.4. PUBACK  收到发布消息确认报文解读

PUBACK 报文是对 QoS 1 等级的 PUBLISH 报文的响应。

2.5 PUBREC  发布消息收到

PUBREC 报文是对 QoS 等级 2 PUBLISH 报文的响应。它是 QoS 2 等级协议交换的第二个报文。

2.6 PUBRECL  发布消息释放报文解读

PUBREL 报文是对 PUBREC 报文的响应。它是 QoS 2 等级协议交换的第三个报文。

2.7 PUBCOMP  发布完成报文解读

PUBCOMP 报文是对 PUBREL 报文的响应。它是 QoS 2 等级协议交换的第四个也是最后一个报文。

2.8 SUBSCRIBE  订阅主题报文解读

 SUBSCRIBE 报文的有效载荷包含了一个主题,它们表示客户端想要订阅的主题,后面跟着一个字节,这个字节被叫做 服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的QoS 等级。

2.9 SUBACK  订阅确认报文解读

返回码说明:

2.10  UNSUBSCRIBE  取消订阅报文解读

  UNSUBSCRIBE 报文提供的主题与服务端持有的这个客户端的当前主题集合逐个字符比较。如果主题完全匹配,那么它(服务端)自己的订阅将被删除,否则不会有进一步的处理。

2.11 UNSUBACK  取消订阅确认

可变报头包含等待确认的 UNSUBSCRIBE 报文的报文标识符。

2.12 PINGREQ  心跳请求报文解读

2.13 PINGRESP  心跳响应报文解读

客户端发送 PINGREQ 报文给服务端的。用于:

1. 在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。

2. 请求服务端发送 响应确认它还活着。

3. 使用网络以确认网络连接没有断开。

14. DISCONNECT  断开连接

客户端发送 DISCONNECT 报文之后:

必须关闭网络连接;
不能通过那个网络连接再发送任何控制报文;

服务端在收到 DISCONNECT 报文时:

必须丢弃任何与当前连接关联的未发布的遗嘱消息;
应该关闭网络连接。

 3. MQTT接入流程


3.1 连接流程

设备向平台发起 CONNECT 请求 , CONNECT 中携带鉴权信息 , 平台拿到鉴权信息进行鉴权。

鉴权通过后,如果 CLEANSESSION=0, 平台将会加载保存的设备的一些信息 如果 CLEANSESSION=1, 设备没有保存信息在平台,则不加载设备相关信息
返回鉴权结果 CONNACK

 3.2 发布消息流程

设备发布 Qos0 消息;

平台收到上报数据点后保存起来

设备发布 Qos1 消息
平台收到上报数据点后保存起来
平台给设备回复相应的 PUBACK

 

设备发布 Qos2 消息
平台收到上报数据点后保存起来
平台给设备回复相应的 PubRec 报文
设备需回复平台 PubRel 报文,如超时不回平台则会断开相应连接
平台给设备回复 PubComp 报文

3.3 订阅流程

设备发起订阅请求;

平台收到请求后更新topic列表;

平台给设备回复SubAck;

subscriberequestqos级别可以为012

设备发起取消订阅请求
平台收到请求后更新 topic 列表
平台给设备回复 UnSubAck

 3.5 连接保活流程

客户端发送 PINGREQ 报文给服务端的,服务端发送 PINGRESP 报文响应客户端的 PINGREQ 报文,表示服务端还活着。

3.6 断开连接流程

DISCONNECT 报文是客户端发给服务端的最后一个控制报文,表示客户端正常断开连接。

 4.MQTT消息QOS


级别0:最多一次,消息发送者会想尽办法发送消息,但是遇到意外并不会重试,这一级别会发生消息丢失。

级别 1 :至少一次。消息接收者如果 没有知会或者知会本身 丢失,消息发送者会再次发送以保证消息接收者至少会收到一次 ,这一级别会保证消息到达,可能造成消息重复。

级别 2 :恰好一 次,确保消息只有一次到达。

 

 MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS

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

MQTT协议介绍 的相关文章

  • 阿里云 MongoDB 的连接使用规范

    阿里云 MongoDB 的连接使用规范 概述 我们在阿里云上的 MongoDB 有两种 副本集 主 被两个节点 分片集 集群 在多个业务同时连接 MongoDB 使用时 最重要的连接数问题 一旦超过最大值即影响其它业务的使用 所以必须要规范
  • Mysql 开源数据源笔记

    DBCP C3P0数据源 tomcat内置的数据源DBCP DBCP 方式1 BasicDataSource source new BasicDataSource source setDriverClassName com mysql jd
  • allegro 遇到的问题汇总 避免忘记

    目录 目录 1 已经布板后如何更新封装 2 如何批量放置VIA 3 如何替换某个过孔 4 OrCAD跟Allegro交互设置 5 在制作封装时 如何修改封装引脚的PIN Number 6 ORCAD画原理图时 off page connec

随机推荐

  • Linux关机命令详解

    在linux下一些常用的关机 重启命令有shutdown halt reboot 及init 它们都可以达到重启系统的目的 但每个命令的内部工作过程是不同的 Linux centos重启命令 1 reboot 2 shutdown r no
  • 表格与表单的嵌套关系

    表格与表单的嵌套关系 想要用表格与表单做一个注册界面 却对这两个元素的嵌套关系挡住的脚步 到底是表格里面放置表单呢 还是表单里面放置表格呢 没关系 小马哥带你答疑解惑 1 首先我们可以创建一个空表单 在这个表单里面不用放任何东西 2 然后我
  • selenium自动化环境搭建(Windows)

    一 selenium介绍 selenium主要用于web应用程序的自动化测试 还支持所有基于web的管理任务自动化 selenium经历了2个版本 selenium1 0和selenium2 0 selenium不是一个单独的工具 而是由一
  • 如何对Docker容器进行健康检查

    如何对 Docker 容器进行健康检查 熟悉使用过kubernetes的人应该知道 kubernetes支持对pod进行健康检查的功能 这对生产业务来说其实是非常有用处的 能快速发现服务不可用 并进行快速重启恢复 其实不使用kubernet
  • 局域网设备查找和发现,局域网软件在线更新,Qt udp组播

    使用udp组播原因 想要实现查找局域网自己的设备 但是不知道存在设备的ip 局域网软件在线更新 不想固定服务器的ip地址 因为是开发人员电脑 ip可能随时在变化 比较了广播 组播的优缺点 最终选择组播 组播优点 组播技术的初衷是在IP网络中
  • C++14新特性

    C 14 维基百科 C 14是C 的现行标准的非正式名称 正式名称为 International Standard ISO IEC 14882 2014 E Programming Language C C 14旨在作为C 11的一个小扩展
  • oracle的备份与恢复(一)

    author skate time 2010 09 06 oracle的备份与恢复 基于我个人的理解把恢复分为来两大类 1 基于备份的恢复 这种基于备份饿恢复是指通过备份文件 redo archivelog等来实现备份 2 没有备份的恢复
  • HyperLogLog(关于基数统计)

    写在前面 今天在复习Redis的一种在Redis 2 8 9 版本更新的结构的时候 知道了这个数据结构是基于一种优秀的算法HyperLogLog 基数统计算法 简单来说就是统计集合中的元素数量 但是对比set有了很大的优化 就去了解了一下这
  • Lemmings4

    See also Lemmings1 Lemmings2 and Lemmings3 Although Lemmings can walk fall and dig Lemmings aren t invulnerable If a Lem
  • ARouter原理剖析及手动实现

    简介 最近可能入了魔怔 也可能是闲的蛋疼 自己私下学习了ARouter的原理以及一些APT的知识 为了加深对技术的理解 同时也本着热爱开源的精神为大家提供分享 所以就带着大家强行撸码 分析下ARouter路由原理和Android中APT的使
  • U-Boot 启动流程详解

    文章目录 链接脚本 u boot lds 详解 Uboot启动流程 链接脚本 u boot lds 详解 要分析 uboot 的启动流程 首先要找到 入口 找到第一行程序在哪里 程序的链接是由链接脚本来决定的 所以通过链接脚本可以找到程序的
  • linux驱动模块编译Makefile

    该Makefile最好是和hello c同样的路径 obj m hello o 表示编译生成的模块 前缀hello必须和 c文件相同 all make C lib modules shell uname r build M PWD modu
  • /bin/sh: 1: nvcc: not found Makefile:89: recipe for target 'obj/convolutional_kernels.o' failed

    在测试YOLO时出现 nvcc gencode arch compute 30 code sm 30 gencode arch compute 35 code sm 35 gencode arch compute 50 code sm 50
  • 高性能内存分配器 jemalloc 基本原理

    Netty 内存管理的实现并不是一蹴而就的 它也是参考了 jemalloc 内存分配器 今天我们就先介绍 jemalloc 内存分配器的基本原理 为我们后面的课程打好基础 背景知识 jemalloc 是由 Jason Evans 在 Fre
  • [Warning] ‘typedef‘ was ignored in this declaration解决

    首先先展示一下问题是怎么样的 出现了 typedef was ignored in this declaration的问题 下面提供解决方案及原因 原因 在于使用结构体的时候没有使用别名 解决方案 1 去掉typedef 2 在结构体后面加
  • elementui tree怎样设置默认勾选

    在树形菜单数据里面设置一个唯一的字段 这里我的就是id字段 然后设置node key为那个唯一字段 然后用default checked keys绑定一个数组 这个数组里面就是需要勾选的菜单所对应的的id 比如我这里的是9 这样运行之后菜单
  • echarts使用结合时间轴timeline动态刷新案例

    1 echarts简介 ECharts 一个使用 JavaScript 实现的开源可视化库 可以流畅的运行在 PC 和移动设备上 兼容当前绝大部分浏览器 IE8 9 10 11 Chrome Firefox Safari等 底层依赖轻量级的
  • unity的UGUI的mask(遮罩)的使用

    之前我写过一篇博客关于UGUI的优化 其中提到了Mask的使用会增加性能的消耗 但是在一些情况下 使用这个会有奇效 比如小地图 Minimap 的开发 这篇博客介绍一下UGUI中的Mask的使用方法 很简单的 首先创建一个 Image 给他
  • 【PHP发送邮件】PHP实现发送邮件

    PHP发送邮件 Thinkphp直接使用 其他框架修改使用 1 安装 composer require phpmailer phpmailer 2 填写配置表 配置文件mail php
  • MQTT协议介绍

    1 MQTT协议简介 MQTT Message Queuing Telemetry Transport 消息队列遥测传输 是一个轻量的发布 订阅模式消息传输协议 是专门针对低带宽和不稳定网络环境的物联网应用设计的 特点 1 开放消息协议 易