MQTT控制报文介绍(2)

一、CONNECT –  连接 服务端

        客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文 必须是 CONNECT 报文。在一个网络连接上,客户端只能发送一次 CONNECT 报文。服务端 必须将客户端发送的第二个 CONNECT报文当作协议违规处理并断开客户端的连接。

二、MQTT控制报文的结构

三、CONNECT 连接报文

3.1 CONNECT 连接报文固定报头 

3.2 CONNECT 连接报文可变报头 

第1位:

  • 如果清理会话(CleanSession)标志被设置为 0,服务端 必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信。如果没有与这个客户端标识符关联的会话,服务端 必须创建一个新的会话。
  • 如果清理会话(CleanSession)标志被设置为 1,客户端和服务端 必须丢弃之前的任何会话并开始一个新的会话。会话仅持续和网络连接同样长的时间。与这个会话关联的状态数据 不能被任何之后的会话重用。

第二位:

  • 遗嘱标志(Will Flag)被设置为 1,表示如果连接请求被接受了,遗嘱(Will Message)消息 必须被存储在服务端并且与这个网络连接关联。之后网络连接关闭时,服务端 必须发布这个遗嘱消息,除非服务端收到DISCONNECT 报文时删除了这个遗嘱消息 。如果遗嘱标志被设置为 1,连接标志中的 Will QoS 和 Will Retain 字段会被服务端用到,同时有效载荷中必 必须 须包含 Will Topic 和 Will Message 字段 。
  • 如果遗嘱标志被设置为 0,连接标志中的 Will QoS 和 Will Retain 字段 必须设置为 0,并且有效载荷中 不能包含 Will Topic 和 Will Message 字段 。如果遗嘱标志被设置为 0,网络连接断开时, 不能发送遗嘱消息

第三、四位:

  • 如果遗嘱标志被设置为 0,遗嘱 QoS 也 必须设置为 0(0x00)。
  • 如果遗嘱标志被设置为 1,遗嘱 QoS 的值可以等于 0(0x00),1(0x01),2(0x02)。

第五位:

  • 如果遗嘱标志被设置为 0,遗嘱保留(Will Retain)标志也 必须设置为 0 。
  • 如果遗嘱标志被设置为 1:
    • 如果遗嘱保留被设置为 0,服务端 必须将遗嘱消息当作非保留消息发布。
    • 如果遗嘱保留被设置为 1,服务端 必须将遗嘱消息当作保留消息发布 。

第六位:

  • 如果用户名(User Name)标志被设置为 0,有效载荷中 不能包含用户名字段
  • 如果用户名(User Name)标志被设置为 1,有效载荷中 必须包含用户名字段 

第七位:

  • 如果密码(Password)标志被设置为 0,有效载荷中 不能包含密码字段
  • 如果密码(Password)标志被设置为 1,有效载荷中 必须包含密码字段
  • 如果用户名标志被设置为 0,密码标志也 必须设置为 0

        保持连接(Keep Alive)是一个以秒为单位的时间间隔,表示为一个 16 位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端 必须发送一个PINGREQ 报文 。如果保持连接的值非零,并且服务端在一点五倍的保持连接时间内没有收到客户端的控制报文,它 必须断开客户端的网络连接。

非规范 评注:保持连接的实际值是由应用指定的,一般是几分钟。允许的最大值是 18 小时 12 分 15 秒。

3.3 CONNECT 连接报文有效载荷

CONNECT 报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话, 必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码

(一)客户端标识符

  • 服务端使用客户端标识符 (ClientId) 识别客户端。连接服务端的每个客户端都有唯一的客户端标识符(ClientId)。客户端和服务端都必须使用 ClientId 识别两者之间的 MQTT 会话相关的状态。客户端标识符 (ClientId)  必须存在而且 必须是 CONNECT 报文有效载荷的第一个字段 。
  • 服务端 必须允许 1 到 23 个字节长的 UTF-8 编码的客户端标识符,客户端标识符只能包含这些字符:“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”(大写字母,小写字母和数字)

(二)遗嘱主题:
        如果遗嘱标志被设置为 1,有效载荷的下一个字段是遗嘱主题。

(三)遗嘱消息:
        如果遗嘱标志被设置为 1,有效载荷的下一个字段是遗嘱消息。遗嘱消息定义了将被发布到遗嘱主题的应用消息。这个字段由一个两字节的长度和遗嘱消息的有效载荷组成,表示为零字节或
多个字节序列。长度给出了跟在后面的数据的字节数,不包含长度字段本身占用的两个字节。

(四)用户名:
        如果用户名(User Name)标志被设置为 1,有效载荷的下一个字段就是它。服务端可以将它用于身份验证和授权。

(五)密码:
        如果密码(Password)标志被设置为 1,有效载荷的下一个字段就是它。密码字段包含一个两字节的长度字段,长度表示二进制数据的字节数(不包含长度字段本身占用的两个字节),后面跟着 0 到 65535 字节的二进制数据。

3.4 CONNECT 报文确认连接请求

四、PUBLISH –  发布消息

PUBLISH 控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息

4.1 PUBLISH报文固定包头

