当前位置: 首页 > news >正文

MQTT通信协议使用说明

目录

  • 1 MQTT连接属性
    • 1.1 服务器URL(Broker Address)
    • 1.2 客户端标识(clientID)
    • 1.3 用户名称 & 密码(User Name & Password)
    • 1.4 连接超时(Connection Timerout)
    • 1.5 心跳间隔 (KeepAlivelnterval)
    • 1.6 清除会话(cleanSession)
  • 2 主题&消息
    • 2.1 主题
      • 2.1.1 订阅主题(SUBSCRIBE)
      • 2.1.2 订阅确认(SUBACK)
      • 2.1.3 取消订阅(UNSUBSCRIBE)
    • 2.2 消息
      • 2.2.1 主题名(topicName)
      • 2.2.2 服务质量等级(QoS)
      • 2.2.3 报文标识符(packetID)
      • 2.2.4 保留标志(retainFlag)
      • 2.2.5 有效载荷(Payload)
      • 2.2.6 重发标志(dupFlag)
  • 3 MQTT遗嘱
    • 3.1 遗嘱主题(Last Will Topic)
    • 3.2 遗嘱消息(Last Will Message)
    • 3.3 遗嘱Qos (Last Will Qos)
    • 3.4 遗嘱保留 (Last Will Retain)
  • 4 服务质量等级(QoS)
    • 4.1 QoS = 0(最多发一次)
    • 4.2 QoS = 1(最少发一次)
    • 4.3 QoS = 2(保证收一次)
  • 5 保留消息(retainFlag)
  • 6 心跳间隔 (KeepAlivelnterval)
  • 参考资料

以下所有内容,并非本博第一手编写资料,大部分内容来自于太极创客官网。详细内容请移步太极创客官网链接。

1 MQTT连接属性

1.1 服务器URL(Broker Address)

云端服务器地址
例:test.ranye-iot.net 或 47.92.129.18

1.2 客户端标识(clientID)

client:n. 客户,委托人,客户机。

MQTT 服务端用该标识来识别客户端,因此标识名称必须是独立且唯一的。

1.3 用户名称 & 密码(User Name & Password)

针对申请的专用服务器,需要在访问服务器时验证用户名和密码。
而对于开方的服务器则可以缺省该选项。

1.4 连接超时(Connection Timerout)

连接超时和等待超时,一般用于设定连接时的等待时间。

1.5 心跳间隔 (KeepAlivelnterval)

服务器根据设置的时间间隔检查客户端是否保持连接情况。

1.6 清除会话(cleanSession)

  为了保证重要的MQTT报文可以被客户端准确无误的接收到。在服务端想客户端发送报文后,客户端会向服务端返回一个确认报文。

  如果服务端没有收到客户端的确认报文,服务端会认为刚刚发送的报文没有送达给客户端。这种情况下,服务端将会将尚未被客户端确认的报文保存起来,再次尝试向客户端发送报文,并且再次等待客户端发来的确认消息。

注:该选项可以设置为TrueFalse
True:服务端不需要确认收到的报文。
False:服务端需要确认收到的报文。
(不要置一,这块没写反)

2 主题&消息

2.1 主题

  所有MQTT消息都有主题。客户端要想接收消息,首先要订阅该消息的主题。当有客户端向该主题发布消息后,订阅了该主题的客户端就能接收到消息了。

2.1.1 订阅主题(SUBSCRIBE)

  客户端想要订阅主题,需要向客户端发送 SUBSCRIBE 报文实现订阅主题请求,一个 SUBSCRIBE 报文可以用于订阅一个或多个主题。
  同样的,客户端在订阅主题时也可以明确QoS。服务端会根据SUBSCRIBE中的QoS来提供相应的服务保证。
  另外每一个SUBSCRIBE报文还包含有“报文标识符”。报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。

订阅返回码详细列表:

返回码说明
0订阅成功-QoS 0
1订阅成功-QoS 1
2订阅成功-QoS 2
128订阅失败

2.1.2 订阅确认(SUBACK)

