在学习mqtt应用层协议之前,我们先来介绍一下发布/订阅模型以及请求/响应模型两种模型。
-
请求/响应模型是网络应用系统中最常见的模型。在这种模型中,一个客户端(如一个Web浏览器)向服务器发送一个请求,服务器处理这个请求并返回一个响应。这个过程是同步的,意味着客户端需要等待服务器的响应。这种模型的优点是简单和易于理解,但在处理大量并发请求时可能会导致性能问题。
-
发布/订阅模型。在这种模型中,有一个或多个发布者(通常是一个事件或消息源)和多个订阅者(对这些事件或消息感兴趣的观察者)。粗浅的理解,发布者将一个消息发布到一个中介上,然后中介存储这个消息,订阅者如果订阅了这个消息,那么中介再将这条消息发给订阅者。这个过程是异步的,意味着观察者可以在发布者的事件或消息处理过程中进行其他操作。这种模型的优点是能够处理大量并发事件或消息,但需要谨慎处理避免消息丢失或处理错误。
pub/sub 最重要的方面是消息的发布者与接收者(订阅者)的解耦。这种解耦有几个维度:
空间解耦:
发布者和订阅者不需要相互了解(比如不需要交换彼此的 IP 地址和端口)。
时间解耦:
发布者和订阅者不需要同时运行。
同步解耦:
两个组件的操作在发布或接收时不需要中断。
并且每个订阅者可以通过过滤不同的主题,内容,类型,来获取到自己想要的数据。
一,MQTT标准物联网协议
1,简单介绍
MQTT(Message Queuing Telemetry Transport)
,是一种基于发布/订阅(publish/subscribe)模型的“轻量级”通讯协议,该协议构建于TCP/IP协议上。MQTT 最大优点在于,轻量化。
- MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题中的消息的内容payload。
(2)payload,消息的内容,是指订阅者具体要使用的内容。不同的客户端在连接中介Broker 之后,每个客户端都可以发布和订阅主题。
2,MQTT协议组成
MQTT 协议由三个部分组成,分别是固定头,可变头以及消息体(有效负载)。
- 固定头(两个字节长);固定头存在于所有的MQTT数据包中,表示数据包类型及数据包的分组类标识。其结构如下:
-
标志位:包括DUP,QoS等级,Retain发布保留标识。
DUP:
发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加Messageld,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。QoS:
发布消息的服务质量等级,占用两个位00,01,10,11,他有三个等级0,1,2,其中11,也就是3,是被保留的。RETAIN:
发布保留标识,表示服务器要保留这次推送的信息(设置为1),默认设置为0,即订阅者订阅后,就把这消息发给它,之后删除这个消息。 -
MQTT控制报文的消息类型:
名称 值(十进制) 流方向 描述 Reserved 0 不可用 保留位 CONNECT 1 客户端到服务器 客户端请求连接到服务器 CONNACK 2 服务器到客户端 连接确认 PUBLISH(常用) 3 双向 发布消息 PUBACK 4 双向 发布确认 PUBREC 5 双向 发布收到(保证第1部分到达) PUBREL 6 双向 发布释放(保证第2部分到达) PUBCOMP 7 双向 发布完成(保证第3部分到达) SUBSCRIBE 8 客户端到服务器 客户端请求订阅 SUBACK 9 服务器到客户端 订阅确认 UNSUBSCRIBE 10 客户端到服务器 请求取消订阅 UNSUBACK 11 服务器到客户端 取消订阅确认 PINGREQ 12 客户端到服务器 PING请求 PINGRESP 13 服务器到客户端 PING应答 DISCONNECT 14 客户端到服务器 中断连接 Reserved 15 不可用 保留位 -
剩余长度:若最高位为1,那么表示长度不够,使用剩余长度,若为0,那么固定头只有一个字节大小,没有剩余长度。
-
可变头:
一般是用来存储包标识符,即Packet Identifier。
QoS等级(消息发布服务质量):MQTT含有三种QoS消息发布服务质量等级,分别是QoS0,QoS1,QoS2。
QoS0等级:
“至多发送一次”,“可能会发生消息的丢失”,即应用层协议MQTT完全依赖底部的TCP/IP协议族(传输层以及网络层协议),sender尽力的去发送一条数据,收到了就受到了,若信息丢失了。
QoS1等级:
“至少接收到一次”,“可能会发生消息的丢失或重复”,用来确保消息一定会到达目的地,因此会有一个应答机制,sender向receiver发送一个消息,若发送失败,那么sender会一直发送消息直至receiver至少收到一次,因为多次的重传,所以可能会导致接收到重复的信息。
QoS2等级:
“只有一次”sender会给receiver不停的发送消息直至receiver收到消息,并且会保证receiver仅收到一次消息,相比于前两个QoS等级,他没有消息重复和丢失的问题存在。
QoS是用来描述的是客户端和中介broker之间的信息质量等级,而不是发布者和订阅者之间的,这点需要注意,不要混淆。