基于阿里云的MQTT协议入门三:CONNECT报文

在学习本章内容之前,需要记录一下内容
ProductKey
DeviceName
DeviceSecret
内容如下
在这里插入图片描述

从MQTT控制报文的结构里我们可以看出,CONNECT的数据是从客户端到服务器的,描述为客户端请求连接服务器
格式为:固定报头+可变报头
可变报头又包含 协议名,协议级别,连接标志,清理会话,遗嘱标志,遗嘱QoS,遗嘱保留,用户名标志,密码标志和连接时间

固定报头为 0x10+data len
在这里插入图片描述
其中10表示为CONNECT
data len 为后面跟的数据的总长
后面跟的数据为可变报文

协议名:
协议名的报文如下

说明
协议名
byte 1长度MSB(0)
byte 2长度LSB(4)
byte 3‘M’
byte 4‘Q’
byte 5‘T’
byte 6‘T’

转化为16进制为 00 04 4D 51 54 54
协议级别为4
在这里插入图片描述
转化为16进制为 04
连接标志位如下
在这里插入图片描述
这里我们发送的数据包内附带的有用户名,密码以及清除会话
转换为16进制为C2
后面跟的数据为心跳时间(超出该时间后,如果客户端仍没有数据给服务器,那么服务器将会把客户端踢出,俗称保活时间)我们这里设置100秒
转换为16进制则为 00 64
因为上面我们选择了用户名及密码和清除会话,那么后面跟的消息就为用户的用户名及密码和会话标志
格式如下
在这里插入图片描述
客户端ID如下:
~|securemode=3,signmethod=hmacsha1|
(将~替换为设备的名称)
我们的设备名称为Test001,则就是
Test001|securemode=3,signmethod=hmacsha1|
转换为16进制则为
00 29 54 65 73 74 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
其中 00 29 为该字符串的长度
用户名的规则如下:
~&#
(~为设备名称,#为productKey)
替换后的内容如下:
Test001&a1gmk6tYAWS
转换为16进制如下:
00 13 54 65 73 74 30 30 31 26 61 31 67 6D 6B 36 74 59 41 57 53
其中 00 13 为该字符串的长度
密码是用DeviceSecret做为秘钥对clientIddeviceNameproductKey#进行hmacsha1加密后的结果
其中*为设备名称,#为ProductKey,注意进行替换
替换后的结果为
clientIdTest001deviceNameTest001productKeya1gmk6tYAWS
进行在线加密
点击hmacsha1,在密钥栏里输入DeviceSecret,复制计算后的结果
如下
在这里插入图片描述
将8f954e8b8edf4c07f733192b888fa079890f28e4转化为16进制
00 28 38 66 39 35 34 65 38 62 38 65 64 66 34 63 30 37 66 37 33 33 31 39 32 62 38 38 38 66 61 30 37 39 38 39 30 66 32 38 65 34
其中 00 28 为字符串的长度
整理后如下
10 ?? 00 04 4D 51 54 54 04 C2 00 64
00 29 54 65 73 74 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C

00 13 54 65 73 74 30 30 31 26 61 31 67 6D 6B 36 74 59 41 57 53

00 28 38 66 39 35 34 65 38 62 38 65 64 66 34 63 30 37 66 37 33 33 31 39 32 62 38 38 38 66 61 30 37 39 38 39 30 66 32 38 65 34
在文中的最前面提到过固定报头 10 +data len,??表示了后面跟的数据的总长度,计算后为0x74
那么我们要发送的数据就是为
10 74 00 04 4D 51 54 54 04 C2 00 64 00 29 54 65 73 74 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 13 54 65 73 74 30 30 31 26 61 31 67 6D 6B 36 74 59 41 57 53 00 28 38 66 39 35 34 65 38 62 38 65 64 66 34 63 30 37 66 37 33 33 31 39 32 62 38 38 38 66 61 30 37 39 38 39 30 66 32 38 65 34
将数据复制到网络调试助手,选择16进制发送
IP地址为~.iot-as-mqtt.cn-shanghai.aliyuncs.com
将~替换为ProductKey
端口号为1883
点击连接,发送数据,服务器返回数据如下
在这里插入图片描述
20 02 00 00
代表连接完成
倘若内容不对,则会返回失败的数据,
内容如下

返回码相应
00x00 连接已接受
10x01 连接已拒绝,不支持协议版本
20x02 连接已拒绝,不合格的客户端标识
30x03 连接已拒绝,服务端不可用
40x04 连接已拒绝,无效的用户名或密码
50x05 连接已拒绝,未授权
6-255保留

补充:
确认连接请求
固定报头为
在这里插入图片描述
因此,服务器的答复为20 02 00 00

如有疑问或错误和意见,请及时指出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值