简介
客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文。
CONNECT报文包括了固定报头、可变报头以及有效载荷部分。
固定报头
固定报头主要由两部分组成,第一个字节已经固定是0x10;第二个字节开始是剩余长度。
补充一下剩余长度
从图中不难看出,剩余长度可理解为可变报头和有效载荷的长度之和。需要注意的是,剩余长度采用变长编码方案。对于小于128的,使用一个字节就可以表示;而大于等于128的,需要根据编码方式进行处理。
可变报头
CONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别 (Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。
协议名
协议名已经固定,共计6个字节,对应的十六进制是00 04 4D 51 54 54。
协议级别
协议级别固定为单字节0x04。
连接标志
连接标志决定了有效载荷的部分组成,这里先赋值为0xC2。也就是第7位用户名,第6位密码以及第1位清理会话位置1。
保持连接
保持连接笔者暂时取100s计算,也就是对应0x00 0x64。
有效载荷
CONNECT报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的 标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码。
根据笔者在可变报头中的连接标志设定,这里包含客户端标识符(无须设置,其必须存在)、用户名以及密码。
客户端标识符
关于UTF-8编码的补充
UTF-8格式即在字符串前面加上两个字节来表示字符串长度。
用户名
密码
通过网络调试助手连接阿里云
首先在阿里云创建产品及设备,设备创建后可以查看MQTT连接参数。
图中从上到下分别是有效载荷中的客户端ID,用户名以及密码。需要将三者转换成十六进制模式。
按照固定报头、可变报头、有效载荷的顺序,得到转换成十六进制的报文组合,需要注意部分报头需要UTF-8的格式。
笔者根据自己设备的MQTT参数,转换得到适用于自己的报文。
网络调试助手设置如下图,选择TCP Client协议,远程主机地址和端口参考阿里云设备的MQTT参数。发送格式选为hex,也就是十六进制。
发送CONNECT报文,当服务器返回的数据最后一字节为0x00时,可以视为与阿里云连接成功。
发送CONNECT报文前,设备离线
发送CONNECT报文后,设备在线