解控制报文格式是学习MQTT中,笔者认为最为重要的一个知识点。MQTT的所有行为都离不开他。控制报文可以分为三个部分组成,分别为:固定报头、可以变报头、有效载荷部分。

注意:上面的说的报文的类型。是指连接(CONNECT),发布(PUBLISH)等。而等级是指服务质量 (QoS) 。

固定报头

固定报头,从官方的说明文档指出他又边俩部分。可是还是喜欢把他说明成三个部分。如下

控制报文的类型:用于标示类型,如:连接(CONNECT)报文,发布(PUBLISH)报文等。他占了四个字节。如:连接报文对应二进制:0001。

控制报文类型的标志位:这里包含的内部比较多。分别为:标示发送重复数(DUP) (1字节) 、服务质量 (QoS) (2字节)、保留标志(RETAIN)(1字节)。同样子他也占了四个字节

剩余长度:和字面意思一样子。只是笔者看了文档说明,有一点不明白。笔者以为就是可变报头和有效载荷部分的长度。他占8个字节。

上面有讲到关于发送重复数(DUP)。这个主要是关系到服务质量 (QoS)的设置。如果只是设置为0的话,那么发送重复数(DUP)也是为0。如果当服务质量 (QoS)为1的时候,那么表示这个报文至少要发送到达一次。这个时候就会用到发送重复数(DUP)了。重送一次就在发送重复数(DUP)上面加1。如下图

服务质量 (QoS)中文翻译有些有一点怪。上面是笔者去查看一些英文根据自己的解理得来了。如果有不对的话,希望能指出来。

为了方便去理解报文格式。笔者去下载了Wireshark软件来抓一个包来看看。为什么要选择Wireshark呢?主要是他对MQTT协议显示的比较直观吧。Wireshark软件有一点要注意。他并不支持本地的抓包。所以你必须还要下载一个叫RawCap的软件。操作如下

1.下载之后,打开RawCap软件。

2.请选择  1 。回车。

3.输入对应的文件名。

上第三个中我们可以看到Packets是用于当前抓到了几个包。尽量多一点吧。因为有时候是计算自己的本身的包。差不多的时候,记得不要点击窗口的X。要用CTRL+C来结果。不然文件是空的。没有数据。

结束之后,你会得到一个文件。这个文件会在当前的RawCap.exe同目录下出现。这个时候如果你装完了Wireshark软件。只要双击他就是可以自动导入了。如下

只要输入mqtt就可以只显示关于mqtt协议的数据。现在就让我们看一个连接CONNECT报文的包。如下

图中笔者选中了固定报头,下方就是同样子选中他对应的二进制。我们可以看到是不是八个字节呢?同时上面相关的固定报文标志位的信息也显示的很明显。图中的Msg Len就是剩余长度了。其他的就是可变报头和有效载荷部分了。

上面是一个连接(CONNECT)类型的报文。连接报文的类型为1。那么对应的二进制为:0001。同时笔者设置的服务质量(QOS)为0,不保留即为0。所以固定报头就是上面显示的——00010000。至于报文类型的定义笔者上一单也提过。这里笔者就把官方的信息复制过来,以方便阅读。如下。

可变报头

可变报头,不是一定要存在的。根据不同的类型报文可变报头的内部是会发生改变的。举个列子,如连接确定(CONNACK)报文,他的可变报头只有连接确认标志和连接返回码。同时他的剩余长度一直是2。如下Wireshark抓到的显示。

最突出的不过去DISCONNECT类型的报文。可变报头是空的。如下

虽然可变报头是变化的。但是我们总元素是不会发生变化的。所以我们还是要全面的了解他到底有些什么东西。笔者根据MQTT文档说明。把所有相关的信息列出来。如下。

绿色的为用到的。红色表示没有用到的。至于每个项到底是什么作用。还是等笔者价绍相关的报文类型的时候,在说吧。

注音:图片如果看不清楚。可以放大看。

有效载荷部分

有效载荷部分。可以说是客户端和服务端之后间的通信内容。但是不是什么类型的报文都必须有。而且有效载荷部分的总信息又不是只有通信容。他有可能会出现别的信息。如:主题名(Topic Name)、客户ID(Client Identifier)等信息。笔者也列出来。如下

了解了MQTT报文的格式之后。对于我们后面学习相关的响应动作非常有帮助。希望对大家有帮助。

MQTT——控制报文格式的更多相关文章

  1. 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式

      在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...

  2. 转战物联网·基础篇08-例说MQTT协议各控制报文

      前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容. 01.CONNECT – 连接服务端   客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CO ...

  3. MQTT报文格式

    MQTT报文结构 控制报文由三部分组成: 1.Fixed header 固定报头,所有报文都包含 2.Variable header 可变报头,部分报文包含 3.Body 有效载荷,部分报文包含 固定 ...

  4. MQTT控制---connect

    连接服务端 客户端到服务端的第一个报文必须是CONNECT,且只能发送一次,发送的第二个connect报文当作违规处理并断开连接. 有效载荷包含一个或者多个编码的字段.包括客户端的唯一标识符,Will ...

  5. 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  6. ICMP Internet控制报文协议

    ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...

  7. TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议

    1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...

  8. ICMP:Internet控制报文协议

    ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...

  9. ICMP:internet 控制报文协议

    ICMP:internet 控制报文协议 1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...

随机推荐

  1. 纳税服务系统【信息发布管理、Ueditor、异步信息交互】

    需求分析 我们现在来到了纳税服务系统的信息发布管理模块,首先我们跟着原型图来进行需求分析把: 一些普通的CRUD,值得一做的就是状态之间的切换了.停用和发布切换. 值得注意的是:在信息内容中,它可以带 ...

  2. Oracle日期时间操作大全

    本文出自:http://www.cnblogs.com/hl3292/archive/2010/11/03/1868159.html oracle sql日期比较: 共三部分: 第一部分:oracle ...

  3. uvalive 3971 Assemble

    https://vjudge.net/problem/UVALive-3971 题意: 现在你要组装一台电脑,每个电脑的一种类型的配件都有多种选择,它们的名字是不同的. 现在给出已有的元件,每种类型都 ...

  4. DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法

    1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...

  5. Java中迭代器Iterator的使用

    Java集合类中Map接口下的相关类并没有像Collection接口的相关类一样实现get()方法,因此在要实现遍历输出的场景中没法直接用get()方法来取得对象中的数据,但Java本身提供了另一种遍 ...

  6. String的内存模型,为什么String被设计成不可变的

    String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源 ...

  7. php数组合并,反转,去重,添加元素等;

    //参数默认值//function abc($a,$b,$c = 0){// echo $a,$b,$c;//}//abc(1,3);//结果等于130://echo "<br> ...

  8. Vue 开发常见问题集锦

    涉及技术栈 CLI: Vue-CLI UI: Element HTML: Pug(Jade) CSS: Less JavaScript: ES6 正文: polyfill 与 transform-ru ...

  9. Nginx学习——Nginx启动、停止、重启和信号控制以及平滑升级

    1.Nginx 启动与停止 (1)启动方式 启动格式:Nginx可执行文件地址 -c Nginx配置文件地址 /etc/local/nginx/sbin/nginx -c /root/dufy/ngi ...

  10. 支持向量机SVM(一)

    [转载请注明出处]http://www.cnblogs.com/jerrylead 1 简介 支持向量机基本上是最好的有监督学习算法了.最开始接触SVM是去年暑假的时候,老师要求交<统计学习理论 ...