MQTT CONNECT控制报文

目录

前言

一、CONNECT – 连接服务端

二、CONNECT的格式数据及讲解

固定报头内容分析​

可变报头内容分析

协议名(Protocol Name):

协议级别(Protocol Level):

连接标志(Connect Flags):

保持连接(Keep Alive):

有效载荷内容分析

有效载荷(payload):

客户端标识符(Client Identifier):

遗嘱主题 (Will Topic):

遗嘱消息(Will Message):

用户名(User Name):

密码 (Password):

UTF-8编码字符串格式结构:

总结


前言

本文章举CONNECT控制报文类型,以便于大家更好的理解MQTT,能自主看懂MQTT协议。


一、CONNECT – 连接服务端

TCP/IP连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文。

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

二、CONNECT的格式数据及讲解

接下来我们就开始数据分析了:

固定报头内容分析

 有了第一篇MQTT的讲解,我们知道固定头的4-7位是消息类型,由上面的小图我们知道 CONNECT的值为1,所以固定头4-7位为0001。

 固定头的CONNECT消息类型0-3位为0000。

剩余长度是怎么样的?大家可以看看这篇文章就懂了。链接如下:

(62条消息) MQTT 剩余长度_但是那是但是的博客-CSDN博客

可变报头内容分析

CONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。

协议名(Protocol Name):

byte3-byte8,协议名前两个字节表示长度,后面是名称。

协议级别(Protocol Level):

3.1.1版协议规定,协议级别字段的值是4(0x04)。如果发现不支持的协议级别,服务端必须给发送一个返回码为0x01(不支持的协议级别)的CONNACK报文响应CONNECT报文,然后断开客户端的连接。

连接标志(Connect Flags):

由6个标志组成,1-7位分别为清理会话(Clean Session)、遗嘱标志(Will Flag)、(占两位)遗嘱(QoS Will QoS)、遗嘱保留(Will Retain)、密码标志 (Password Flag)用户名标志(User Name Flag),0位为保留位。

保留位:

服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。

清理会话(Clean Session):

设置为0,服务端必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信。如果没有与这个客户端标识符关联的会话,服务端必须创建一个新的会话。

设置为1,客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。

遗嘱标志(Will Flag):

设置为0,网络连接断开时,不能发送遗嘱消息 。

设置为1,网络连接准备关闭时,服务端就会发布遗嘱消息。

遗嘱(QoS Will QoS):

指定发布遗嘱消息时使用的服务质量等级。

如果遗嘱标志被设置为0,遗嘱QoS也必须设置为0(0x00)。

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

遗嘱保留(Will Retain):

如果发布时需要保留,需要指定这一位的值。

设置为0,遗嘱保留(Will Retain)标志也必须设置为0 。

设置为1:

  • 设置为0,服务端必须将遗嘱消息当作非保留消息发布。

  • 设置为1,服务端必须将遗嘱消息当作保留消息发布。

密码标志( Password Flag):

设置为1,有效载荷中必须包含密码字段 。

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

用户名标志(User Name Flag):

设置为0,有效载荷中不能包含用户名字段 。

设置为1,有效载荷中必须包含用户名字段。

小结:

1、连接标志决定了有效载荷内容。

2、连接标志在图上填X的原因是,在不同场景情况下,连接标志是不一样的。比如,是否连接时需要密码验证。

保持连接(Keep Alive):

保持连接是服务器和客户无操作的时间间隔。以秒为单位,最大值是18小时12分15秒。

有效载荷内容分析

有效载荷(payload):

可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码 。

客户端标识符(Client Identifier):

服务器识别客户端的唯一标识符(1到23个字节)。类似我们的身份证号码,是唯一的。UTF-8编码字符串格式。

遗嘱主题 (Will Topic):

遗嘱主题:客户端与服务器网络连接成功后,服务器给客户端规定一个主题。UTF-8编码字符串格式。

遗嘱消息(Will Message):

定义将被发布到遗嘱主题的应用消息。客户端与服务器断开网络连接前,服务器给客户端发布消息。UTF-8编码字符串格式。

用户名(User Name):

用于身份验证和授权。UTF-8编码字符串格式。

密码 (Password):

顾名思义。UTF-8编码字符串格式。

UTF-8编码字符串格式结构:
二进制位7-0
byte 1字符串长度的最高有效字节(MSB)
byte 2字符串长度的最低有效字节(LSB)
byte 3 ….如果长度大于0,这里是UTF-8编码的字符数据。

UTF-8 是一个高效的Unicode字符编码格式,大家可以到网上科普科普。

由两个UTF-8存储长度大小的信息作为前缀,后面跟着内容,实现UTF-8编码字符串格式结构。

上面协议名也是这种格式。

总结

本文简单介绍了MQTT协议CONNECT控制报文。博主水平和能力有限,文中难免存在错误和纰漏,请大佬不吝赐教。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但是那是但是

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值