赞
踩
CONNEECT:连接报文
CONNACK:连接完要有回复,好比登录服务器要输入客户端ID、输入 用户名、输入密码。要检测信息对不对所以要有连接有连接回复来告诉你正确与否
PUBLISH:有等级0、1、2
订阅相当于关注。
PING:保活命令,(连接是基于TCP的,服务器有许多人连着,连着但又不发数据就会踢你,但对于我们来说,就算不发数据也想连着,万一啥时候就想发数据了)如果此时没有有用的数据要发,就发一个PING包,服务器就会有一个PING 的回复。
DISCONNECT:断开连接
C:客户端 S:服务器
注意流向。连接只能C->S,回复只能S->C其他如箭头所示。
等级0发过去后不给确认
等级1是发过去后至少要确认一次
等级2是两次确认
(阿里云只支持0和1)
1)要先建立产品,在产品之下可以管理设备。
如上产品Topic列表内的这一功能,操作权限为订阅,描述为设备属性设置。
好比这是一个账号,我只能关注它,关注它之后,它一旦有个发布让开关开,那我就会推送我开,让我开关关,服务器就会推送我关的信号。
post是回复机制,当set将开推送到开发板后post给云在回复给App,这时控制端能确切的知道开成功。 (防止设备坏掉能够及时知道)
所以不仅其他计量要有post开关也要有post
2)添加设备
添加好设备后一键复制
ProductKey:
DeviceName:
DeviceSecret:
这三元组能确定设备的唯一身份
connect----------十六进制
可变报头前两个不变为00 04 就写下去MQTT字符串要换成16进制。这时可以用网络调试助手J将MQTT转化为十六进制4D 51 54 54
协议级别为04
连接标志:用户名和密码都需要为1,Clean Session清除会话有保持的功能只用于等级1,等级0不能用,置1。其他置0(目前基础运用)
1100 0010为C2
最高为65535,阿里单位是秒,这里用100秒,转为16进制为64,为00 64
100秒内没有发数据没有关系,超过100秒后没有发数据就会被踢(如果没有数据的话就要发一个PING就不会被踢)
这时可变报头就完了:
为
剩余长度目前还没得出
有效载荷包含三个:客户端标识符、用户名和密码(这里不使用遗嘱)
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/
上图错误纠正,应该为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
得到的正确回复为20 02 00 00
错误返回:20 02 00 04,并断开连接。04无效的用户名和密码。
此时设备状态为在线
注意!!!尽可能复制粘贴报文,不然很可能打错一个字母到后面很难找出来。我就是MQTT转换16进制时将4D看成了40,找了半天找不出来重新开始再做一遍的时候才发现错误。
当报文错误的时候一发送就会断开连接,被踢出,这时一定是报文有错。仔细检查,不行就从头再来一遍。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。