MQTT协议是IBM 开发的一个即时通讯协议,有可能成为物联网的重要组成部分。

今天在学习MQTT协议的基础上,概括如下:

1、首先协议要求对一些字符编码的认识,这其中有对UTF-8的认识:基本上就是由于ASCII的7位编码形式不能表示像汉语等字符,于是增加了一个字节用unicode字符表示,

       但是用unicode表示ASCII码并不是一个高效的选择,所以采用UTF-8等格式来表示。

2、MQTT控制数据包格式学习

固定包头(所有的控制包都有)

可变包头(存在于一些控制包)

payload(存在于一些控制包)

 固定包头格式:

 

           位(7~4)

位(3~0)

Byte1

MQTT控制包格式

每个MQTT控制包类型的标志位

Byte2

保留字节

byte1:

控制包格式:包括连接、连接响应、响应数据包等格式,会在下面具体道明。

每个MQTT控制包类型的标志位:协议上翻译过来的字面意思是针对之前的控制包格式,会有不同的标志位来代表它。

Byte2:

保留字节:是用来存放字节数的,包括可变包头和保留包头中的(如果有的话),但是不包括对保留字节自身译码的字节。


可变包头:

根据MQTT包类型不同,其中有一个数据包定义区域,协议规定了哪些模式必须带可变包头,哪些情况下不允许带。


Payload:

同样也是根据不同的数据包类型决定是否需要该数据区域,该包头通常作为一个MQTT数据包的结尾。

 

3、  具体类型的MQTT控制包

(1)      连接包:

    接建立后,客户端必须向服务器发送连接包,如果出现错误情况(连接断开等)服务器必须重新处理客户端第二次发来的连接包。

a.固定包头格式

Byte2是可变包头的的字节长度加上payload的长度

b.可变包头:

由四个区域组成:协议名字、协议层、连接标记、是否连接

协议名字:

采用UTF-8编码形式的“MQTT”,如果协议名字错误,服务器将会断开和客户端的连接。

协议层:

其实就是具体指的是用的哪一套协议

连接标记:标记MQTT的连接动作,服务器需要证实最后一位需要是0,否则要断开连接,具体的标记如下:


Clean session:为0继续连接,为1断开连接。

Will flag:为1准备发送,当消息发布后清0,为0就表示暂不准备发送。

 c. payload(不太清楚怎么翻译,有道的翻译是有效载荷,暂时理解为有效位)

该包头的中的数据包含一个或者多个长度确定区域,如果这些段存在,就需要按如下的顺序出现:

Client Identifier, Will Topic, Will Message, UserName, Password

                Client Identifer:客户端和服务器用来确定他们正在通过MQTT进行关联,1-23位的UTF-8的字符格式。