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报文的格式之后。对于我们后面学习相关的响应动作非常有帮助。希望对大家有帮助。

posted @ 2017-10-29 21:12  Aomi  阅读(14274)  评论(1编辑  收藏  举报