服务端接收到客户端的订阅报文后,会向客户端发送SUBACK报文确认订阅。
SUBACK报文包含有“订阅返回码”和“报文标识符”这两个信息。

2.1.3 取消订阅(UNSUBSCRIBE)

  UNSUBSCRIBE报文包含两个重要信息,第一个是取消订阅的主题名称。同一个  UNSUBSCRIBE报文可以同时包含多个取消订阅的主题名称。另外,UNSUBSCRIBE报文也包含“报文标识符”,MQTT设备可以通过该标识符对报文进行管理。

  当服务端接收到UNSUBSCRIBE报文后,会向客户端发送取消订阅确认报文—— UNSUBACK报文。该报文含有客户端所发送的“取消订阅报文标识符”。

2.2 消息

  MQTT一旦连接服务器便可以发布消息,发布的每条消息必须包含一个主题。服务器可以通过主题确定将消息转发给那些客户端。
  MQTT客户端发布消息时,会向服务端发送PUBLISH报文。以下是报文的详细内容

2.2.1 主题名(topicName)

主题名用于识别此信息发布到哪一个主题。

2.2.2 服务质量等级(QoS)

QoS(Quality of Service) 表示MQTT消息的服务质量等级。三个等级:012

2.2.3 报文标识符(packetID)

  设备可以通过报文标识符对MQTT报文进行甄别和管理。
  注:报文标识符的内容与QoS级别关联。只有QoS级别大于0时,报文标识符才是非零数值。
  如果QoS级别等于0时,报文标识为 0。

2.2.4 保留标志(retainFlag)

  默认情况下,当客户端订阅了某一主题后,并不会马上接收到该主题的信息。只有在客户端订阅该主题后,服务端接收到该主题的新信息时,服务端才会将新消息推送给订阅该主题的客户端。
  假如客户端在订阅该主题后,需要马上接收到该主题的第一条消息,这时候就需要用到保留标志这一信息。

2.2.5 有效载荷(Payload)

  有效载荷是我们希望通过MQTT实际发送的内容。使用MQTT协议发送的文本,图像等格式的内容都是通过有效载荷发送的。

2.2.6 重发标志(dupFlag)

  当MQTT报文的接收方没有及时确认收到报文时,发送方会重复发送MQTT报文。在重复发送MQTT报文时,发送方会将此“重发标志”设置为true。请注意,重发标志只在QoS级别大于0时使用。

3 MQTT遗嘱

  为了让客户端可以更好的发挥作用,便于服务端管理。MQTT协议允许客户端在活着(保持连接)的时候就写好遗嘱。当客户端意外断线(正常断开连接不属于意外)时,服务端就可以将客户端的遗嘱公之于众。

3.1 遗嘱主题(Last Will Topic)

只有订阅了遗嘱主题的客户端才会收到本客户端的遗嘱消息。

3.2 遗嘱消息(Last Will Message)

定义遗嘱消息的内容

3.3 遗嘱Qos (Last Will Qos)

遗嘱消息的服务质量,可以设置012的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。

3.4 遗嘱保留 (Last Will Retain)

遗嘱消息可以设置为保留消息。

4 服务质量等级(QoS)

  上文中多次提到QoS,MQTT服务质量(Quality of Service 缩写 QoS)正是用于告知物联网系统,哪些信息是重要信息需要准确无误的传输,而哪些信息不那么重要,即使丢失也没有问题。
MQTT协议有三种服务质量级别;

4.1 QoS = 0(最多发一次)

  0是服务质量QoS的最低级别。QoS=0的情况下,MQTT服务端和客户端不会对消息传输是否成功进行确认和检查。消息能否成功传输全看网络环境是否稳定。
  在网络环境稳定的情况下,信息传输一般是不会出现问题的。但是在环境不稳定的情况下,可能会在传输过程中出现MQTT消息丢失的情况。

