在上节中( [6] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNECT消息格式分析)我们分析了CONNECT消息格式,我们知道CONNECT消息是客户端发送出去的,作为对客户端的连接请求,服务器端同样会有一个消息的返回,这个消息就是CONNACK的消息。我们在发出去CONNECT消息后,如果WireShark抓包工具依然开启的话,将会抓到类似于下面的TCP消息,其16进制为:20 02 00 00,那么其代表什么意思呢?
首先我们来看CONNACK的消息格式。CONNACK消息没有消息负载(Payload),只有消息头:2个字节的固定消息头和2两个字节的可变消息头。总共4个字节
1. 固定消息头(Fixed Header): 16进制数据为:20 02
具体的协议格式,请见下面的表1
| 
 Bit  | 
 7  | 
 6  | 
 5  | 
 4  | 
 3  | 
 2  | 
 1  | 
 0  | 
| 
 byte 1  | 
 MQTT Control Packet Type (2)  | 
 Reserved  | 
||||||
| 
 
  | 
 0  | 
 0  | 
 1  | 
 0  | 
 0  | 
 0  | 
 0  | 
 0  | 
| 
 byte 2  | 
 Remaining Length (2)  | 
|||||||
| 
 
  | 
 0  | 
 0  | 
 0  | 
 0  | 
 0  | 
 0  | 
 1  | 
 0  | 
20表示是其当前的消息类型是:CONNACK
02 表示后面将跟着2个字节.
2.可变消息头(Variable Header): 16进制数据为:00 00
具体的协议格式,请见下面的表2
| 
 
  | 
 描述  | 
 7  | 
 6  | 
 5  | 
 4  | 
 3  | 
 2  | 
 1  | 
 0  | 
| 
 连接应答标志位  | 
 保留(没有使用)  | 
 SP1  | 
|||||||
| 
 byte 1  | 
 
  | 
 0  | 
 0  | 
 0  | 
 0  | 
 0  | 
 0  | 
 0  | 
 X  | 
| 
 连接结果返回  | 
|||||||||
| 
 byte 2  | 
 
  | 
 X  | 
 X  | 
 X  | 
 X  | 
 X  | 
 X  | 
 X  | 
 X  | 
下面我们来分析其可变头的2个字节: 00 00
其中第一个00,目前没有什么特别的含义,是MQTT协议的保留字段,也许在将来的协议版本中会用到。
第二个字节的00 表示连接成功。MQTT协议对于返回的结果总共定义了6种类型(请见下面的表3): 连接接受,连接拒绝(不可接受的版本),连接拒绝(Client ID服务器不允许),连接拒绝(服务器不可达),连接拒绝(错误的用户名和密码),连接拒绝(客户端没有通过授权认证)。
| 
 值  | 
 返回的连接码  | 
 描述  | 
| 
 0  | 
 0x00 连接接受  | 
 连接接受  | 
| 
 1  | 
 0x01 连接拒绝(不可接受的版本)  | 
 服务端不支持所连接的MQTT的协议  | 
| 
 2  | 
 0x02 连接拒绝(Client ID服务器不允许)  | 
 Client ID符合UTF-8的标准,但是服务器不允许这个Client ID  | 
| 
 3  | 
 0x03 连接拒绝(服务器不可达)  | 
 MQTT 服务器不可达  | 
| 
 4  | 
 0x04 连接拒绝(错误的用户名和密码)  | 
 错误的用户名和密码  | 
| 
 5  | 
 0x05 连接拒绝(客户端没有通过授权认证)  | 
 客户端没有通过授权认证  | 
| 
 6-255  | 
 
  | 
 未来保留字段  | 
[7] MQTT,mosquitto,Eclipse Paho---MQTT消息格式之CONNACK消息分析
原文:http://blog.csdn.net/chancein007/article/details/46476601