第三位(DUP重发标志):
        如果 DUP 标志被设置为 0,表示这是客户端或服务端第一次请求发送这个 PUBLISH 报文。如果 DUP 标志被设置为 1,表示这可能是一个早前报文请求的重发。客户端或服务端请求重发一个 PUBLISH 报文时, 必须将 DUP 标志设置为 1 。对于 QoS0 的消息,DUP 标志 必须设置为 0 

第一、二位(Qos等级、服务质量 等级):

第 0 位(保留标志):
        如果客户端发给服务端的 PUBLISH 报文的保留(RETAIN)标志被设置为 1,服务端 必须存储这个应用消息和它的服务质量等级(QoS),以便它可以被分发给未来的主题名匹配的订阅者。
        如果客户端发给服务端的 PUBLISH 报文的保留标志位 0,服务端 不能存储这个消息也 不能移除或替换任何现存的保留消息 。

4.2 PUBLISH报文可变报头

可变报头按顺序包含主题名和报文标识符

主题名(Topic Name):用于识别有效载荷数据应该被发布到哪一个信息通道。主题名 必须是 PUBLISH 报文可变报头的第一个字段。

报文标识符:只有当 QoS 等级是 1 或 2 时,报文标识符(Packet Identifier)字段才能出现在 PUBLISH 报文中。

4.3 PIBLISH 报文有效载荷

有效载荷包含将被发布的应用消息。数据的内容和格式是应用特定的。有效载荷的长度这样计算:用固定报头中的剩余长度字段的值减去可变报头的长度。包含零长度有效载荷的 PUBLISH 报文是合法的。


五、SUBSCRIBE -  订阅主题

        客户端向服务端发送 SUBSCRIBE 报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送 PUBLISH 报文给客户端。SUBSCRIBE报文也(为每个订阅)指定了最大的 QoS 等级,服务端根据这个发送应用消息给客户端。

5.1 SUBSCRIBE报文固定报头

5.2 SUBSCRIBE报文可变报头


 

5.3 SUBSCRIBE报文有效载荷

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

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

相关文章

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇: three.js如何实现简易3D机房?(二)模型加载的过渡动画:http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 (1)需求: (2)思路:…

一些考证网站

教师资格证1月报名,3月考试 https://www.neea.edu.cn/html1/folder/16013/15-1.htm 导游证 7月10日报名,8月考试 https://c-dy.exam-sp.com/index.html#/e/dy2023/module4 中国教育考试网可考内容 中国人事网 一般报名提前两个月左右 http://cpta.mohrs…

论文笔记 - 基于振动信号的减速器故障诊断方法

1.论文摘要 基于振动信号的减速器故障诊断方法, 沈晴,《起重运输机械》,2018 原作者联系方式: shenqing@zmpc.com 这篇文章包含了一个从工程到数据处理和故障定位的完整过程。是一篇综述文档。它介绍了机械设备常见的三类故障(轴,齿轮、轴承)的故障特征,并在一个故障追…

axios网络请求库语法

post,get方法: 代码示例 请求成功后控制台返回信息 axios统一使用方式:axios(config) 理解为调用一个方法,方法里带上配置信息 Axios API | Axios中文文档 | Axios中文网 (axios-http.cn) axios中文网

为国产信创服务器提供LDAP统一身份认证方案

金融信创作为 8 大行业信创之首,早已成为其他行业信创建设的参考。金融行业有着极为复杂的业务场景,对系统有着极高的稳定可靠需求,因此,在寻找微软 AD 国产化替代方案时,常会涉及到更深层次的场景。例如,最…

C# CallerMemberName、CallerFilePath、CallerLineNumber

CallerMemberName:调用某个方法的主方法名称 CallerFilePath:调用某个方法的主方法所在的类文件地址 CallerLineNumber:调用这个方法所在的行号 用这三个附加属性,需要设置默认值。

本地部署websocket服务端并结合内网穿透实现固定公网地址连接

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

机器学习 -- Octave基本操作

场景 Octave语言是一种高级数值计算和数据可视化的开源软件。它提供了一种方便的方式来执行数值计算、数据分析和可视化,特别是在科学和工程领域中。今天学习了一下Octave的基本操作,记录一下。 下载 去Octave官网下载即可。octave下载可自行下载。 …

【MySQL篇】 MySQL基础学习

前言 在做项目的过程中,深深感悟到一个扎实的MySQL基础是多么重要,这篇文章就用来记录一下我对于MySQL的复习,下面开始介绍了。 MySQL 是一款开源免费的数据库。后端程序员的工作离不开与数据库打交道,MySQL因其简单易懂、使用方…

做会销的行业人都是怎么学习的?

作一个自媒体人,偶尔也会遇到一些做会销的朋友, 很多人对做会销的人有些不了解,但是其实会销的根本就是帮助企业对客户进行收集和筛选的,并向目标用户,宣传和售卖的营销模式。 基础认知 但是作为局外人,说…

【IEEE会议征稿通知】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024)

【IEEE会议】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024) 2024 9th International Conference on Information Science, Computer Technology and Transportation 第九届信息科学、计算机技术与交通运输国际学术会议(ISC…

开抖音小店一个月,就摸清楚了电子面单发货,不用担心被查无货源

大家好,我是电商花花。 开抖音小店一个月的时间,就摸清楚了抖音小店的电子面单发货,再也不用担心做无货源模式被平台稽查了。 现在平台的规则越来越严格,很多抖音小店的商家为了避免违规,为了不被平台稽查&#xff0…