4.2 QoS = 1(最少发一次)

  当QoS级别为1时,发送端在消息发送完成后,会检查接收端是否已经成功接收到了消息。
  发送端将消息发送给接收端后,会等待接收端的确认。接收端成功接收消息后,会发送一条确认报文PUBACK给发送端。如果发送端收到了这条PUBACK确认报文,那么它就知道消息已经成功接收。
  假如过了一段时间后,发送端没有收到PUBACK报文,那么发送端会再次发送消息,然后再次等待接收端的PUBACK确认报文。因此,当QoS=1时,发送端在没有收到接收端的PUBACK确认报文以前,会重复发送同一条消息。
  当发送端重复发送一条消息时,PUBLISH报文中的dupFlag会被设置为True(如上图黑色横线所标注的部分)。这是为了告诉接收端,此消息为重复发送的消息。

4.3 QoS = 2(保证收一次)

  MQTT服务质量最高级是2级,即QoS = 2。当MQTT服务质量为2级时,MQTT协议可以确保接收端只接收一次消息。

收发流程:
1、发送端发送QoS=2 的PUBLISH的报文给接收端
2、接收端回复PUBLISH的确认报文;
3、发送端收到PUBREC报文后,会把此报文进行存储;
4、发送端应答PUBREL报文给接收端
5、接收端应答PUBCOMP报文给发送端

5 保留消息(retainFlag)

  假设客户端1每次整点会发布一个主题的消息给服务端,客户端2订阅接收该主题的消息。如果客户端208:01时刻上电启动,那么再未来的59分钟内,都处于无消息可处理的空闲状态。
  为了避免这种情况,将保留消息(retainFlag)设置为Ture,无论客户端2何时上电工作,都会马上收到该主题中的“保留消息”。

6 心跳间隔 (KeepAlivelnterval)

  客户端在心跳间隔时间内,如果有消息发布,那就直接发布消息而不发布心跳请求,但是在心跳间隔时间内,客户端没有消息发布,那么它就会发布一条心跳请求给服务端,这个心跳请求的目的就是为了告诉服务端,我还在线,你放心吧。
  另外,在实际运行中,如果服务端没有在1.5倍心跳时间间隔内收到客户端发布消息(PUBLISH)或发来心跳请求(PINGREQ),那么服务端就会认为这个客户端已经掉线。
  最后,心跳机制不仅仅用于服务端判断客户端是否在线。客户端也可以利用这一机制来判断自己是否与服务端仍保持连接。如果客户端发送了心跳请求(PINGREQ)给服务端一段时间后,仍然没有收到服务端回复的心跳确认。那么客户端也会认为自己已经断开了与服务端的连接。

参考资料

  1. 太极创客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/mqtt-last-will/

相关文章:

MQTT通信协议使用说明

