MQTT协议(一)——协议介绍与控制报文格式

一、协议介绍

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.有效载荷

这个就是通常理解的报文体了,业务数据就是在这里头。

不是所有的报文都需要有效载荷的。

原文地址:https://www.cnblogs.com/pandaNHF/p/14102538.html