EMQ云平台常用的协议有哪些 云平台mqtt协议_用户名

题目



大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。超子今天详解第1个CONNECT报文,我们继续往下说说CONNECT报文的可变报头

可变报头用于设置各种功能,超子在《阿里云物联网平台使用心得(12)MQTT协议CONNECT报文简介》 一文中介绍过,总共占用10个字节。我们一个一个看。




EMQ云平台常用的协议有哪些 云平台mqtt协议_用户名_02

协议名构成



首先是设置协议名,看上图,协议名固定是MQTT,大家可能会有疑问,协议名MQTT不是4个字节吗?怎么上图用了6个字节,这个要着重说一下,报文中每个字符串前要加入2个字节,这2个字节的作用就是表示该字符串的长度,以方便通信双方解析数据,举个例子大家就知道了。

通过前面文章的介绍,我们现在知道负载会传递客户端ID、用户名和密码这3个信息,我们先假设

客户端ID是:khdyhm

用户名是:yhmmm

密码是:mm3355tgh

如果我们直接把khdyhmyhmmmmm3355tgh发给阿里云,结果显而易见,这啥也区分不出来啊。所以我们必须在每个字符串前加上2个字节,表示长度 ,0x00 0x06 khdyhm 0x00 0x05 yhmmm 0x00 0x09 mm3355tgh,这样一来服务器会先看0x00 0x06这2个字节,一看是6,好的明白了,往后的6个字节是客户端ID,然后6个字节之后,又看到了0x00 0x05,好的后面5个字节是用户名,然后5个字节之后,又看到了0x00 0x09,好的后面9个字节是密码,这样一来就能区分出各个字符串的内容了。

通过上面的例子,我们就知道为什么MQTT之前要多两个字节0x00 0x04了。我们要注意一点,给阿里云发报文的时候,为了方便做实验我们采用16进制,所以把字符串MQTT换成16进制就是0x4D 0x51 0x54 0x54,那么协议名我们搞定了,现在可变报头是0x00 0x04 0x4D 0x51 0x54 0x54




EMQ云平台常用的协议有哪些 云平台mqtt协议_16进制_03

协议级别构成



接下来是协议级别,看上图,协议级别就一个字节0x04,现在可变报头是 0x00 0x04 0x4D 0x51 0x54 0x54 0x04




EMQ云平台常用的协议有哪些 云平台mqtt协议_16进制_04

连接功能标志构成



然后就是设置各种功能,占用1个字节。这些功能在《阿里云物联网平台使用心得(12)MQTT协议CONNECT报文简介》一文中介绍过,如果大家忘了可以返回去看看。

(1)Bit0没有用,固定是0

(2)Bit1是清理会话功能设置:阿里云不支持等级2,而且用的多了你会发现,阿里云的一些官方开发工具用的都是等级0,清零会话功能是针对等级1和等级2的,所以我们不用它,设置为1,表示使用清理会话功能,不保留离线消息。

(3)Bit2/3/4/5是遗嘱相关功能,阿里云不支持,所以都是0

(4)Bit6是否验证用户名,阿里云不支持匿名登录,所以是1

(5)Bit7是否验证密码,阿里云不支持匿名登录,所以是1

最终byte8就是0xC2 ,那么现在可变报头是 0x00 0x04 0x4D 0x51 0x54 0x54 0x04 0xC2




EMQ云平台常用的协议有哪些 云平台mqtt协议_EMQ云平台常用的协议有哪些_05

保活时间构成



最后两个字节是保活时间,前面的文章介绍过,阿里云支持的范围是30~1200秒,那超子就选个100秒吧,换成16进制就是0x00 0x64

最终可变报头的10个字节就是 0x00 0x04 0x4D 0x51 0x54 0x54 0x04 0xC2 0x00 0x64

可变报头超子就给大家介绍到这,下次超子要介绍CONNECT报文中的负载部分了,下次再见吧。