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报文可以被客户端准确无误的接收到。在服务端想客户端发送报文后,客户端会向服务端返回一个确认报文。
如果服务端没有收到客户端的确认报文,服务端会认为刚刚发送的报文没有送达给客户端。这种情况下,服务端将会将尚未被客户端确认的报文保存起来,再次尝试向客户端发送报文,并且再次等待客户端发来的确认消息。
注:该选项可以设置为True 或 False。
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消息的服务质量等级。三个等级:0,1,2
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)
遗嘱消息的服务质量,可以设置0、1、2的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。
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订阅接收该主题的消息。如果客户端2在08:01时刻上电启动,那么再未来的59分钟内,都处于无消息可处理的空闲状态。
为了避免这种情况,将保留消息(retainFlag)设置为Ture,无论客户端2何时上电工作,都会马上收到该主题中的“保留消息”。
6 心跳间隔 (KeepAlivelnterval)
客户端在心跳间隔时间内,如果有消息发布,那就直接发布消息而不发布心跳请求,但是在心跳间隔时间内,客户端没有消息发布,那么它就会发布一条心跳请求给服务端,这个心跳请求的目的就是为了告诉服务端,我还在线,你放心吧。
另外,在实际运行中,如果服务端没有在1.5倍心跳时间间隔内收到客户端发布消息(PUBLISH)或发来心跳请求(PINGREQ),那么服务端就会认为这个客户端已经掉线。
最后,心跳机制不仅仅用于服务端判断客户端是否在线。客户端也可以利用这一机制来判断自己是否与服务端仍保持连接。如果客户端发送了心跳请求(PINGREQ)给服务端一段时间后,仍然没有收到服务端回复的心跳确认。那么客户端也会认为自己已经断开了与服务端的连接。
参考资料
- 太极创客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比较可读,通过键值对返回。实现通常有两种方式:一种是自己来构造,也就是用一个对象存储数据,在最后输出时将其json字符串化;第二种是使用 RestController 注解实现json数据返回。 第一种 导入依赖坐标: <depe…...
Kafka-Producer
1、生产者 从编程的角度而言,生产者是一个消息的生产者,它负责创建消息并发送到Kafka集群中的一个或多个topic中。 1.1、客户端开发 一个正常的生产逻辑需要具备以下几个步骤: 配置生产者客户端参数及创建相应的生产者实例构建待发送的消…...
Ubuntu20上离线安装samba
如果联网,一条 sudo apt-get install samba就可能解决问题,但是没有网,那么只能一个一个的解决问题: 我以为装了samba-common就可以了,发现smbd.serverice not found,于是开始了漫长的下载依赖包,安装&…...
【开源】基于Vue.js的教学过程管理系统
项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要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 个节点
题目来源: leetcode题目,网址:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 解题思路: 使用双指针找到倒数第 N1 个节点后删除链表的第 N 个节点即可。注意当 N 为链表长度时,倒数第 N1 …...
机器人制作开源方案 | 莲花灯
1. 功能描述 莲花灯是一款基于莲花形象设计的机器人,本文示例将用两种模式来实现莲花灯的亮灭功能。 自主模式:用 光强传感器 控制莲花灯的灯叶开合。暗光情况下灯叶打开,灯亮;强光情况下灯叶闭合,灯灭。 …...
华为无线ac+fit三层组网,每个ap发射不同的业务vlan
ap管理dhcp在ac控制器上,业务dhcp在汇聚上 配置WLAN业务 (1)配置VAP模板 • 配置员工网络的VAP模板(employee) [AC-wlan-view] security-profile name employee //创建名为“employee”的安全模板 [AC-wlan-sec-prof-…...
人工智能:科技之光,生活之美
在科技飞速发展的今天,人工智能已经深入到我们的生活中,它如同一束璀璨的科技之光,照亮我们生活的每一个角落,使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…...
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…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
