[6] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNECT消息格式分析

在“[3] MQTT,mosquitto,Eclipse
Paho---如何使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?
”一文中我已经和大家简单讲述了如何使用Eclipse
Paho MQTT
。那么当我们点击“Connect”按钮,究竟在TCP协议层发生了什么?如何通过MQTT规定的协议和TCP的二进制数据进行对比,从而更加深入的学习MQTT的消息格式呢?笔者将带领大家以CONNECT消息格式为例子,分析第一个MQTT的消息格式, MQTT的CONNECT消息主要用来在客户端和服务端建立一个TCP的通信连接,这个CONNECT的发起者肯定是客户端。因为要建立一个连接,所以客户端在这个消息里面需要提供Client ID, 如果服务端设置了用户名和密码认证,在这个消息里面必须还要包括用户名和密码的相关信息,另外如果设置了连接断开的最后遗言(Last
Will and Tesament),则在这个消息里面还必须包含和最后遗言相关的信息。

首先,在本实例中,用于连接MQTT服务器的相关配置信息如下,请大家记住下面的用于建立MQTT连接的相关信息。

同时假设大家都已经从下面的地址下载并安装了WireShark(https://www.wireshark.org/download.html)

顺便说一下,在Wireshark中,分为capture filter和Display Filer,我们只需要在WireShark软件中的capture filter 输入下面的过滤条件,则与MQTT服务交互的相关TCP的数据包就能抓取到。如下图所示意.

这个时候,我们先启动WireShark,然后点击Eclipse Paho MQTT工具的“Connect”,这个时候WireShark就能抓取下面的TCP数据包。具体的包如下:

注意当前实现的是v3.1.1的协议,请参考下面的文档

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029

(1) 固定头部(Fix head): 16进制的数据:10 1e 

表1. CONNECT 报文的固定头部(Fixed Header)格式

Bit


7


6


5


4


3


2


1


0


byte 1


MQTT Control Packet type (1)


Reserved


0


0


0


1


0


0


0


0


byte 2…


Remaining Length

10---表示发送的Connect的请求

4e---表示后面将跟着4*16+14=78个字节,这个表示剩下的78个字节,不但包括可变头部(规定是10个字节)还包括

68个负载的字节(payload)

2.可变头部的10个字节

2.1 协议字节:16进制数据为:00 04 4d 51 54 54

表2. 协议名称字节格式

Description


7


6


5


4


3


2


1


0


Protocol Name


byte 1


Length MSB (0)


0


0


0


0


0


0


0


0


byte 2


Length LSB (4)


0


0


0


0


0


1


0


0


byte 3


‘M’


0


1


0


0


1


1


0


1


byte 4


‘Q’


0


1


0


1


0


0


0


1


byte 5


‘T’


0


1


0


1


0


1


0


0


byte 6


‘T’


0


1


0


1


0


1


0


0

00  MSB(0)

04  LSB(4)

4d M

51 Q

54 T

54 T

2.2 协议级别: 16进制数据为:04

表3. 协议版本信息表:

Description


7


6


5


4


3


2


1


0


Protocol Level


byte 7


Level(4)


0


0


0


0


0


1


0


0

04 代表的是3.1.1的协议

2.3 连接信息标志位,16进制数据为:ee

表4 - 连接标志位(Connect Flag bits)

Bit


7


6


5


4


3


2


1


0


User Name Flag


Password Flag


Will Retain


Will QoS


Will Flag


Clean Session


Reserved


byte 8


X


X


X


X


X


X


X


0

ee 代表连接的flag,1110 1110--  username(1) password(1) Will Retain(1) Will QoS(01), Will(1), Clean session(1) not used(0)

2.4 心跳信息间隔,16进制数据为:00 3c

表5. 心跳时间间隔(Keep Alive)

Bit


7


6


5


4


3


2


1


0


byte 9


Keep Alive MSB


byte 10


Keep Alive LSB

00  Keep alive的时间的高位(MSB):0

3c  代表Keep alive时间的低位(LSB): 3*16+12=60

3 分隔标志: 16进制数据为:00 1e 

4.客户端ID:
16进制数据为:31 31 31 31 31 31 31 31 31 31 31 31 31 31 3131
31 31 31 31 31 31 31 31 31 31 31 31 31 31

后面的30个字节代表的是clientID(如果Will 为0,没有设置;且用户名和密码也为空,所以后面的payload里面就没有其他的信息了)

111111111111111111111111111111

5. 分隔标志: 16进制数据为:00 3c

6. Will Topic: 16进制数据为:6c 77 74

6c 77 74代表的ASCII码就是: lwt

7.分隔标志: 16进制数据为:00 0c

8. Will Message: 16进制数据为:48 65 6c 6c 6f 20 57 6f 72 6c 64 21

48 65 6c 6c 6f 20 57 6f 72 6c 64 21 代表的ASCII码就是最后遗言(Last Will Message: Hello World!

9. 分隔标志: 00 05

10. 连接的用户名(Username): 16进制数据为:61 64 6d 69 6e

61 64 6d 69 6e  代表的ASCII码就是用户名:admin

11. 分隔标志: 00 08

12. 连接的密码Password: 16进制数据为: 70 6173 73 77 6f 72 64 

70 6173 73 77 6f 72 64 代表的ASCII码就是用户名 :password

恭喜你,整个的Connect的消息格式就分析完毕了。按赖不住激动心情的你,是不是想跃跃欲试了!

下一个章节,我们将会给大家继续分享ConnAck消息格式,这个消息格式相对来说比较简单和轻松,敬请期待,谢谢.

时间: 2024-10-24 17:08:25

[6] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNECT消息格式分析的相关文章

[3] MQTT,mosquitto,Eclipse Paho---如何使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?

在上两节,笔者主要介绍了 MQTT,mosquitto,Eclipse Paho的基本概念已经如何安装mosquitto. 在这个章节我们就来看看如何用 Eclipse Paho MQTT工具来发送接收MQTT消息.Eclipse Paho MQTT工具是一个基于Java的Eclipse桌面客户端程序,其底层的和MQTT服务器进行的交互的java类库就是Eclipse Paho java库.假设我们在本机(127.0.0.1)已经启动了一个mosquitto MQTT服务器,其端口为1883.如

[2] MQTT,mosquitto,Eclipse Paho----mosquitto使用扫盲

既然要说后续系统都是围绕MQTT,mosquitto,Eclipse Paho展开,则在这里有必要先给大家简单说一下mosquitto的基本使用,扫一下盲.给大家简单介绍一下mosquitto在window系统下如何安装和启动. (1) 下载安装包 首先登录mosquitto的官方网站(http://mosquitto.org/),到下面的地址(http://mosquitto.org/download/)下载一个安装包,咱们以Window系统为例子.下载mosquitto-1.4.2-inst

[1] MQTT,mosquitto,Eclipse Paho----入门

MQTT,mosquitto,Eclipse Paho这三个单词陌生而又神秘.那么这三个单词究竟是什么意思,代表了什么技术,他们之间有关联吗?不着急,请听笔者慢慢给大家分享. (1)MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议:其主要提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),属于物联网(Internet of Thing)的一个传输协议.具体协议内容,请参考:http

[7] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNACK消息分析

在上节中([6] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNECT消息格式分析)我们分析了CONNECT消息格式,我们知道CONNECT消息是客户端发送出去的,作为对客户端的连接请求,服务器端同样会有一个消息的返回,这个消息就是CONNACK的消息.我们在发出去CONNECT消息后,如果WireShark抓包工具依然开启的话,将会抓到类似于下面的TCP消息,其16进制为:20 02 00 00,那么其代表什么意思呢? 首先我们来看CONNACK的消息格

[8] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBSCRIBE(消息订阅)消息分析

0.前言 我们在上几节的协议分析中,发送连接的请求用的是Eclipse Paho MQTT工具,那么笔者这一次改一下,咱们这次用代码来发送Subscribe的MQTT消息,请注意,下面的代码是基于Eclipse Paho Java API之上的代码,在运行下面的代码前,请先去下载Eclipse Paho Java库,其下载地址为:https://www.eclipse.org/paho/clients/java/. 下面我们正式切入正题. 1.准备步骤 (1) 首先打开WireShark软件,并

[5] MQTT,mosquitto,Eclipse Paho---MQTT消息格式分析概述

我们知道MQTT是一个物联网协议的一个规范,MQTT的协议最新的两个版本是:3.1.1和3.1.0 (1) 3.1.0的规范如下 http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html (2) 3.1.1的规范如下 http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029 规范3.1.0和3.1.1还是有

[9] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之SUBACK(消息订阅应答)消息分析

0.前言 在上一节中(MQTT消息格式之SUBSCRIBE(消息订阅)消息分析),客户端发送了订阅的消息,这个时候,服务器端收到订阅主题的MQTT消息之后,肯定需要给一个应答,这个应答信息就是SUBACK(消息订阅应答).消息订阅应答相对来说比较简单. 1.准备步骤 (1) 首先打开WireShark软件,并启动监听 (2) 在Eclipse里面运行下面的代码 [java] view plaincopy import org.eclipse.paho.client.mqttv3.MqttClie

MQTT协议实现Eclipse Paho学习总结

转载自:http://xiaoxinzhou.blog.163.com/blog/static/20704538620145411306821/ 一.概述 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放.简单.轻量.易于实现.这些特点使它适用于受限环境.例如,但不仅限于此: 网络代价昂贵,带宽低.不可靠. 在嵌入设备中运行,处理器和内存资源有限. 该协议的特点有: 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合. 对负载内容屏蔽的消息传输. 使

Paho - MQTT C Cient的实现

来自我的CSDN博客 ??在前几天,我大致了解了一下Paho C项目,并对其的一些内容进行了翻译.俗话说,光说不练假把戏,今天就给大家讲一下使用Paho的客户端库文件实现MQTT C Client的过程. 安装 ??本文是在Linux下安装的,推荐直接进行克隆并安装即可. git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c make sudo make install ??在make完之后,在paho.mqtt.