解控制报文格式是学习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. 《Java从入门到放弃》JavaSE入门篇:文件操作

    Java中的文件操作还有点小复杂··· 不过没关系,我会把它讲得很简单,嘿嘿嘿!!! 在讲Java中的文件操作前,先了解一个概念--"流",比如我们把一个杯子的水倒到另一个同样大小 ...

  2. 磁盘管理之inode与block

    索引式文件系统 什么是inode? Inode其实就是索引号,便于我们寻找我们文件所存储的数据块block,索引式文件系统在查找信息,读写操作上都比原来的文件系统要快,我们可以通过inode中记录的b ...

  3. String ua = request.getHeader("user-agent")---ua值为null

    最近在修改错误日志,发现总报空指针,追踪代码发现这个ua的值有时候会为null,上网查了半天也无果,按常理说ua的值不可能为null,俩小时没找到原因,只是将ua判null了一下,记录一下,如果有大虾 ...

  4. 文件的inode号操作

    linux给每个文件生成了一个唯一的inode编号,命令行下操作文件需要输入文件名,如果遇到文件名特别难输入(或者包含特殊符号)的情况,可以用inode号操作文件. 可以用这个命令查看inode号: ...

  5. ResourceManager的HA

    大家都知道在hadoop2中对HDFS的改进很大,实现了NameNode的HA:也增加了ResourceManager.但是ResourceManager也可以实现HA.你没看错,确实是Resourc ...

  6. 在有main函数的前提下 eclipse找不到主类

    有时候在测试类的时候eclipse会莫名奇妙的提示找不到主类   接下来分别有几种解决办法 1.在项目上右击> Builder Path -> Configure Build Path - ...

  7. struts1.3学习

    一.基本配置 参考博客 项目结构 web.xml <!-- struts配置 --> <servlet> <servlet-name>action</serv ...

  8. AngularJS中的DOM与事件

      前 言 AngularJS中的DOM与事件   AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令.  ng-disabled="true/false" ...

  9. appium 原理解析

    Appium是 c/s模式的appium是基于 webdriver 协议添加对移动设备自化api扩展而成的webdriver 是基于 http协议的,第一连接会建立个 session 会话,并通过 p ...

  10. java集合系列——List集合之Stack介绍(五)

    1.Stack的简介 Stack 类表示后进先出(LIFO)的对象堆栈.它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈.它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 ...