因此我们的数据包就变成了如下这样:
10 ?00 04 40 51 54 54 04 c2 00 64
3.2.3、负载(也就数据)负载数据就是前面标志位中设定要包含的数据,全部有客户端标识符、遗嘱主题、遗嘱消息、用户名、密码,五部分组成,在这个值讲解三部分 。这里先看一下阿里云对连接密码用户名和客户端标识符的要求
文章插图
三元组:
文章插图
1)、客户端标识符阿里云参考规范:mqttClientId : clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
根据对参数的解释,clientId就为三元组中的T123,securemode由于选择一机一密所以已经固定,不要改默认就行,signmethod默认加密为hmacmd5没有改,后续的timestamp我们不需要设置省略掉
最终mqttClientId就为“T123|securemode=3,signmethod=hmacmd5|”
我们把这一串转换为十六进制为54 31 32 33 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 6D 64 35 7C 在再前面加上客户端ID的长度(两字节)最后变为:
00 25 54 31 32 33 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 6D 64 35 7C
2)、用户名阿里云参考规范:mqttUsername:deviceName+"&"+productKey
用三元组件替换mqttUsername:T123&a1tETt7fUG1
变成十六进制:54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31
加上长后为:00 10 54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31
3)、密码获取阿里云参考规范:mqttPassword::sign_hmac(deviceSecret,content)
这里需要用到加密算法hmacmd5使用三元组中的DeviceSecret做为秘钥对clientId*deviceName*productKey#加密后作为密码——其中*号为设备名称,#ProductKey
即clientIdT123deviceNameT123productKeya1tETt7fUG1,然后再网页上打开一个网页版加密工具:在线加密解密 - chahuo.com
文章插图
由此获得我们的密码:86a087f11cad5c325127ae5f79305109,经过转化后并加上两字节长度信息后:
00 20 38 36 61 30 38 37 66 31 31 63 61 64 35 63 33 32 35 31 32 37 61 65 35 66 37 39 33 30 35 31 30 39
由此我们来组合一下我们的CONNECT报文包
10 ? 00 04 4D 51 54 54 04 C2 00 64 00 25 54 31 32 33 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 6D 64 35 7C 00 10 54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31 00 20 38 36 61 30 38 37 66 31 31 63 61 64 35 63 33 32 35 31 32 37 61 65 35 66 37 39 33 30 35 31 30 39 那么由此我就可以知道问号后面一共多少个字节了就是后面的绿色和黑色部分字节长度一共101(65)
因此整个报文信息就为:
10 65 00 04 4D 51 54 54 04 C2 00 64 00 25 54 31 32 33 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C 00 10 54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31 00 20 3836 61 30 38 37 66 31 31 63 61 64 35 63 33 32 35 31 32 37 61 65 35 66 37 39 33 30 35 31 30 39 3.3、PC端工具连接测试我们用PC端网络工具进行一下测试:
在测试前还需要知道云的地址,在阿里云这进行查看:
文章插图
Url:a1tETt7fUG1.iot-as-mqtt.cn-shanghai.aliyuncs.com
port:1883
文章插图
可见服务器回复20 02 00 00,接受我们连接了(其中20,表示报文类型,20是回复包,02是剩余长度——后面还有两个字节,00相当于站位字节,最后以一个00,表示已经接受)
MQTT协议定义的响应命令如下: