MQTT——控制报文格式
解控制报文格式是学习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——控制报文格式的更多相关文章
- 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式
		
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...
 - 转战物联网·基础篇08-例说MQTT协议各控制报文
		
前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容. 01.CONNECT – 连接服务端 客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CO ...
 - MQTT报文格式
		
MQTT报文结构 控制报文由三部分组成: 1.Fixed header 固定报头,所有报文都包含 2.Variable header 可变报头,部分报文包含 3.Body 有效载荷,部分报文包含 固定 ...
 - MQTT控制---connect
		
连接服务端 客户端到服务端的第一个报文必须是CONNECT,且只能发送一次,发送的第二个connect报文当作违规处理并断开连接. 有效载荷包含一个或者多个编码的字段.包括客户端的唯一标识符,Will ...
 - 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记
		
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
 - ICMP  Internet控制报文协议
		
ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...
 - TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议
		
1.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...
 - ICMP:Internet控制报文协议
		
ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...
 - ICMP:internet 控制报文协议
		
ICMP:internet 控制报文协议 1.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...
 
随机推荐
- Python爬虫2----------运用代理访问
			
为request添加一个代理,及将浏览器头部信息加入,随机从ip列表中拿出一个ip进行访问 注意函数参数的形式,如request.proxyhandler(协议,地址) import urllib.r ...
 - 如何在CentOS上安装一个2048小游戏
			
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
 - log4j的基本使用和参数设定
			
1.简介 apache的一个开放源代码项目. 精确控制日志的输出,包括输出的格式,输出的目的地,输出的过滤(不同级别日志的输出)等. 配置简单,不需要在代码中配置环境,支持两种配置文件格式,XML和J ...
 - Spring02-AOP
			
1,动态代理,指的是通过一个代理对象创建需要的业务对象,然后在这个代理对象中统一进行各种操作. 步骤: 1)写一个类实现InvocationHandler接口: 2)创建要代理的对象 2,创建一个简单 ...
 - iOS开发-AFNetworking参数和多文件同时上传【多文件上传】
			
1. 前言 在项目开发中,我们经常需要上传文件,例如:上传图片,上传各种文件,而有时也需要将参数和多个文件一起上传,不知道大家的项目中遇到了没有,我在最近的项目中,就需要这样的一个功能:同时上传参数. ...
 - 微服务~Eureka实现的服务注册与发现及服务之间的调用
			
微服务里一个重要的概念就是服务注册与发现技术,当你有一个新的服务运行后,我们的服务中心可以感知你,然后把加添加到服务列表里,然后当你死掉后,会从服务中心把你移除,而你作为一个服务,对其它服务公开的只是 ...
 - 安装Appium
			
1.Appium官方网站:http://appium.io/ 拉到页面底端显示下面一段描述: > brew install node # get node.js > npm install ...
 - JAVA设计模式总结之23种设计模式
			
上一篇总结了设计模式的六大原则<JAVA设计模式总结之六大设计原则>,这一篇,正式进入到介绍23种设计模式的归纳总结. 一.什么是设计模式 ...
 - Hadoop 2:Mapper和Reduce
			
Hadoop 2:Mapper和Reduce Understanding and Practicing Hadoop Mapper and Reduce 1 Mapper过程 Hadoop将输入数据划 ...
 - bzoj4403(模板题)
			
序列统计,将答案转化,然后就是Lucas的模板题,用费马小定理瞎搞. #include<cstdio> #include<iostream> #include<algor ...