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/

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

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

相关文章

记录一个简单的博客系统该开发过程

文章目录 1.1 设计前端页面1.2 编写数据库相关代码1.3 实现功能的前后端交互 总结 1.1 设计前端页面 首先我们的博客系统要有几个网页界面 博客列表页博客详情页登录页博客编辑页 1.2 编写数据库相关代码 本环节我们需要完成以下几个步骤. 先设计数据库(表设计), 然后编写…

uview-plus中二级菜单左右联动更改为uni-app+vue3+vite写法

uview-plus3.0重磅发布&#xff0c;全面的Vue3移动组件库 该插件使用的vue2写法&#xff0c;但支持vue3引用&#xff0c;在此基础上修改为uni-appvue3vite; <template><view class"u-wrap mainClass"><!-- <back-header :title"pageTitle&quo…

太累了,是时候让AI数字人来帮我干活了(走,上教程)

阿酷TONY&#xff0c;原创文章&#xff0c;长沙&#xff0c;2023.11.21 关 键 词&#xff1a;AI数字人&#xff0c;生成式AI&#xff0c;智能数字分身适用场景&#xff1a;培训数字人&#xff0c;演讲授课数字人&#xff0c;直播带货数字人特别说明&#xff1a;教程用的是国内…

捷诚管理信息系统 SQL注入漏洞复现

0x01 产品简介 捷诚管理信息系统是一款功能全面&#xff0c;可以支持自营、联营到外柜租赁的管理&#xff0c;其自身带工作流管理工具&#xff0c;能够帮助企业有效的开展内部审批工作。 0x02 漏洞概述 捷诚管理信息系统CWSFinanceCommon.asmx接口存在SQL注入漏洞。未经身份认…

【UE】线框材质

一、方式1 新建一个材质&#xff0c;混合模式设置为“已遮罩”&#xff0c;勾选“双面” 勾选“线框” 然后可以随便给一个自发光颜色&#xff0c;这样最基本的线框材质就完成了 二、方式2 新建一个材质&#xff0c;混合模式设置为“已遮罩”&#xff0c;勾选“双面”&#x…

Idear 中签出git项目分支为灰色

--签出git上的项目 git clone git项目地址 --查看目录 $ dir --查看分支 $ git branch -a --签出分支 $ git checkout origin/v1.0 签出后&#xff0c;使用idear打开项目&#xff0c;项目关联git信息

flock使用文件描述符和使用文件的区别

使用带文件描述符的方法可以让你更好地控制和管理 flock 以及与锁相关的行为。当你在子进程或子shell中使用文件描述符时&#xff0c;文件锁可以跨越这些范围&#xff0c;并且只有在你显式地释放它时&#xff0c;锁才会被释放。 让我们看一个例子&#xff0c;更好地理解这一点…

uniapp中swiper 轮播带左右箭头,点击切换轮播效果demo(整理)

可以点击箭头左右切换-进行轮播 <template><view class"swiper-container"><swiper class"swiper" :current"currentIndex" :autoplay"true" interval"9000" circular indicator-dotschange"handleSw…

IPKISS Tutorials ------查看使用 _generate_elements 方法创建图形的端点坐标

IPKISS Tutorials ------查看使用 _generate_elements 方法创建图形的端点坐标 正文正文 import si_fab.all as pdk import ipkiss3.all as i3class Box(i3.PCell):class Layout(i3.LayoutView

深入了解 Bat 脚本:简单而强大的自动化工具——进阶版

&#x1f3eb;博客主页&#xff1a;魔王-T &#x1f3ef;系列专栏&#xff1a;自动化脚本工具 &#x1f95d;大鹏一日同风起 扶摇直上九万里 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前一篇文章【深入了解 Bat 脚本&#xff1a;简单而强大的自动化工具——基础版】介绍…

Atcoder ABC158

C - Tax Increase 范围足够小&#xff0c;遍历100/0.08内的整数就好 D - String Formation 设置两个数组分别代表前后加入的字符&#xff0c;reverse时交换数组 # -*- coding: utf-8 -*- # time : 2023/6/2 13:30 # file : atcoder.py # software : PyCharmimport bi…

Java语言的特点||运算符

Java语言的特点||运算符 1&#xff1a;2&#xff1a;JDK, JRE&#xff0c;JVM知识&#xff1a;3&#xff1a;注释4&#xff1a;标识符5&#xff1a; Java编译过程&#xff1a;6&#xff1a;赋值7&#xff1a;switch8:布尔表达式9&#xff1a;判定素数10&#xff1a;打印 1 - 10…

IPKISS Tutorials ------查看使用_generate_instances 方法创建图形的端点

IPKISS Tutorials ------查看使用_generate_instances 方法创建图形的端点 import si_fab.all as pdk import ipkiss3.all as i3class Box(i3.PCell):class Layout(i3.LayoutView):</

力扣题目学习笔记(OC + Swift)

训练思维&#xff0c;提高编程能力&#xff0c;不为刷题而刷题 文章目录 1. 两数之和Swift版本OC版本 2. 两数相加Swift实现OC实现 3.无重复字符的最长子串SwiftOC 4.寻找两个正序数组的中位数SwiftOC 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请…

【Linux网络】搭建内外网的网关服务器,实现DNS分离解析与DHCP自动分配

一、实验要求&#xff1a; 二、实验思路剖析&#xff1a; 网关服务器&#xff1a; 客户端准备&#xff1a; 实操&#xff1a; 第一步先安装dhcp服务和bind服务 第二步双网卡&#xff0c;配置网卡的ip地址 第三步&#xff1a;开始配置dhcp 第四步&#xff1a;做dns分离解析…

使用项目自动生成的dokcerfile第一次构建时把加载aps5.0失败无法找到加载的文件

第一次构建初始化项目自带的dockerfile,内容如下: #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.#FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base #WORKDIR /a…

【half done】剑指offer53:在排序数组中查找数字

力扣&#xff0c;https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/description/ 二分查找&#xff0c;边界问题 solution1 自己的方法&#xff0c;其实不太好 class Solution {public int countTarget(int[] scores, int target) {if (scores.l…

单线圈无刷直流电机的电机驱动器芯片GC1298R/S,可替代EUM6898/德信,应用于车用信息娱,HUD 投影仪调整等产品中

GC1298R/S 是单线圈无刷直流电机的电机驱动器。它具有高效的直接 PWM控制方式&#xff0c; 它可以控制无刷直流电机转速。它集成了最低速 度限制模式、可调速度斜率控制模式、软启动模 式、风扇转速计、锁保护、自动重启、TSD、OCP 和噪声控制模式&#xff0c;噪声控制模式根据…

使用持久卷部署 WordPress 和 MySQL

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f587;️创建 kustomization.yaml 你可以通过 kustomization.yaml 中的生成器创建一个 Secret存储密码或密…

python 迭代器

可迭代对象 可以直接作用于for循环的对象统称为可迭代对象 &#xff08;iterable&#xff09;。可以用isinstance()去判断一个对象是否是iterable对象。 数据类型 可以直接作用于for循环的数据类型一般分为两种 1.集合数据类型&#xff0c;如list、tuple、dict、set、strin…