背景

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

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

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

在此之前

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

客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须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

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

MQTT 协议学习:003-MQTT通信流程介绍的更多相关文章

  1. MQTT 协议学习: 总结 与 各种定义的速查表

    背景 经过几天的学习与实操,对于MQTT(主要针对 v3.1.1版本)的学习告一段落,为了方便日后的查阅 本文链接:<MQTT 协议学习: 总结 与 各种定义的速查表> 章节整理 MQTT ...

  2. MQTT 协议学习:004-MQTT建立通信与 CONNECT 、CONNACK 报文

    背景 上一讲 MQTT 协议学习:通信报文的构成介绍了在MQTT通信中,各报文的通信流程:从本讲开始,我们开始介绍实际中使用的报文,以及它们的组成. CONNECT - 连接请求 报文 客户端到服务端 ...

  3. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

  4. MQTT协议学习研究 & Mosquitto简要教程(安装和使用)

    若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...

  5. MQTT 协议学习:001-搭建MQTT通信环境,并抓包测试

    背景 目的:了解MQTT 通信的有关概念与流程:方便推算某些数据与文档描述是否一致. 为了能够在保证学习质量的前提下,降低配置环境的门槛,我们将服务器搭建在windwos中,实行内网间的MQTT协议访 ...

  6. MQTT 协议学习:000-有关概念入门

    背景 从本章开始,在没有特殊说明的情况下,文章中的MQTT版本均为 3.1.1. MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议",MQTT同HTTP属于第七层 ...

  7. MQTT 协议学习: QoS等级 与 会话

    背景 QoS 等级 与 通信的流程有关,直接影响了整个通信.而且篇幅比较长,所以我觉得应该单独拎出来讲一下. 概念 QoS 代表了 服务质量等级. 设置上,由2 位 的二进制控制,且值不允许为 3(0 ...

  8. MQTT 协议学习:002- 通信报文的构成

    背景 之前工作中参与有关协议调试的时候,发现对于协议帧的解析是比较重要的. 参考:<MQTT协议 -- 消息报文格式>.<基于STM32实现MQTT>.<MQTT协议从服 ...

  9. MQTT 协议学习:008-在STM32上移植MQTT

    前言 通过前面了解MQTT有关概念.分析了有关的报文,我们对于这个协议也有了更深的认识.但纸上谈来终觉浅,绝知此事要躬行. 本文参考:<STM32+W5500+MQTT+Android实现远程数 ...

随机推荐

  1. c++ 查重+排序函数

    输入 第一行n.第二行有n个元素. 输出 查重排序后的元素 样例: 输入: 5 1 1 2 3 4 输出: 1 2 3 4 unique的作用是“去掉”容器中相邻元素的重复元素 注意:用unique只 ...

  2. Atcoder Grand Contest 039B(思维,BFS)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int col[207],s[207],n;c ...

  3. Trie图(AC自动机)总结

    AC自动机构建完成后,某个节点沿着Fail链向上能从长到短走到自己的所有后缀.一般的,遍历主串进行匹配,就是在Trie图上定向移动的过程. 构造(一遍 BFS) void build_AC() { ; ...

  4. 子元素使用position:fixed,导致他的宽度不能和父元素保持一致的解决方案

    最近在编码过程中,遇到过这样一个问题,代码如下,我们有一个父级,他有一定的宽度,在他的里面有两个子级,其中一个是绝对定位的,且要求他们的宽度都和父级保持一致,然后问题就出现了,我们会发现,有了定位的s ...

  5. 笔记-JavaScript与HTML DOM

    引用源:https://www.cnblogs.com/propheterLiu/p/5966791.html 笔记-JavaScript和HTML DOM 区别: javascript JavaSc ...

  6. 【转】bug management process

    What is Bug? A bug is the consequence/outcome of a coding fault What is Defect? A defect is a variat ...

  7. java记录5--线程

    ------------恢复内容开始------------ 1.什么叫程序:是一个严格有序的指令集合.程序规定了完成某一任务时,计算机所需做的各种操作,已经执行顺序. 特点:资源的独占性     执 ...

  8. linux 部署java 项目命令

    1:服务器部署路径:/home/tomcat/tomcat/webapps  (用FTP工具链接服务器把包上传到此目录) 2:进入项目文件夹 cd /home/tomcat/tomcat/webapp ...

  9. Linux centosVMware运行告警系统、分发系统-expect讲解、自动远程登录后,执行命令并退出、expect脚本传递参数、expect脚本同步文件、指定host和要同步的文件、shell项目-分发系统-构建文件分发系统、分发系统-命令批量执行

    一运行告警系统 创建一个任务计划crontab -e 每一分钟都执行一次 调试时把主脚本里边log先注释掉 再次执行 没有发现502文件说明执行成功了,每日有错误,本机IP 负载不高 二.分发系统-e ...

  10. luogu P2774 方格取数问题

    有限制的问题,显然考虑全选再根据限制去掉的想法较优,我们发现一个点四周的点受限,其x或者y差一,也就是说奇偶性不同,那我们可以将其分成白点和黑点,就变成了最小割的问题,将每个白点向受限制的黑点连边,c ...