mqtt协议详解_阿里云物联网平台使用心得(14)MQTT协议详解CONNECT可变报头

c81e7f0a11cad9d6acb6f2a8e7899a48.png

题目

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

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

1cb34ffceb682d844455e98215afa127.png

协议名构成

首先是设置协议名,看上图,协议名固定是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

c98f9c5c6b2ae43e17e3ccdee7bcd732.png

协议级别构成

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

3f396fb84daa9e6474951666fc328431.png

连接功能标志构成

然后就是设置各种功能,占用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

3cb1893f7e9bff97874ce28e4979067e.png

保活时间构成

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值