首页 > 编程知识 正文

mqtt协议,报文控制协议

时间:2023-05-03 22:41:23 阅读:44140 作者:3673

建议使用稳定的基于c的cMQTT客户端开源库cMQTT

MQTT协议详细信息和开发教程(1) MQTT协议概述

MQTT协议详细信息和开发教程(2)构建MQTT服务器EMQx

MQTT协议详细信息和开发教程(3) MQTT客户端工具软件选择和简单测试

前言前面的文章简要介绍了MQTT的应用场景、MQTT服务器构建、MQTT客户端的工具测试,对MQTT有了初步的了解,并从本文详细分析了MQTT协议的内容。

1.MQTT控制消息结构名称备注Fixed header固定头所有控制消息包括Variable header可变报头部分控制消息包括Payload有效载荷部分控制消息包括下图表示固定标题的格式

2.1 MQTT控制消息类型位置:第1字节、第4位到第7位、总共4位无符号值,这些值的定义如下表所示。

名称消息流向说明Reserved0服务器端到客户端的连接请求CONNECT2服务器端到客户端的连接确认CONNACK2禁止保持服务端到客户端的连接消息3双向发布消息3358www.Sina.com/4双向QoS 1消息发布确认PUBLISH5双向发布接收(发布保证第一步骤) 3358 www. 6双向发布发布)发布保证第二步) 3358www.6 7双向QoS 2消息发布完成PUBACK8客户端到服务端客户端的注册请求PUBREC9向服务端客户端请求注册消息确认PUBREL10客户端向服务端客户端请求取消注册PUBCOMP11服务端向客户端购买消息12客户端到服务端的心跳请求SUBSCRIBE13服务端到客户端的心跳响应SUBACK14客户端到服务端的断开连接http://www 14 152.2控制消息标志的固定报头中的第一字节的剩馀4位[3-0]包括每个MQTT控制消息类型的特定标志。 如果收到不正确的标志,收件人将关闭UNSUBSCRIBE网络连接。 标记如下,其中所有标记为“已保留”的标记位将保留以供今后使用。

其中,UNSUBACK=控制消息重复分发的标志PINGREQ=PUBLISH消息的服务质量级别http://www.Sina.com/=pubblish消息

2.3剩馀长度位置:从第2字节开始

剩馀长度表示当前消息的剩馀部分的字节数,包括PINGRESPDISCONNECT。 剩馀长度Reserved用于编码剩馀长度字段本身的字节数。

剩下的长度字段使用可变长度编码方案。 小于128的值使用单字节编码,而更高的值处理如下:必须因此,每字节可以编码128个(0-127/0x00-0x7F )数字和一个连续位,其馀长度的字段为

示例1 :十进制64小于127,因此编码为一个字节,对应的十六进制为0x40

例2 )由于是十进制321(=652128 ),因此编码为2字节,DUP

注意,第一个字节为65 128=193,其中128指示其最高有效位为1,后面有字节。

第二个字节是2,表示2128=256,

因此,此示例的剩馀长度编码为0xc1、0x02。 去计算一下,如下所示。

len=0xC10X7F 0x02*0x7F //321下表显示了由不同字节数表示的剩馀长度的大小

字节数最小值的最大值10(0x00(127 )0x7F ) 2128 )0x 80,0x 01 ) 16383 )0xFF,0x7F ) 316384 )0x 80,0x 80,0x 01 ) 2097151 )0xFF,

3 .可变报头一些MQTT控制消息包含可变报头部分,它在固定报头和负载之间,可变报头的内容是依据的

报文类型的不同而不同,可变报头的报文标识符(Packet Identifier)字段存在与多个类型的报文里。
可变报头其实就是MQTT开发中使用的 Packet ID,通过Packet ID 进行一些操作确认。

3.1 报文标识符

报文标识符类型

很多控制报文的可变报头部分包含了两字节的报文标识符字段,这些报文是PUBLISH(QoS>0时),PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCIBE, UNSUBACK.

SUBSCRIBE, UNSUBSCRIBE和PUBLISH(QoS > 0)控制报文必须包含一个非零的16位报文标识符(Packet ID)。客户端每次发送一个新的这些类型报文时,都必须分配一个当前未使用的报文标识符(我们在开发的时候可以做简单的 自增packet_id++)。如果一个客户端要重发这个特殊的控制报文,爱随后重发的那个报文时,它必须使用相同的标识符。当客户端处理完这个报文对应的确认后,这个报文标识符就可以释放了,也就是可以重新使用。

Qos1的PUBLISH 对应的是PUBACK, Qos2的PUBLISH 对应的是PUBCOMP, 与SUBCRIBE或UNSUBSCRIBE对应的分别是SUBACK或UNSUBACK,服务器返回的Packet ID与客户端发送的是一致的,通过这一机制来实现确认。

Qos设置为0的PUBLISH报文不能包含报文标识符。

PUBACK, PUBREC, PUBREL报文必须包含于最初发送的PUBLISH报文相同的报文描述符,同样的,SUBACK和UNSUBACK必须包含在对应的SUBSCRIBE和UNSUBSCRIBE报文中使用的标识符。

需要包含报文标识符的控制报文

控制报文报文标识符字段CONNECT不需要CONNACK不需要PUBLISH需要(如果Qos > 0)PUBACK需要PUBREC需要PUBREL需要PUBCOMP需要SUBSCRIBE需要SUBACK需要UNSUBSCRIBE需要UNSUBACK需要PINGREQ不需要PINGRESP不需要DISCONNECT不需要

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

4.有效载荷

某些MQTT控制报文在报文的最后部分包含了一个有效载荷,比如对于PUBLISH来说,有效载荷就是应用消息。下表中列出了需要有效载荷的控制报文类型

控制报文有效载荷CONNECT需要CONNACK不需要PUBLISH可选PUBACK不需要PUBREC不需要PUBREL不需要PUBCOMP不需要SUBSCRIBE需要SUBACK需要UNSUBSCRIBE需要UNSUBACK不需要PINGREQ不需要PINGRESP不需要DISCONNECT不需要5 小结

MQTT协议报文的结构由3部分组成,可以简单的理解为:
(1)固定报头:表示这个报文的类型(CONNECTPUBLISH…)
(2)可变报头:Packet ID,也就是 报文的 顺序ID。
(3)有效载荷:应用消息。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。