MQTT协议浅析和测试

MQTT是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

搭建

由于我使用的windows环境(主要是懒哈哈),所以使用mosquitto库,该库的windows搭建很简单,官网下载安装包(官网地址),安装好就行。
唯一存在的问题是,安装好后还缺三个动态库,否则无法工作。我在电脑里搜索,正好电脑里面有。如果没有可以百度下载。
MQTT协议浅析和测试_第1张图片

搭建成功

一 打开服务 mosquitto.exe

二 开启一个订阅客户端mosquitto_sub

MQTT协议浅析和测试_第2张图片

三 开启一个发布客户端 mosquitto_pub

MQTT协议浅析和测试_第3张图片

四 订阅客户端接收到数据,成功

MQTT协议浅析和测试_第4张图片

MQTT协议测试

MQTT协议参考此处(参考)

总体

MQTT格式由1字节的固定报头,1到4字节的可变长剩余长度,N字节的可变报头以及N字节的有效载荷构成。 固定报头和剩余长度为必须存在的。

剩余长度编码

它将一个字节划分为延续位和有效位,延续位为最高位,当延续位为1 代表长度大于等于128,后面的字节为共有多少个128.。
而有效位由于只有7位只能表示127个数据。故它为 N* 128+有效位
如:
0000 0010(b)表示为长度2
1000 0000 0000 0010(b)表示为长度128 * 2+0
1000 0001 0111 1111(b) 表示为长度 1+128 * 127
三字节,四字节同理

一 连接请求

MQTT协议浅析和测试_第5张图片

连接标志

在这里插入图片描述

清理会话 Clean Session

这个二进制位指定了会话状态的处理方式。置为0,可以简单理解为,若连接关闭后进行连接,服务器能保留之前的会话状态和未收到的QOS0的订阅消息。(具体查看参考)

遗嘱标志 Will Flag

设置为1,可以理解为,当连接断开后,服务会发布该遗嘱消息。。。。当然在DISCONNECT报文中可以删除这个遗嘱消息

遗嘱QoS Will QoS

设置遗嘱的QOS 当置为0时候 QOS必须为0,当置为1时候, QOS可以为0 1 2

用户名标志 User Name Flag

置为1则有效载荷中必须有用户名

密码标志 Password Flag

置为1则有效载荷中必须有密码,用户名为0 则密码必须为0

有效载荷

有效载荷必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码 ,客户端标识符为必须有,其他可以不存在
字段结构
MQTT协议浅析和测试_第6张图片

客户端标识符 ClientId

客户端标识符 (ClientId) 必须存在而且必须是CONNECT报文有效载荷的第一个字段。
服务端使用客户端标识符 (ClientId) 识别客户端。连接服务端的每个客户端都有唯一的客户端标识符(ClientId)。客户端和服务端都必须使用ClientId识别两者之间的MQTT会话相关的状态

连接响应

MQTT协议浅析和测试_第7张图片

当前会话标志

如果服务端收到清理会话(CleanSession)标志为1的连接,则当前会话置零
如果服务端收到一个CleanSession为0的连接,如果服务端已经保存了会话状态,则当前会话标志设置为1 。如果服务端没有已保存的会话状态,则当前会话设置为0。
如果服务端发送了一个包含非零返回码的CONNACK报文,它必须将当前会话标志设置为0

连接返回码

MQTT协议浅析和测试_第8张图片
如果认为上表中的所有连接返回码都不太合适,那么服务端必须关闭网络连接,不需要发送

测试连接

MQTT协议浅析和测试_第9张图片

MQTT协议浅析和测试_第10张图片

断开连接

发送断开连接报文,将不会发送遗嘱。
MQTT协议浅析和测试_第11张图片

测试断开连接

没有响应报文
在这里插入图片描述

心跳请求

MQTT协议浅析和测试_第12张图片

心跳响应

MQTT协议浅析和测试_第13张图片

订阅请求

MQTT协议浅析和测试_第14张图片

报文标识符

一个两字节的非零报文标识符字段,高位(MSB)低位(LSB)用于标识报文是新的控制报文还是重发的控制报文。

主题过滤器

由订阅主题长度和主题构成,订阅主题长度共两字节,比如 订阅 “test” 则 ‘0’ ‘4’ ‘t’ ‘e’ ‘s’ 't’

服务器质量要求

决定订阅主题的QOS,主题过滤器+服务质量为一个组,一个报文可以由多个组,也就是一个报文可以订阅多个主题。

订阅响应

MQTT协议浅析和测试_第15张图片

有效载荷

返回各个主题的最大QOS,一个主题占用一个字节

测试订阅

订阅tiemo 和小哥 两个主题的请求报文
MQTT协议浅析和测试_第16张图片
订阅tiemo 和小哥 两个主题的响应报文

MQTT协议浅析和测试_第17张图片

取消订阅请求

MQTT协议浅析和测试_第18张图片
参考订阅请求

取消订阅响应

MQTT协议浅析和测试_第19张图片

发布请求

MQTT协议浅析和测试_第20张图片

重发标志

如置为0,表示这是第一次发送。如果设置为1,表示是重发。

服务质量等级QOS

0:只发一次,不能保证订阅者一定能收到这次的发布消息
1:至少发一次,保证订阅者一定能收到这次发布,但不保证收到多次重复发布消息
2:保证收到且为唯一一次。(损耗性能)

保留标志RETAIN

置为1,服务器将保留存储发布的消息和QOS,当有新的订阅时候,服务器将主动发送该消息。

注意

发布报文不支持发送多组主题的消息,所以有效载荷数据为该主题对应的消息,消息长度为剩余长度减去可变报头长度。

发布响应(QOS1)

对于QOS为0的发布报文,是没有响应报文的,类似于UDP。
MQTT协议浅析和测试_第21张图片

发布收到1(QOS2)

MQTT协议浅析和测试_第22张图片

发布释放2(QOS2)

MQTT协议浅析和测试_第23张图片

发布完成3(QOS2)

MQTT协议浅析和测试_第24张图片

测试发布

MQTT协议浅析和测试_第25张图片

你可能感兴趣的:(杂类)