MENU

MQTT协议(三)——订阅

2018 年 02 月 02 日 • MQTT协议

当客户端和服务端连接成功后,客户端需要向服务端订阅自己感兴趣的主题消息这样才能够收到消息。涉及到的报文有SUBSCRIBE,SUBSCRIBE ACK。

一、场景示意图

QQ截图20180202114738.png

二、协议简述

订阅的报文为SUBSCRIBE报文,主要包含订阅的主题、订阅的QoS等级。报文的组成如下。

  1. 固定报文头。第一个字节是控制报文标识符,紧接着的字节为报文的剩余长度,这个剩余长度是不包含固定报文头的;
  2. 消息标识符。占两个字节,分别为MSB,LSB。代表该消息的ID,之后服务端回复消息时使用该ID进行区分;
  3. 订阅的主题长度,占两个字节,分别为MSB,LSB。该字段指示着接下来主题的有多长;
  4. 主题;
  5. QoS等级。共计一个字节,第2~7位保留,必须设置为0。第0~1位代表着服务质量,且数值需要小于3。这里的QoS并不代表着最终接收到消息时的服务质量,最终的QoS由该报文中的QoS和服务端发布时的QoS的最小值决定;
  6. 如果不止订阅一个主题,那么接下来的内容仍为2~4,这代表着一次订阅可以订阅多个主题。
  7. 只订阅一个主题时报文示例(未包含固定报文头)
    QQ截图20180202114738.png
  8. 订阅两个主题时的报文示例(未包含固定报文头)
    QQ截图20180202114738.png

当接收到客户端的订阅请求报文之后,服务端需要在规定的时间内回复该报文,回复的报文为SUBSCRIBE ACK。SUBSCRIBE ACK报文较为简单,只需要回复对应订阅主题可提供的QoS等级即可。

  1. 固定报文头。第一个字节是控制报文标识符,紧接着的字节为报文的剩余长度,这个剩余长度是不包含固定报文头的;
  2. 消息标识符。占两个字节,分别为MSB,LSB。代表该消息的ID,客户端根据该消息ID来区分之前发送的SUBSCRIBE报文;
  3. 返回码。一则主题的返回码占一个字节,例如在订阅报文中订阅了三个主题,那么就会返回三个返回码。状态码的含义如下。
    0x00 - 最大QoS 0
    0x01 - 成功 – 最大QoS 1
    0x02 - 成功 – 最大 QoS 2
    0x80 - Failure 失败