http://www.blogjava.net/yongboy/archive/2014/02/09/409630.html
2014
前言
本篇会把连接(CONNECT)、心跳(PINGREQ/PINGRESP)、确认(CONNACK)、断开连接(DISCONNECT)和在一起。
CONNECT
像前面所说,MQTT有关字符串部分采用的修改版的UTF-8编码,CONNECT可变头部中协议名称、消息体都是采用修改版的UTF-8编码。前面基本上可变头部内容不多,下面是一个较为完整的CONNECT消息结构:Description76543210Fixed header/固定头部
Message Type(1)DUP flagQoS levelRETAIN
byte 10001xxxx
byte 2Remaining Length
Variable header/可变头部
Protocol Name
byte 1Length MSB (0)00000000
byte 2Length LSB (6)00000110
byte 3'M'01001101
byte 4'Q'01010001
byte 5'I'01001001
byte 6's'01110011
byte 7'd'01100100
byte 8'p'01110000
Protocol Version Number
byte 9Version (3)00000011
Connect Flags
User Name FlagPassword FlagWill RetainWill QoSWill FlagClean SessionReserved
byte 101100111x
Keep Alive timer
byte 11Keep Alive MSB (0)00000000
byte 12Keep Alive LSB (10)00001010
Payload/消息体
Client Identifier(客户端ID)1-23个字符长度,客户端到服务器的全局唯一标志,如果客户端ID超出23个字符长度,服务器需要返回码为2,标识符被拒绝响应的CONNACK消息。 处理QoS级别1和2的消息ID中,可以使用到。 必填项。
Will TopicWill Flag值为1,这里便是Will Topic的内容。QoS级别通过Will QoS字段定义,RETAIN值通过Will RETAIN标识,都定义在可变头里面。
Will MessageWill Flag若设为1,这里便是Will Message定义消息的内容,对应的主题为Will Topic。如果客户端意外的断开触发服务器PUBLISH此消息。
长度有可能为0。