MQTT协议14种报文分析.docx
- 文档编号:9479644
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:23
- 大小:917.91KB
MQTT协议14种报文分析.docx
《MQTT协议14种报文分析.docx》由会员分享,可在线阅读,更多相关《MQTT协议14种报文分析.docx(23页珍藏版)》请在冰点文库上搜索。
MQTT协议14种报文分析
MQTT协议14种报文分析
实习报告
课程名称:
实习题目:
专业班级:
学生姓名:
学号:
实习成绩:
指导教师签名:
年月日
实习时间实习地点实习学时
实习目的
学习MQTT协议,对各个MQTT报文进行协议分析。
学习java语言的socket编程基础,利用paho库实现MQTT客户端程序。
实习内容
利用相关工具捕获MQTT协议的相关报文,分析MQTT协议的14种报文。
学会直接构造MQTT报文,完成通信,并理解回调机制
实习要求
记录MQTT实验过程、截图分析并说明
利用socket直接构造MQTT报文,完成与服务器进行通信,实现连接服务器、订阅主题、发送消息等功能。
利用paho库实现MQTT客户端,实现所有功能,并理解回调机制
实习主要设施设备
装有WiresharkPortable、paho、mosquitto、npcap、jdk-8u112-windows-i586等程序的PC机一台
实习成果
对MQTT协议有了一定的认识,知道如何分析各种报文。
对MQTT协议编程有了一定的基础和了解。
实习报告
1引言
1.1系统概述
MQTT协议的分析与编程实验
1.2需求分析
基于轻量级代理的发布/订阅协议,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),属于物联网的一个传输协议。
设计思想是开放、简单、轻量、易于实现。
1.3运行环境
装并打开mosquitto服务器;安装MQTT客户端EclipsePahoMQTT;安装npcap;安装WiresharkPortable协议分析软件;安装jdk;Window7系统。
构造服务器环境。
2协议分析实验
2.1实验准备
实验环境:
JDK环境
实验方法及步骤:
1.MQTT服务器端mosquitto
(1)下载并安装mosquitto
(2)确认安装完后,所有所有的程序都安装在这个目录下,C:
\ProgramFiles(x86)\mosquitto。
如果你不想在其他的操作系统上也执行安装程序,把C:
\ProgramFiles(x86)\mosquitto这个文件夹拷贝到任何路径
(3)进入d:
\mosquitto,输入下面的命令,
cdd:
\mosquitto
mosquitto-p1883-v
p代表当前的mosquitto服务实例启动以后,其监听端口号,这个配置的覆盖-cconfigfile]指定的配置文件中的端口
-v代码调试模式(verbose)可以输出更多的信息
2.MQTT客户端EclipsePahoMQTT
1)下载解压缩后,双击paho.exe,打开后的对界面如下
(2)点击上图中的十字图标,就能新建一个MQTT的客户端的连接,输入正确的MQTT服务端的连接地址,
(3)这个时候我们就能订阅消息了。
选择“Subscription下方”的绿色十字图标,就可以输入订阅的主题(topic)的名字,比如我们设置主题名称为“test,”并点击“Subscribe按”钮
(4)往MQTT服务发送一条某一主题的MQTT消息。
然后点击“Publish按”钮,这个时候,我们就能看到消息已经发送成功,且在步骤(3)订阅的同一主题也收到了消息。
3.安装和使用协议分析软件wireshark
(1)安装WiresharkPortable_2.2.1.paf.exe
(2)捕获MQTT协议报文
(3)在Wireshark中,分为capturefilter和DisplayFiler,我们只需要在WireShar软件中的capturefilter输入下面的过滤条件,则与MQTT服务交互的相关TCP的数据包就能抓取到。
如下图所示意.
WireShark,然后点击EclipsePahoMQTT工具的
这个时候,我们先启动
Connect,”这个时候WireShark就能抓取下面的TCP数据包。
2.2主要实验步骤
操作:
按照“MQTT-3.1.1-CN”文档各种报文的实现方法依次实现,抓包结果截图,结合参考文档分析实验结果。
结果:
如下各图所示
分析说明:
固定报头:
00010000其中MQTT报文控制类型0001,保留位0000剩余长度字段:
为16进制的1c,表示剩余长度等于可变报头的长度(10字节)加上有效载荷的长度为28。
可变报头:
CONNECT报文的可变报头按下列次序包含四个字段:
协议名(ProtocolName),协议级别(ProtocolLevel),连接标志(ConnectFlags)和保持连接(KeepAlive)
协议名字节构成:
00044d515454,表示长度为4的“MQTT”协议名称协议级别字节构成:
04,对于3.1.1版协议,协议级别字段的值是4(0x04)。
连接标志:
02,对应2进制00000010,服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。
清理会话位置为连接标志字节的第1位,清理会话标志被设置为1,客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。
遗嘱标志位置为连接标志的第2位,遗嘱标志被设置为0,连接标志中的WillQoS和WillRetain字段必须设置为0,并且有效载荷中不能包含WillTopic和WillMessage字段,网络连接断开时,不能发送遗嘱消息。
遗嘱QoS位置为连接标志的第4和第3位。
这两位用于指定发布遗嘱消息时使用的服务质量等级,因为此例遗嘱标志位置被置0,所以0,遗嘱QoS也必须设置为0(0x00)遗嘱保留位置为连接标志的第5位。
遗嘱标志被设置为0,遗嘱保留(WillRetain)标志也必须设置为0用户名标志位置为连接标志的第7位。
此例用户名标志被设置为0,有效载荷中不能包含用户名字段密码标志位置为连接标志的第6位。
因为此例用户名标志被设置为0,密码标志也必须设置为0保持连接:
保持连接字节为003c,其中保持连接KeepAliveMSB为00,保持连接KeepAliveLSB为3c有效载荷:
00107061686f3837323238353532313934,3其中表示随后长度为16,此例有效载荷只有客户端标识符即paho872285521941
2.CONNACK–确认连接请求
以Q0S=1为例:
固定报头:
00110010,其中MQTT报文控制类,0011,保留位0010,重发标志位
置为第1个字节,第3位,DUP=0,表示这是客户端或服务端第一次请求发送这
个PUBLISH报文。
服务质量等级位置为第1个字节,第2-1位,QoS=01,表示至少分发一次。
保留标志位置为第1个字节,第0位,例图中为0.剩余长度字段:
为16进制的0a,表示可变报头的长度。
表示可变报头的长度加上有效载荷的长度为10.
可变报头:
为16进制的00033131300006313233,0003表示主题长度为3,313130即主题名110,0006为报文标识符,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的06,313233为发布内容123有效载荷:
有效载荷包含将被发布的应用消息。
数据的内容和格式是应用特定的。
有效载荷的长度这样计算:
用固定报头中的剩余长度字段的值减去可变报头的长度。
包含零长度有效载荷的PUBLISH报文是合法的。
此例的有效载荷即为零长度。
4.PUBACK–发布确认
分析说明:
固定报头:
01000000,其中MQTT报文控制类,0100,保留位0000剩余长度字段:
为16进制的02,表示可变报头的长度。
对PUBREL报文这个值等于2.
可变报头:
为16进制的0006,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的06
有效载荷:
PUBACK报文没有有效载荷。
5.PUBREC–发布收到QoS2第一步
分析说明:
固定报头:
01010000,其中MQTT报文控制类,0101,保留位0000剩余长度字段:
为16进制的02,表示可变报头的长度。
对PUBREL报文这个值等于2.
可变报头:
为16进制的0007,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的07
有效载荷:
PUBREC报文没有有效载荷。
6.PUBREL–发布释放QoS2第二步
分析说明:
固定报头:
01100010,其中MQTT报文控制类,0110,保留位0010剩余长度字段:
为16进制的02,表示可变报头的长度。
对PUBREL报文这个值等于2.
可变报头:
为16进制的0007,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的07
有效载荷:
PUBREL报文没有有效载荷。
分析说明:
固定报头:
01110000,其中MQTT报文控制类,0111,保留位0000剩余长度字段:
为16进制的02,表示可变报头的长度,对PUBCOMP报文这个值等于2。
可变报头:
为16进制的0007,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的07
有效载荷:
PUBCOMP报文没有有效载荷。
8.SUBSCRIBE-订阅主题
分析说明:
固定报头:
10000010,其中MQTT报文控制类,1000,保留位0010剩余字段长度:
为16进制的08,表示可变报头的长度(2字节)加上有效载荷的长度为8
可变报头:
为16进制的0001,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的01
有效载荷:
为16进制的000331313000,其中MSB为00,LSB为03,主题过滤为313130即110,00表示服务质量等级QoS为0。
9SUBACK–订阅确认
分析说明:
固定报头:
10010000,其中MQTT报文控制类,1001,保留位0000
剩余长度字段为16进制的03,表示可变报头的长度加上有效载荷的长度为3可变报头:
为16进制的0001,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的01
有效载荷:
为16进制的00,对应2进制即为返回码00000000,返回码值为0x00-最大QoS0
10UNSUBSCRIBE–取消订阅
分析说明:
固定报头:
10100010其中MQTT报文控制类型1010,保留位0010剩余长度字段为16进制的07,表示可变报头的长度加上有效载荷的长度为7可变报头:
16进制的0002,其中报文标识符MSL为16进制的00,报文标识符LSB为16进制的02
有效载荷:
16进制的0003313130,其中0003表示想要取消订阅的主题长度为3,想要取消的主题为313130即110。
11UNSUBACK–取消订阅确认
分析说明
固定报头
11000000,其中MQTT报文控制类型1100,保留位00000
可变报头
PINGREQ报文没有可变报头。
有效载荷
PINGREQ报文没有有效载荷。
13PINGRESP
心跳响应
分析说明固定报头可变报头有效载荷
11010000,其中MQTT报文控制类,1101,保留位0000
PINGRESP报文没有可变报头。
PINGRESP报文没有有效载荷。
14DISCONNECT–断开连接
分析说明:
固定报头:
11100000,其中MQTT报文控制类型1110,保留位0000可变报头:
DISCONNECT报文没有可变报头。
有效载荷:
DISCONNECT报文没有有效载荷。
2.3思考与总结
1.说明paho和mosquitto的作用,它们与发布/订阅模式的关系。
Paho是MQTT服务器客户端,Mosquitto是MQTT服务器端,助paho和mosquitto均可作为MQTT服务器的实现,可实现发布/订阅模式
2.MQTT中变长字段有哪些?
接收端如何判断变长字段结束?
MQTT中变长字段有剩余长度,当剩余长度字段的标志位为0时表示变长字段结束。
3.构造、捕获并分析带有客户端标识符,遗嘱主题,遗嘱消息,用户名,密码的Connect消息。
4.
固定报头:
00010000报文控制类型0001,保留位0000
剩余长度字段:
为16进制的32,表示剩余长度等于可变报头的长度(10字节)加上有效载荷的长度为50.
可变报头:
CONNECT报文的可变报头按下列次序包含四个字段:
协议名
(ProtocolName),协议级别(ProtocolLevel),连接标志(ConnectFlags)和保持连接(KeepAlive)
协议名字节构成:
00044d515454,表示长度为4的“MQTT”协议名称协议级别字节构成:
04,对于3.1.1版协议,协议级别字段的值是4(0x04)。
连接标志:
c6,对应2进制11000110,服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。
清理会话位置为连接标志字节的第1位,清理会话标志被设置为1,客户端和
服务端必须丢弃之前的任何会话并开始一个新的会话。
遗嘱标志位置为连接标志的第2位,遗嘱标志被设置为1,表示如果连接请求被接受了,遗嘱(WillMessage)消息必须被存储在服务端并且与这个网络连接关联。
之后网络连接关闭时,服务端必须发布这个遗嘱消息,除非服务端收到DISCONNECT报文时删除了这个遗嘱消息。
且连接标志中的WillQoS和WillRetain字段会被服务端用到,同时有效载荷中必须包含WillTopic和WillMessage字段。
遗嘱QoS位置为连接标志的第4和第3位。
这两位用于指定发布遗嘱消息时使用的服务质量等级,因为此例遗嘱标志位置被置0,所以0,遗嘱QoS也必须设置为0(0x00)
遗嘱保留位置为连接标志的第5位。
此例遗嘱保留被设置为0且遗嘱标志被设置为1,服务端必须将遗嘱消息当作非保留消息发布。
用户名标志位置为连接标志的第7位。
此例用户名标志被设置为1,有效载荷中必须包含用户名字段。
密码标志位置为连接标志的第6位。
此例密码标志被设置为1,有效载荷中必须包含密码字段
31
保持连接:
保持连接字节为003c,其中保持连接KeepAliveMSB为00,保持连接KeepAliveLSB为3c
有效载荷:
00127061686f31303535343735353035373738300003313000033131300003313130000331313,0其中0012表示随后客户端标识符长18个字节即paho0554********,接着0003表示随后的遗嘱主题长3个字节即110,接着0003表示随后的遗嘱消息长3个字节即110,接着0003表示随后的用户名长3个字节即110,接着0003表示随后的密码长3个字节即110
5.构造、捕获并分析订阅多个不同Qos级别的主题Subscribe消息。
同时订阅QoS级别分别为0、1、2的消息。
①三种方式固定头部的前两个字节均为:
82表示为请求订阅;②Qos表示字段仅仅跟着Topic字段之后,16进制代码为:
000110表示
为012三种情况
6.
构造、捕获并分析长度大于127字节的报文
TCP报文;
①当出现大于127字节的报文时,会在PUBLISH后出现几个②TCP报文的数据内筒不一样,但序号相同。
6.构造、捕获并分析Qos=1和Qos=2时丢包的处理情况
以上是QoS=2
7.学习3种QoS消息的特性,通过实验填写下表内容
发布消息的QoSTopic订阅的QoS接收消息的QoS
0
0
0
0
1
0
0
2
0
1
0
0
发布消息的QoSTopic订阅的QoS接收消息的QoS
1
1
1
1
2
1
2
0
0
2
1
1
2
2
2
3协议编程实验过程
3.1实验准备实验环境:
JDK环境实验方法及步骤:
1.安装JDk
2.安装eclipse
3.打开paho软件
4.在eclipse中调试JAVA软件
3.2主要实验步骤
1.安装JAVA编程环境
2.下载pahoMqttclient.Jar包
3.利用socke直接构造MQTT报文,完成与服务器进行通信,实现连接服务器、订阅主题、发送消息等功能。
4.利用paho库实现MQTT客户端,实现所有功能,并理解回调机制。
5.
结果
②作为服务器端
回调机制:
SimpleMqttClient类实现MqttCallback接口
SimpleMqttClient类中包含一个MqttClient的引用myClient
MqttClient类有一个参数为setCallback的方法
SimpleMqttClient的对象smc调用runClient方法
然后myClient就可以在setCallback中调用SimpleMqttClient的this方法回调方法是把功能定义和功能实现分离的一种手段,是一种松耦合的设计思想。
同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口。
3.3思考与总结
了解了java语言的socket编程基础,学会了利用paho库实现MQTT客户端程序。
心得与体会
通过几天的实训了解了MQTT协议对在物联网专业的应用,利用相关工具捕获MQTT协议的相关报文,学习了如何分析MQTT协议中14种报文。
知道如何用paho库实现MQTT客户端程序。
让我对物联网有了新的认识。
参考文献
[1]皮德常.c++程序设计教程.机械工业出版社.2013
[2]陈锐.Java程序设计.机械工业出版社.2011
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MQTT 协议 14 报文 分析