对MQTT的一些理解(一)

概述

交互过程是有三个部分,包括订阅方,服务器和发布方,
这种通信方式的优点就是
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;
总的来说就是
多个客户端同时连接同一个服务器
不同的客户端可以订阅相同的标题,也可以订阅不同的标题
当某一设备发布某一标题时,服务器会将该标题的具体内容转发给订阅该标题的客户端

数据包结构

包含三个部分

Fixed Header固定报头, 所有控制报文都包含
Variable Header 可变报头, 部分控制报文包含
Payload 有效载荷, 部分控制报文包含

固定报头

Bit76543210
byte 1MQTT控制报文的类型用于指定控制报文类型的标志位
byte 2... 剩余长度

包头高四位控制报文类型(发送时用十六进制)

名字十六进制报文流动方向描述
Reserved00禁止保留
CONNECT11客户端到服务端客户端请求连接服务端
CONNACK22服务端到客户端连接报文确认
PUBLISH33两个方向都允许发布消息
PUBACK44两个方向都允许QoS 1 消息发布收到确认
PUBREC55两个方向都允许发布收到(保证交付第一步)
PUBREL66两个方向都允许发布释放(保证交付第二步)
PUBCOMP77两个方向都允许QoS 2 消息发布完成(保证交付第三步)
SUBSCRIBE88客户端到服务端客户端订阅请求
SUBACK99服务端到客户端订阅请求报文确认
UNSUBSCRIBE10A客户端到服务端客户端取消订阅请求
UNSUBACK11B服务端到客户端取消订阅报文确认
PINGREQ12C客户端到服务端心跳请求
PINGRESP13D服务端到客户端心跳响应
DISCONNECT14E两个方向都允许断开连接通知
AUTH15F两个方向都允许认证信息交换

包头低四位用于指定控制报文类型的标志位(发送时用十六进制)

MQTT控制报文固定报头标志Bit 3Bit 2Bit 1Bit 0十六进制
CONNECTReserved00000
CONNACKReserved00000
PUBLISHUsed in MQTT v5.0DUPQOS高QOS低RETAIN
PUBACKReserved00000
PUBRECReserved00000
PUBRELReserved00102
PUBCOMPReserved00000
SUBSCRIBEReserved00102
SUBACKReserved00000
UNSUBSCRIBEReserved00102
UNSUBACKReserved00000
PINGREQReserved00000
PINGRESPReserved00000
DISCONNECTReserved00000
AUTHReserved00000

DUP = PUBLISH报文的重复分发标志
重复分发标志
如果DUP标志被设置为0, 表示这是客户端或服务端第一次请求发送这个PUBLISH报文. 如果DUP标志被设置为1, 表示这可能是一个早前报文请求的重发.
客户端或服务端请求重发一个PUBLISH报文时, 必须将DUP标志设置为1
对于QoS为0的消息, DUP标志 必须设置为0

QoS = PUBLISH报文的服务质量等级

QoS值Bit 2Bit 1说明
000最多分发一次
101至少分发一次
210仅分发一次
-11保留 – 不能使用
RETAIN = PUBLISH报文的保留标志

可变报头

报文标识符

部分类型MQTT控制报文的可变报头部分包含了2个字节的报文标识符字段. 这些MQTT控制报文类型为:PUBLISH报文(当QoS>0时), PUBACK, PUBREC, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.

需要报文标识符的MQTT控制报文如下表所示.

MQTT控制报文报文标识符字段
CONNECT不需要
CONNACK不需要
PUBLISH需要(如果QoS > 0)
PUBACK需要
PUBREC需要
PUBREL需要
PUBCOMP需要
SUBSCRIBE需要
SUBACK需要
UNSUBSCRIBE需要
UNSUBACK需要
PINGREQ不需要
PINGRESP不需要
DISCONNECT不需要
AUTH不需要
QoS设置为0的PUBLISH报文不能包含报文标识符。

客户端每次发送一个新的SUBSCRIBE, UNSUBSCRIBE或者PUBLISH(当QoS>0时)MQTT控制报文时都必须分配一个当前未使用的非零报文标识符。

服务端每次发送一个新的PUBLISH(当QoS>0)MQTT控制报文时都必须分配一个当前未使用的非零报文标识符 。

当客户端处理完这个报文对应的确认后, 这个报文标识符就释放可重用. QoS 1的PUBLISH对应的是PUBACK, QoS 2的PUBLISH对应的是包含原因码128以上的PUBCOMP或PUBREC, 与SUBSCRIBE或UNSUBSCRIBE对应的分别是SUBACK或UNSUBACK。

PUBLISH, SUBSCRIBE和UNSUBSCRIBE的报文标识符, 在一次会话中对于客户端和服务端来说分属于不同的组. 某个报文标识符在某一时刻不能被多个命令所使用。

PUBACK, PUBREC和PUBREL报文必须包含与最初发送的PUBLISH报文相同的报文标识符 . 类似地, SUBACK和UNSUBACK 必须 包含在对应的SUBSCRIBE和UNSUBSCRIBE报文中使用的报文标识符。

客户端和服务端彼此独立地分配报文标识符. 因此, 客户端服务端组合使用相同的报文标识符可以实现并发的消息交换。

属性

CONNECT, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBACK, DISCONNECT 和 AUTH 报文可变报头的最后一部分是一组属性. CONNECT 报文的遗嘱(Will)属性字段中也包含了一组可选的属性.
属性长度被编码为变长字节整数. 属性长度不包含用于编码属性长度自身的字节数, 但包含所有属性的长度. 如果没有任何属性, 必须由属性长度为零的字段来指示。

标识符属性名(用途)数据类型报文/遗嘱属性
DECHEX
10x01载荷格式说明字节PUBLISH, Will Properties
20x02消息过期时间四字节整数PUBLISH, Will Properties
30x03内容类型UTF-8编码字符串PUBLISH, Will Properties
80x08响应主题UTF-8编码字符串PUBLISH, Will Properties
90x09相关数据二进制数据PUBLISH, Will Properties
110x0B定义标识符变长字节整数PUBLISH, SUBSCRIBE
170x11会话过期间隔四字节整数CONNECT, CONNACK, DISCONNECT
180x12分配客户标识符UTF-8编码字符串CONNACK
190x13服务端保活时间双字节整数CONNACK
210x15认证方法UTF-8编码字符串CONNECT, CONNACK, AUTH
220x16认证数据二进制数据CONNECT, CONNACK, AUTH
230x17请求问题信息字节CONNECT
240x18遗嘱延时间隔四字节整数Will Properties
250x19请求响应信息字节CONNECT
260x1A请求信息UTF-8编码字符串CONNACK
280x1C服务端参考UTF-8编码字符串CONNACK, DISCONNECT
310x1F原因字符串UTF-8编码字符串CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK, DISCONNECT, AUTH
330x21接收最大数量双字节整数CONNECT, CONNACK
340x22主题别名最大长度双字节整数CONNECT, CONNACK
350x23主题别名双字节整数PUBLISH
360x24最大QoS字节CONNACK
380x26用户属性UTF-8字符串对CONNECT, CONNACK, PUBLISH, Will Properties, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, DISCONNECT, AUTH
390x27最大报文长度四字节整数CONNECT, CONNACK
400x28通配符订阅可用性字节CONNACK
410x29订阅标识符可用性字节CONNACK
420x2A共享订阅可用性字节CONNACK
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值