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的字符格式。