• MQTT 协议学习:003-MQTT通信流程介绍


    --- title: protocol-app-mqtt-3-how-mqtt-make-communication date: 2020-02-03 14:18:51 categories: tags: - mqtt - protocol ---

    背景

    有关博文:通信报文的构成

    上一讲说到可变头与消息体要结合不同的报文类型才能够进行分析(实际上,官方的文档的介绍顺序就是这样的)

    那么,我们就来具体看看有关的报文类型。

    在此之前

    我们捋一捋完整的通信流程,以及在这个过程中有关的报文。

    客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须CONNECT, 连接服务端报文。

    服务端发送CONNACK, 确认连接请求报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第一个报文必须CONNACK

    PUBLISH,发布消息报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。

    • 在 QoS 0 等级,没有报文 响应。
    • 在 QoS 1 等级,PUBACK, 发布确认报文是对QoS 1等级的PUBLISH报文的响应。
    • 在 QoS 2 等级,情况稍微不同:
      • PUBREC, 发布收到报文是对QoS 2等级的PUBLISH报文的响应。它是QoS 2等级协议交换的第二个报文。
      • PUBREL, 发布释放报文是对PUBREC报文的响应。它是QoS 2等级协议交换的第三个报文。
      • PUBCOMP, 发布完成报文是对PUBREL报文的响应。它是QoS 2等级协议交换的第四个也是最后一个报文。

    显然,在QoS 2 等级中,第一个报文是 PUBLISH

    客户端向服务端发送SUBSCRIBE, 订阅主题报文用于创建一个或多个订阅。为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文给客户端。SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端。

    服务端发送SUBACK, 订阅确认报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文。

    客户端发送UNSUBSCRIBE, 取消订阅报文给服务端,用于取消订阅主题。

    服务端发送UNSUBACK, 取消订阅确认报文给客户端用于确认收到UNSUBSCRIBE报文。

    客户端发送PINGREQ, 心跳请求报文给服务端的。用于确认通信对方没有断开连接。

    服务端发送PINGRESP, 心跳响应报文响应客户端的PINGREQ报文。表示服务端还活着。

    DISCONNECT, 断开连接报文是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。

    报文的简单流程图

    注意,这个流程图中关于 Qos 的时序描述细节上不够。我们会在下一章专门讲解Qos这一块的要点。

    %% 时序图 sequenceDiagram participant 发布者 participant 服务器 participant 订阅者 Note right of 发布者: 发布者主动连接-> 发布者 ->> + 服务器: CONNECT 服务器 -->> - 发布者: CONNACK Note left of 订阅者: <-订阅者主动连接 订阅者 ->> + 服务器: CONNECT 服务器 -->> - 订阅者: CONNACK par Note right of 发布者: 心跳 发布者 ->> 服务器: PINGREQ 服务器 -->> 发布者: PINGRESP and 订阅者 ->> 服务器: PINGREQ 服务器 -->> 订阅者: PINGRESP end Note right of 发布者: 发布消息(Qos 0) 发布者 ->> + 服务器: PUBLISH Qos0 Note left of 订阅者: 收到消息(Qos 0) 服务器 ->> - 订阅者: PUBLISH Qos0 Note right of 发布者: 发布消息(Qos 1) 发布者 ->> + 服务器: PUBLISH Qos1 服务器 -->> - 发布者: PUBACK Qos1 Note left of 订阅者: 接收消息(Qos 1) 服务器 ->> + 订阅者: PUBLISH Qos1 订阅者 -->> - 服务器: PUBACK Qos1 Note right of 发布者: 发布消息(Qos 2) 发布者 ->> 服务器: PUBLISH Qos2 服务器 -->> 发布者: PUBREC Qos2 发布者 ->> 服务器: PUBREL Qos2 服务器 -->> 发布者: PUBCOMP Qos2 Note right of 发布者: 接收消息(Qos 2) 服务器 ->> 订阅者 : PUBLISH Qos2 订阅者 -->> 服务器: PUBREC Qos2 服务器 ->> 订阅者: PUBREL Qos2 订阅者 -->> 服务器: PUBCOMP Qos2 par Note right of 发布者: 断开连接 发布者 ->> 服务器: DISCONNECT and 订阅者 ->> 服务器: DISCONNECT end

    对于报文类型以及通信的流程有了一个初步的认识以后,下一步的学习就容易很多了

  • 相关阅读:
    U3D开发中关于脚本方面的限制-有关IOS反射和JIT的支持问题
    APP发行渠道
    在WINDOWS上开发IOS应用的方法
    如何安全的在不同工程间安全地迁移asset数据?三种方法
    UNITY 的GC ALLOC到底是什么
    Dictionary,hashtable, stl:map有什么异同?
    如何成为一个优秀的高级C++程序员
    两点间所有路径的遍历算法
    技术人员的未来:做技术还是做管理?
    技术人员如何去面试?
  • 原文地址:https://www.cnblogs.com/schips/p/protocol-app-mqtt-3-how-mqtt-make-communication.html
Copyright © 2020-2023  润新知