一 客户端定义
MQTT客户端是指运行MQTT库并通过网络连接到MQTT broker的任何设备,这些设备可以从微控制器到成熟的服务器。 publisher 和 subscriber 都属于MQTT Client。
二 生命周期
- 建立连接
- 指定MQTT broker基本信息接入地址和端口
- 指定传输类型是TCP还是MQTT或Websocket
- 是否启用TLS,如果是则选择协议版本并携带相关证书
- broker如果启用了认证鉴权,则需要携带对应的username和password
- 配置客户端参数 如 keeplive、clean session、 MQTT协议版本、遗嘱消息(LWT)
- 订阅主题
- 指定主题过滤器Topic
- 指定服务质量 QoS
- 接受消息并处理
- 接受broker推送过来的自己订阅过得消息,并根据具体业务进行处理
- 向指定主题发布消息
- 指定目标主题Topic
- 指定消息服务质量 Qos
- 指定符合要求消息和具体内容
- 指定消息Retain保留消息标志位
- 取消订阅
- 指定取消订阅的主题Topic
- 断开连接
- 主动断开连接,将发布遗嘱消息(LWT)
- 被冻断开连接
三 发布者
当MQTT Client 连接到 broker 之后就可以发送消息了, 每条PUBLISH消息都包含一个 topic、 Payload。broker会根据topic将消息发送给感兴趣的client; Payload是真正发布的应用消息,内容及格式由应用层决定。
- PUBLISH 发布
- PUBLISH消息可以有 client 发送给 broker, 也可以由broker 发送给 client, 用来运送应用层消息。
- Qos发布服务质量标准:标记当前消息传送的交付水平,有 QoS0(最多发送一次),QoS1(最少发送一次),QoS2(正好发送一次)。
- Retain保留消息标志: 标记当前消息是否保留消息,当retain=1时,broker会存储该消息,当新的client注册订阅是,并且匹配该消息的主题(topic)时,该保留的消息会发送给订阅者。
- DUP重传标志:标记当前的PUBLISH/PUBREL消息是否为重复发送消息。
- TopicName:话题名称,标识在和的发布通道。
- 包唯一标识: 消息的唯一标识,只有QoS1 和QoS2的Publish消息中存在
- Payload(载荷:应用消息): PUBLISH消息的载荷是真正需要发布的消息,载荷的内容和格式由应用层决定,MQTT协议层不关心。 载荷的数据长度 = 固定包头中的剩余长度 - 可变报头的长度, 即载荷长度可以为零。
- 发布确认
- PUBLISH消息的接受方接受消息后需要发送确认应答,不同的服务质量应答消息不一样。
- QoS = 0: 无需确认应答。
- QoS = 1: PUBACK 消息.
- Qos = 2: PUBREC消息,PUBREL消息,PUBCOMP消息
四 订阅者
MQTT是基于发布/订阅模型的协议,在建立连接后,client可以向broker订阅感兴趣的话题。
- SUBSCRIBE 订阅
- 描述: subscribe消息由 client 发送给 broker, 用于订阅感兴趣的话题。
- 主题过滤器列表: subscribe消息的有效载荷中至少需要包含一个话题过滤器,话题过滤器由topic和QoS组成。
- SUBACK 订阅确认
- 描述: suback消息用于确认subscribe消息。
- 返回码列表:
| 返回码 | 描述 |
|---|---|
| 0x00 | 订阅成功,最大QoS 为0 |
| 0x01 | 订阅成功,最大QoS 为1 |
| 0x02 | 订阅成功,最大QoS 为2 |
| 0x80 | 订阅失败 |
- UNSUBSCRIBE 退订
- 描述: 消息由client发送给broker,用于退订不感兴趣的话题。
- 话题列表: 消息中至少需要包含一个话题。
- UNSUBACK 退订确认
- 描述: UNSUBACK消息用于确认 UNSUBSCRIBE消息。 该消息只包含一个包唯一标识(位于可变报头)。