MQTT协议-CONNECT报文介绍
参考MQTT协议中文笔记:https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html
Connect报文主要用于客户端连接服务器的,未涉及具体数据的传输,可以使用网络调试助手来连接阿里云平台,用十六进制格式发送这一串报文,来连接平台上的一个设备,使其显示在线
阿里云平台名词解释
CONNECT控制报文
报文由固定报头+可变报头+有效载荷组成,这个格式适合MQTT的大部分协议
在单片机中要发送CONNECT报文,需要转为十六进制再发送,下面是假设要发送的数据
固定报头
固定报头一般由两个字节组成,byte1和byte2
byte1的高4位为MQTT报文类型,低4位为用于指定控制报文类型的标志位
byte2为剩余长度,暂时不知
报文类型
可变报头
可变报头由协议名(Procotol Name)+协议级别(Procotol Level)+连接标志(Connect Flags)+保持连接(keep Alive)四个部分组成
1、协议名
已经固定好是MQTT,byte1和byte2表示协议名长度,为4个字节
2、协议级别
也已经固定好,十六进制为04
3、连接标志
占一个字节,只有最低位固定为0,其他位不固定,像用户名称User Name和密码Password这些一般都要的,所以可预设为1,则二进制可表示如下,转为十六进制是C2
4、保持连接
占两个字节,假如设置为100秒,则十六进制为00 64
可变报头的字符组合起来,则就为 00 04 4D 51 54 54 04 C2 00 64 ,共十个字节,基本固定
有效载荷
有效载荷由客户端标识符(Client Identifier)+用户名(User Name)+密码(Password)组成
设备名称和ProductKey可以在云平台的设备里获得,如
将设备名和ProductKey直接代入,可得
客户端ID:
用户名:
密码:
密码需要经过哈希加密,在线加密平台:http://encode.chahuo.com/
粘贴密码字符串后,点击HmacSHA1加密,需要输入密钥,该密钥可在云平台设备的三元组信息里获得
客户端ID进行发送要转为十六进制,需要在头部加上数据的长度,因为官方规定用户名必须是UTF-8编码字符串,而UTF-8编码规定:每一个字符串都有一个两字节的长度字段作为前缀,因此客户端ID头部加上的是 00 27,而不是单单的27
将客户端ID、用户名和密码组合在一起,就得到了如下的数据,这是有效载荷的部分
将固定报头、可变报头和有效载荷组合在一起
整理过后就还有固定报头的剩余长度没有数据
剩余长度有复杂的规定,会出文章单独介绍,但这里可以简单的认为是该位置后面有多少个字节长度,经过计算,后面共有112个字节,转为十六进制是70,因此剩余长度可以填70,这样,Connect报文就组装好了,可通过此报文与阿里云平台连接