阿里云MQTT连接报文

  • 物联网MQTT协议解析
    这里主要讲一下CONNECT报文
    使用电脑网络调试助手,MQTT接入阿里云物联网平台。


CONNEECT:连接报文
CONNACK:连接完要有回复,好比登录服务器要输入客户端ID、输入 用户名、输入密码。要检测信息对不对所以要有连接有连接回复来告诉你正确与否
PUBLISH:有等级0、1、2
订阅相当于关注。
PING:保活命令,(连接是基于TCP的,服务器有许多人连着,连着但又不发数据就会踢你,但对于我们来说,就算不发数据也想连着,万一啥时候就想发数据了)如果此时没有有用的数据要发,就发一个PING包,服务器就会有一个PING 的回复。
DISCONNECT:断开连接
C:客户端 S:服务器
注意流向。连接只能C->S,回复只能S->C其他如箭头所示。
阿里云MQTT连接报文_第1张图片
等级0发过去后不给确认
等级1是发过去后至少要确认一次
等级2是两次确认
(阿里云只支持0和1)

  • 开通阿里云服务器

1)要先建立产品,在产品之下可以管理设备。
阿里云MQTT连接报文_第2张图片
在这里插入图片描述
如上产品Topic列表内的这一功能,操作权限为订阅,描述为设备属性设置。
好比这是一个账号,我只能关注它,关注它之后,它一旦有个发布让开关开,那我就会推送我开,让我开关关,服务器就会推送我关的信号。
post是回复机制,当set将开推送到开发板后post给云在回复给App,这时控制端能确切的知道开成功。 (防止设备坏掉能够及时知道)
所以不仅其他计量要有post开关也要有post

2)添加设备
添加好设备后一键复制
ProductKey:
DeviceName:
DeviceSecret:
这三元组能确定设备的唯一身份

  • 报文:
    CONNECT:
    阿里云MQTT连接报文_第3张图片
    10
    阿里云MQTT连接报文_第4张图片
    剩余长度:可变加负载
    MQTT一个字节都不能多余因此要有以下规则:
    7654 3210:这8位只有7不表示数据,只有6543210表示数据,因此最大值7F为127
    例:剩余长度为200
    如果现在剩余长度为200那么127不满足,一个字节就不够用了。此时标志位要置1,逢128进一,进到7的位置,200-128=72转为16进制为48,二进制就为100 1000分别对应654 3210
    则此时7654 3210就是1100 1000,十六进制为C8,后面还有一个字节为01(相当于进了一个128)这时把字节发给服务器,服务器看到C8第7位是1就知道剩余长度一个字节不够用要再往后看一个01,进了一位。这时计算剩余长度的话就用长度对128进行取余,得出了余数转化为二进制就对应着6543210的位置给7位置1,读出前面那个字节的数,再看除数是几(就是有几个128)后面的字节就是这个数。

connect----------十六进制

阿里云MQTT连接报文_第5张图片
阿里云MQTT连接报文_第6张图片

可变报头前两个不变为00 04 就写下去MQTT字符串要换成16进制。这时可以用网络调试助手J将MQTT转化为十六进制4D 51 54 54
阿里云MQTT连接报文_第7张图片
阿里云MQTT连接报文_第8张图片
协议级别为04
阿里云MQTT连接报文_第9张图片
连接标志:用户名和密码都需要为1,Clean Session清除会话有保持的功能只用于等级1,等级0不能用,置1。其他置0(目前基础运用)
1100 0010为C2
阿里云MQTT连接报文_第10张图片
最高为65535,阿里单位是秒,这里用100秒,转为16进制为64,为00 64
100秒内没有发数据没有关系,超过100秒后没有发数据就会被踢(如果没有数据的话就要发一个PING就不会被踢)
这时可变报头就完了:

  • 10 ?? 00 04 4D 51 54 54 04 C2 00 64

剩余长度目前还没得出

阿里云MQTT连接报文_第11张图片

有效载荷包含三个:客户端标识符、用户名和密码(这里不使用遗嘱)

clientId:
设备名称+|securemode=2,signmethod=hmacsha1|
为D001|securemode=3,signmethod=hmacsha1|
username:
** 设备名称&ProductKey**为D001&grioBm0cRmf
password:

用DeviceSecret做为秘钥对clientIddeviceNameproductKey#进行hmacsha1加密后的结果 *设备名称 #ProductKey 注意替换

3e6894bfcd640d46f00eb8438e4326a37b46f9e8ebf0af03df030527c55b2a36

注意替换:
*:设备名称
#:ProductKey

hmacsha1加密在线计算网站:http://encode.chahuo.com/
阿里云MQTT连接报文_第12张图片
上图错误纠正,应该为HmacSHA1加密
把这些都换成16进制
44 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
长度为38转换为16进制为26,因此要在前面加上两个字节00 26(相当于标点符号便于服务器解析)
00 26 44 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
用户名:
44 30 30 31 26 67 72 69 6F 42 6D 30 63 52 6D 66
长度为16转化为16进制为10,前面加上00 10
00 10 44 30 30 31 26 67 72 69 6F 42 6D 30 63 52 6D 66
密码:
39 36 37 61 38 38 66 39 35 62 65 64 31 38 38 34 65 39 36 37 37 35 35 61 61 31 32 36 62 34 62 61 66 32 37 66 61 30 63 66
长度为40转化为16进制为28,前面加上00 28
00 28 39 36 37 61 38 38 66 39 35 62 65 64 31 38 38 34 65 39 36 37 37 35 35 61 61 31 32 36 62 34 62 61 66 32 37 66 61 30 63 66

10 ?? 00 04 4D 51 54 54 04 C2 00 64 00 26 44 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 10 44 30 30 31 26 67 72 69 6F 42 6D 30 63 52 6D 66 00 28 39 36 37 61 38 38 66 39 35 62 65 64 31 38 38 34 65 39 36 37 37 35 35 61 61 31 32 36 62 34 62 61 66 32 37 66 61 30 63 66
此时用斜体的长度计算出剩余长度
长度为110,转换为16进制为6E
CONNECT报文构建完成:
10 6E 00 04 4D 51 54 54 04 C2 00 64 00 26 44 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 10 44 30 30 31 26 67 72 69 6F 42 6D 30 63 52 6D 66 00 28 39 36 37 61 38 38 66 39 35 62 65 64 31 38 38 34 65 39 36 37 37 35 35 61 61 31 32 36 62 34 62 61 66 32 37 66 61 30 63 66

阿里云服务器IP地址:
grioBm0cRmf.iot-as-mqtt.cn-shanghai.aliyuncs.com
阿里云服务器端口号:
1883

阿里云MQTT连接报文_第13张图片
得到的正确回复为20 02 00 00
错误返回:20 02 00 04,并断开连接。04无效的用户名和密码。
阿里云MQTT连接报文_第14张图片
此时设备状态为在线
注意!!!尽可能复制粘贴报文,不然很可能打错一个字母到后面很难找出来。我就是MQTT转换16进制时将4D看成了40,找了半天找不出来重新开始再做一遍的时候才发现错误。
当报文错误的时候一发送就会断开连接,被踢出,这时一定是报文有错。仔细检查,不行就从头再来一遍。

你可能感兴趣的:(阿里云,服务器,云计算,物联网)