MQTT之客户端详解

168 阅读3分钟

一 客户端定义

MQTT客户端是指运行MQTT库并通过网络连接到MQTT broker的任何设备,这些设备可以从微控制器到成熟的服务器。 publisher 和 subscriber 都属于MQTT Client。 MQTT—客户端.jpg

二 生命周期

  • 建立连接
    • 指定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消息。 该消息只包含一个包唯一标识(位于可变报头)。