MQTT协议简析

2022-04-17  本文已影响0人  jxiang112

定义

MQTT(Message Queuing Telemetry Transport,消息队列遥感传输)是一种基于publish/subscribe(发布/订阅)模式的轻量级通信协议,它构建在TCP/IP的协议上,有IBM于1999年发布

特性

应用场景

协议

MQTT的协议格式如下图所示:


格式.png

固定头(Fixed header)

存在于所有的MQTT数据包中,表示数据包的类型及数据包的分组类标识,其格式如下图所示:


固定头标识位.png
数据包类型

位置:第1个字节中的4-7位,占4位,是一个4位无符号值,数据包类型的类型、取值及说明如下图所示:


固定头数据包类型.png
标识位

位置:第1个字节中的0-3位,占4位。每种数据包类型的标识位的取值是不一样的,也可能不使用标识位,在不使用标识位的消息类型中,标识位被作为保留位。如果收到无效的标志时,接收端必须关闭连接,每种数据包类型的标识位说明如下图所示:

剩余长度(Retaining Length)

位置:第2个字节起,最大占4个字节
固定头的第2个字节起用来保存变长头部和消息体的总大小。这一字节是可以扩展的,其机制是:第7位用于保存长度,剩下一位用作是否需要更多字节来表示剩余长度。如果剩下一位是1,表示长度不足,需要使用第3个字节继续保存;如果最后一位是0,表示长度已足够,依次类推直到占满4个字节

可变头(Variable header)

MQTT某些类型的数据包中包含一个可变头,它位于固定头和消息体之间。可变头的内容因数据包类型不同而不同,很多类型数据包中都包含一个2字节的数据包标识符(可以理解为消息Message ID),这些类型的包有:PUBLISH(Qos>0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK,下图是需要报文标识符的类型:


可变头—是否需要报文标识符.png

消息体(Paload)

消息体(Paload)位于MQTT数据包的第3部分,在可变头的后面,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:

MQTT控制报文

CONNECT

可变头

下图是CONNECT的可变头:


可变头—CONNECT.png
Paload

CONNECT没有消息体

CONNACK

可变头

下图是CONNACK的可变头:


可变头—CONNACK.png
返回码响应 描述
0 0x00连接已接受 连接已被服务端接受
1 0x01连接已拒绝,不支持的协议版本 服务端不支持客户端请求的MQTT协议级别
2 0x02连接已拒绝,不合格的客户端标识符 客户端标识符是正确的UTF-8编码,但服务端不允许使用
3 0x03连接已拒绝,服务端不可用 网络连接已建立,但MQTT服务不可用
4 0x04连接已拒绝,无效的用户名或密码 用户名或密码的数据格式无效
5 0x05连接已拒绝,未授权 客户端未被授权连接到此服务器
6-255 保留
Paload

CONNACK无消息体

PUBLISH

可变头

下图是PUBLISH的可变头:


可变头—PUBLISH.png
Paload

Publish的消息体要依据具体的业务进行填充

PUBACK

可变头

下图是PUBACK可变头:


可变头—PUBACK.png
Paload

PUBACK无消息体

SUBSCRIBE

可变头

SUBSCRIBE的可变头如下图所示:


可变头—SUBSCRIBE.png
Paload

SUBSUCRIBE的消息体如下图所示:


Paload—SUBSCRIBE.png
上一篇 下一篇

猜你喜欢

热点阅读