请选择 进入手机版 | 继续访问电脑版
查看: 1254|回复: 0

[技术交流] mqtt协议基础知识

[复制链接]

8

主题

10

帖子

28

积分

助理工程师

Rank: 1

积分
28
发表于 2019-4-19 10:26:40 | 显示全部楼层 |阅读模式
一、MQTT协议简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议、
二、协议特点
该协议的特点有:
• 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
• 对负载内容屏蔽的消息传输。
• 使用TCP/IP提供网络连接。
• 有三种消息发布服务质量:
• “至多一次”,消息发布完全依赖于底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如
下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
• “至少一次”,确保消息到达,但消息重复可能会发生。
• “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会
导致不正确的结果。
• 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
• 使用LastWill和Testament特性通知有关各方客户端异常中断的机制。
三、MQTT消息格式
3.1、固定报头
每一个mqtt消息都必须包含一个固定报头,格式如下:
C:/Users/zhangjianh/AppData/Local/YNote/data/sina3820470580/ea903787b96a4ec0aed426d08fb8121a/clipboard.png
MEssage Type,byte1 7~4,四位无符号值,代表16中连接状态:
C:/Users/zhangjianh/AppData/Local/YNote/data/sina3820470580/6aabe66dcc6f4798a7579d8750a26aed/clipboard.png
(0->保留; 1->客户端请求连接到服务器; 2->连接确认; 3->发布消息; 4->发布确认; 5->发布收稿(有保证的交付第1部分); 6->出版发行(有保证交付第2部分); 7->发布完整(有保证的交付第3部分); 8->客户端订阅请求; 9->订阅确认; 10->客户端退订请求; 11->退订确认; 12->ping请求; 13->ping相应; 14->客户端端口; 15->保留;)
DUPflag byte1 3, 其是用来在保证消息传输可靠的,如果设置为1,则在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。
byte1 2~1,这两位用来表示消息的发送质量
C:/Users/zhangjianh/AppData/Local/YNote/data/sina3820470580/df2299df2b0344dca132976cf9f9317f/clipboard.png
00:消息可能到达服务器一次,也可能不会到达;
01:服务器接收到消息会被确认,通过传输一个PUBACK信息。如果有一个可以辨认的传输失败,无论是通讯连接还是发送设备,还是过了一段时间确认信息没有收到,发送方都会将消息头的DUP位置1,然后再次发送消息。消息最少一次到达服务器。SUBSCRIBE和UNSUBSCRIBE都使用level 1 的QoS。如果客户端没有接收到PUBACK信息(无论是应用定义的超时,还是检测到失败然后通讯session重启),客户端都会再次发送PUBLISH信息,并且将DUP位置1。当它从客户端接收到重复的数据,服务器重新发送消息给订阅者,并且发送另一个PUBACK消息。
11:在QoS level 1上附加的协议流保证了重复的消息不会传送到接收的应用。这是最高级别的传输,当重复的消息不被允许的情况下使用。这样增加了网络流量,但是它通常是可以接受的,因为消息内容很重要。QoS level 2在消息头有Message ID。
byte1 0,retain
0 —— 服务端不能存储这个消息,也不能移除或替换任何 现存的保留消息               
1 —— 服务端必须存储这个应用消息和它的QoS等级,以便它可以被分发给未来的订阅者
每个Topic只会保留最多一个 Retain 持久消息
客户端订阅带有持久消息的Topic,会立即受到这条消息
服务器可以选择丢弃持久消息,比如内存或者存储吃紧的时候
如果客户端想要删除某个Topic 上面的持久消息,可以向这个Topic发送一个Payload为空的持久消息
遗嘱消息(Will)的Retain持久机制同理
byte2 remaining length,在当前消息中剩余的byte(字节)数,包含可变头部和负荷.
在当前消息中剩余的byte(字节)数,包含可变头部和负荷(称之为内容/body,更为合适)。单个字节最大值:01111111,16进制:0x7F,10进制为127。单个字节为什么不能11111111(0xFF)呢?因为MQTT协议规定,第八位(最高位)若为1,则表示还有后续字节存在。同时MQTT协议最多允许4个字节表示剩余长度。那么最大长度为:0xFF,0xFF,0xFF,0x7F,二进制表示为:11111111,11111111,11111111,01111111,十进制:268435455 byte=261120KB=256MB=0.25GB 四个字节之间值的范围:
C:/Users/zhangjianh/AppData/Local/YNote/data/sina3820470580/f4d2a8fd256b44ca8f6b009252201cc1/clipboard.png
3.2、可变报头
参考资料:https://blog.csdn.net/u011216417/article/details/69666752
可变报头位于它位于fixed header和payload之间。包含了协议名称,版本号,连接标志,用户授权,心跳时间等内容,可变头部内容字节长度 + Payload/负荷字节长度 = 剩余长度。
可变报头由版本号(1byte)和连接标志(1byte)组成,连接标志的组成如下图所示:
C:/Users/zhangjianh/AppData/Local/YNote/data/sina3820470580/f4630cf3cf0f473f8bc2a969cb0d9a79/clipboard.png
clean session
如果为false(flag=0),Client断开连接后,Server应该保存Client的订阅信息。
如果为true(flag=1),表示Server应该立刻丢弃任何会话状态信息。
will flag
遗嘱消息的开关:0 关闭遗嘱消息,Will QoS 和 Will Retain 必须为 0
1 打开遗嘱消息,开启遗嘱功能,需要设置 Will Retain 和 Will QoS
Will Retain —— 遗嘱是否保留
0 -- 遗嘱消息不保留,后面再订阅不会收到消息
1 -- 遗嘱消息保留,持久存储
Will Topic —— 遗嘱话题
Will Payload —— 遗嘱消息内容




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表