目录 1 MQTT连接属性1.1 服务器URL(Broker Address)1.2 客户端标识(clientID)1.3 用户名称 & 密码(User Name & Password)1.4 连接超时(Connection Timerout)1.5 心跳间隔 (KeepAlivelnterval)1.6 清除会话(cleanSession) 2 主题&消息2.1 主题2.1.1 订阅主题(SUBSC…...

mysql底层是如何存放数据的

总览 首先总的来说,分为四个层级,行页区段。行就是数据库里的一行数据。 但一次从磁盘读进内存的数据量是一页(页是读写的单位,默认16KB一页),页分很多种类,例如数据页、溢出页、undo日志页。 …...

【代码随想录】刷题笔记Day33

前言 Day33虽说是一个月,但是从第一篇开始实际上已经过了8个月了,得抓紧啊 46. 全排列 - 力扣(LeetCode) 前面组合就强调过差别了,这道题是排序,因此每次要从头到尾扫,结合used数组 class So…...

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…...

2023.11.20使用flask做一个简单图片浏览器

2023.11.20使用flask做一个简单图片浏览器 功能: (1)输入指定路径,打开文件夹 (2)判断文件格式为图片 (3)在前端进行预览 (4)使用bootstrap进行简单美化 ma…...

https和http的区别和优势

大家好,我是咕噜-凯撒,HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在网络上传输数据的协议,HTTPS相比HTTP在数据传输过程中更加安全可靠,适合对数据安全性要求较高的场景…...

Docker 启动alpine镜像中可执行程序文件遇到 not found

## 1. 问题: docker alpine镜像中遇到 sh: xxx: not found 例如: 在容器内/app/目录下放置了可执行文件abc,启动时提示not found /app/startup.sh: line 5: ./abc : not found ## 2. 原因 由于alpine镜像使用的是musl libc而不是gnu libc&am…...

.net对接阿里云CSB服务

public Response<string> Main(MonthPlanRequest request){string apiName "MonthPlan", postData request.ToJson(); var result ConnectCSB(apiName, postData);return InvokeResult.Fail<string>("访问成功");}/// <summary>///…...

Json数据格式

json比较可读&#xff0c;通过键值对返回。实现通常有两种方式:一种是自己来构造&#xff0c;也就是用一个对象存储数据&#xff0c;在最后输出时将其json字符串化&#xff1b;第二种是使用 RestController 注解实现json数据返回。 第一种 导入依赖坐标&#xff1a; <depe…...

Kafka-Producer

1、生产者 从编程的角度而言&#xff0c;生产者是一个消息的生产者&#xff0c;它负责创建消息并发送到Kafka集群中的一个或多个topic中。 1.1、客户端开发 一个正常的生产逻辑需要具备以下几个步骤&#xff1a; 配置生产者客户端参数及创建相应的生产者实例构建待发送的消…...

Ubuntu20上离线安装samba

如果联网&#xff0c;一条 sudo apt-get install samba就可能解决问题&#xff0c;但是没有网&#xff0c;那么只能一个一个的解决问题&#xff1a; 我以为装了samba-common就可以了&#xff0c;发现smbd.serverice not found,于是开始了漫长的下载依赖包&#xff0c;安装&…...

【开源】基于Vue.js的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…...

【C++】泛型编程 ⑪ ( 类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 )

文章目录 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中1、分离代码 后的 友元函数报错信息 - 错误示例Student.h 头文件内容Student.cpp 代码文件内容Test.cpp 代码文件内容执行报错信息 2、问题分析 二、代码示例 - 函数实现 写在类外部的不…...

动手学深度学习——循环神经网络的简洁实现(代码详解)

文章目录 循环神经网络的简洁实现1. 定义模型2. 训练与预测 循环神经网络的简洁实现 # 使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, …...

19.删除链表的倒数第 N 个节点

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用双指针找到倒数第 N1 个节点后删除链表的第 N 个节点即可。注意当 N 为链表长度时&#xff0c;倒数第 N1 …...

机器人制作开源方案 | 莲花灯

1. 功能描述 莲花灯是一款基于莲花形象设计的机器人&#xff0c;本文示例将用两种模式来实现莲花灯的亮灭功能。 自主模式&#xff1a;用 光强传感器 控制莲花灯的灯叶开合。暗光情况下灯叶打开&#xff0c;灯亮&#xff1b;强光情况下灯叶闭合&#xff0c;灯灭。 …...

华为无线ac+fit三层组网,每个ap发射不同的业务vlan

ap管理dhcp在ac控制器上&#xff0c;业务dhcp在汇聚上 配置WLAN业务 &#xff08;1&#xff09;配置VAP模板 • 配置员工网络的VAP模板&#xff08;employee&#xff09; [AC-wlan-view] security-profile name employee //创建名为“employee”的安全模板 [AC-wlan-sec-prof-…...

人工智能:科技之光,生活之美

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们的生活中&#xff0c;它如同一束璀璨的科技之光&#xff0c;照亮我们生活的每一个角落&#xff0c;使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…...

mysql8.0英文OCP考试第61-70题

Q61.You wish to protect your MySQL database against SQL injection attacks. Which method would fail to do this? A)using stored procedures for any database access B)using PREPARED STATEMENTS C)installing and configuring the Connection Control plugin ( …...

WaveletPool:抗混叠在微小目标检测中的重要性

文章目录 摘要1、简介2、相关研究2.1、微小物体检测2.2. 抗锯齿过滤器3、方法3.1. Wavelet Pooling3.2 一致顺序的Wavelet Pooling的WaveCNet3.3、Bottom-Heavy Backbone4、实验4.1、预训练数据集4.2、微小目标检测数据集4.3、抗混叠方法的选择及应用顺序4.4、小波的选择4.5、T…...

3分钟搞定!Applite镜像加速让macOS软件下载飞起来 [特殊字符]

3分钟搞定&#xff01;Applite镜像加速让macOS软件下载飞起来 &#x1f680; 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为Homebrew下载软件慢如蜗牛而烦恼吗&#xf…...

从零搭建专属AI助手:OpenClaw框架实战指南

1. 从零到一&#xff1a;为什么你需要一个自己的AI助手&#xff1f; 如果你对“AI助手”的印象还停留在网页聊天框里那个一问一答的机器人&#xff0c;或者觉得它离你的日常工作生活很远&#xff0c;那今天咱们就来聊聊一个能真正“活”在你身边、为你所用的AI助手——OpenCla…...

Ripes终极指南:掌握RISC-V处理器可视化仿真的完整教程

Ripes终极指南&#xff1a;掌握RISC-V处理器可视化仿真的完整教程 【免费下载链接】Ripes A graphical processor simulator and assembly editor for the RISC-V ISA 项目地址: https://gitcode.com/gh_mirrors/ri/Ripes 想要深入理解计算机体系结构却苦于抽象概念难以…...

为AI智能体构建本地持久记忆系统:Remnic架构与实战指南

1. 项目概述&#xff1a;为AI智能体构建持久、私有的记忆系统如果你和我一样&#xff0c;长期与各类AI智能体&#xff08;无论是OpenClaw、Claude Code还是Codex CLI&#xff09;打交道&#xff0c;一定对一个问题深恶痛绝&#xff1a;每次对话&#xff0c;它们都像一张白纸。你…...

地理优化实战:从GeoDNS到智能路由,构建全球低延迟服务

1. 项目概述与核心价值最近在折腾一个挺有意思的项目&#xff0c;叫“geo-optimization”&#xff0c;直译过来就是“地理优化”。乍一听可能有点抽象&#xff0c;但说白了&#xff0c;它解决的是一个非常实际且普遍的问题&#xff1a;如何让一个服务或应用&#xff0c;根据用户…...

终极MP4视频修复指南:用Untrunc拯救你的损坏视频文件

终极MP4视频修复指南&#xff1a;用Untrunc拯救你的损坏视频文件 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 你是否曾因…...

小红书上的“论文初稿一键生成”是智商税吗?

不知道你有没有过这种时刻&#xff1f;对着空白文档发呆两小时&#xff0c;文献堆了几十篇&#xff0c;下笔第一句就卡壳&#xff1b;大纲改了五六版&#xff0c;逻辑还是乱&#xff0c;降重改到崩溃&#xff0c;重复率死活降不下来&#xff1b;答辩 PPT 熬到凌晨&#xff0c;格…...

VPC NAT 网关 v2.0 上线!VPC 级一次性打通,告别重复配置

VPC&#xff08;虚拟私有云&#xff09;是公有云上逻辑隔离、可自定义的私有网络空间&#xff0c;是云上资源部署和通信的基础&#xff0c;核心资源均需部署其中&#xff0c;不同VPC默认隔离以保障安全。用户可自主划分子网、配置路由&#xff0c;而网关是VPC内外及跨VPC通信的…...

如果电子元件会说话,它们会这样介绍自己......

如果电路板上的元件会说话&#xff0c; 你觉得它们会说什么&#xff1f;每天和这些小家伙打交道&#xff0c; 发现它们真的……都有自己的脾气。不信&#xff1f;&#x1f447; 往下看 &#x1f447;&#x1f534; 电阻&#xff08;老实人担当&#xff09; "别急别急&…...

编译器---GNU(gcc与g++)

概述 GCC&#xff08;GNU Compiler Collection&#xff09;和 G 是软件开发中常用的编译工具&#xff0c;它们在 GNU 项目中扮演着重要角色&#xff0c;为开发者提供了强大的编译能力。 基本概念 GCC GCC 即 GNU 编译器套件&#xff0c;它最初是作为 C 语言的编译器而开发的&am…...