解控制报文格式是学习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. linux c函数指针的应用

    头文件:1.h #include<stdio.h> int nul_func(); int test1(int a,int b); int test2(int a,int b,int c) ...

  2. Project Euler:Product-sum numbers (problem 88) C++

    A natural number, N, that can be written as the sum and product of a given set of at least two natur ...

  3. geotrellis使用(三十三)关于Geotrellis读取Geotiff的两个细节

    前言 在上两篇文章中我介绍了如何直接将Geotiff(一个或者多个)发布为TMS服务.这中间其实我遇到了一个问题,并且这个问题伴随Geotrellis的几乎所有使用案例,下面我进行详细讲述. 一.问题 ...

  4. Zabbix通过SNMP监控多核CPU使用率时, 计算CPU平均使用率

    环境:没有Agent,只能通过SNMP监控时,需要获取多核CPU的平均使用率. ZABBIX的使用SNMP监控CPU使用率时,由于设备都是多核CPU,监控的都是单独某一核心的使用率,但单独某一核使用率 ...

  5. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

  6. PHPFastCGI进程管理器PHP-FPM详解

    PHP-FPM是一个PHPFastCGI进程管理器,是只用于PHP的.      PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将它patch到你的PH ...

  7. JAVA多线程--Thinking in java

    聊聊并发:http://ifeve.com/java-concurrency-thread-directory/ 阻塞状态: sleep  可中断利用 interrupt方法 wait IO  不可中 ...

  8. SSM之框架整合

    前言 SSM框架,即Spring + Spring MVC + MyBatis的整合框架集,是继SSH后比较主流的Java EE企业级框架,采用标准的MVC模式,项目结构与微软的ASP.NET MVC ...

  9. JSP入门3 Servlet

    需要继承类HttpServlet 服务器在获得请求的时候会先根据jsp页面生成一个java文件,然后使用jdk的编译器将此文件编译,最后运行得到的class文件处理用户的请求返回响应.如果再有请求访问 ...

  10. 【充分利用你的Azure】将Azure用作云计算平台(1)

    本文将围绕几个步骤来讲. 因为本人是MSP,微软送了150刀的额度给我随便使用.这篇文章是要讲将Azure用作云计算平台,对于我来说,我是做机器学习的,那么Azure就要有机器学习的平台. 本文的目的 ...