一、协议介绍
MQTT协议可以理解为一个类似于kakfa或者rocketmq这种中间件的形式。它主要功能就是可以实现发布和订阅。
不同的客户端去跟客户端连接,然后就可以订阅一些主题(topic),有些客户端如果发布了这些主题,这些订阅的都能收到。
实用场景举例:
比如一个楼中的人都想在手机上每天收到自己楼内的温度,
楼内住户的手机作为客户端(client),连接到服务端(mqttbroker),然后订阅(subscribe)温度这个主题,
测量温度设备作为一个客户端(client),在连接到服务端后推送(publish)温度主题(topic)到服务器,
服务端收到消息后,再发送推送报文给这些订阅的客户端,也就是楼内人的手机,就实现温度推送这个功能了。
这些连接、发布、订阅、断开等等操作,都需要特定的报文来实现(这也是协议存在的意义,定规矩)
MQTT规范定义了十四种不同类型的控制报文,来实现上诉各个功能。
二、控制报文格式
主要分三个部分:固定头(Fixed header)+可变头(Variable header)+有效载荷(Payload)
1.固定头
固定头第一个字节byte(一个字节由8位二进制数组成)的前4位值对应不同报文类型,具体值对应如下:
后4个字节用于指定控制报文类型的标志位,目前就publish用到了,这四个字节分别对应:
- DUP1 =控制报文的重复分发标志
- QoS2 = PUBLISH报文的服务质量等级
- QoS2 = PUBLISH报文的服务质量等级
- RETAIN3 = PUBLISH报文的保留标志
2.可变报文头
某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。
这个报文标识符用来唯一标识一条报文,可以理解为报文的id。
这东西在重发和答复的时候都会用到,如果你是重发报文,那这个标识符要跟之前的报文一样,如果你要答复某个报文,那答复报文里的标识符要跟你答复的那个报文一样。在答复完成后,这个id就可以被释放重新用了。
很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCRIBE,UNSUBACK。
QoS 1的PUBLISH对应的是PUBACK,QoS 2的PUBLISH对应的是PUBCOMP,与SUBSCRIBE或UNSUBSCRIBE对应的分别是SUBACK或UNSUBACK。
记忆的诀窍就是,凡是需要答复的和答复报文,都必须有报文标识符。
3.有效载荷
这个就是通常理解的报文体了,业务数据就是在这里头。
不是所有的报文都需要有效载荷的。