mqtt协议 阿里云物联网平台
- MQTT报文结构
- MQTT—CONNECT连接服务器报文
-
- 固定报头
- 可变报头
- 有效载荷
-
- 客户端ID
- 用户名
- 密码
- 转换
- 通过网络调试助手连接阿里云服务器
-
- 远程主机地址
- MQTT—PINGREQ 心跳请求
-
- 固定报头
- MQTT—PINGRESP 心跳响应
-
- 固定报头
- 实例
- MQTT—SUBSCRIBE订阅主题
-
- 固定报头
- 可变报头
- 有效载荷
- MQTT—SUBACK订阅确认
- MQTT—UNSUBSCRIBE取消订阅
-
- 固定报头
- 可变报头
- MQTT—UNSUBACK取消订阅确认
-
- 固定报头和可变报头
- 通过网络调试助手向阿里云服务器发布消息
-
- 解析来自阿里的数据
- 发布的报文
- 完整报文
MQTT报文结构
mqtt协议具体标准协议内容见文档
mqtt标准协议文档
MQTT—CONNECT连接服务器报文
固定报头
剩余长度暂时未知 用??代替
可变报头
byte1和byte2为 00 04
MQTT字符串通过转换为16进制发送为 4D 51 54 54
所以目前报文内容为
加入协议级别04
对应为11000010 十六进制C2
目前报文为
设置保持连接时间为100s 即 00 64
当前报文
有效载荷
填入客户端ID 用户名 密码
客户端ID :
*|securemode=3,signmethod=hmacsha1|
用户名:*
密码:clientId*deviceName*productKey#
客户端ID
设备名称在设备中的DeviceName
用其替换
中的*
用户名
在设备中查询设备证书
*为设备名称DeviceName的名称 #为ProductKey的值 进行替换
密码
使用在线加密解密对
clientId*deviceName*productKey#
进行加密
注意将*替换为设备名称 #替换为ProductKey
密钥为设备证书中的
选择
得到的结果为密码
转换
将得到的客户端ID 用户名 密码 转为对应的格式
将客户端ID输入网络调试助手,并选择16进制发送
得到结果如下
选择发送后 得到对应字节数
将43转为16进制 即00 2B
在00 2B后加在刚刚的数据前面 结果如下
00 2B 44 65 76 69 63 65 30 30 31 49 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 6C
将这段加入报文中作为客户端ID
当前报文为:
前2个字节为固定报头 接下来10个字节为可变报头
客户端ID作为有效载荷加入了报文中 按照此方法 将用户名和密码转换后加在报文中作为有效载荷
转换后得到有效载荷后 将有效载荷加上可变报头的10个字节 粘贴至网络调试助手发送 得到总字节数 将这个数转换为16进制 根据固定报头协议要求填写至固定报头中的??中
这样完整的连接服务器的控制报文就完成了
通过网络调试助手连接阿里云服务器
先勾选按16进制发送后将控制报文复制至窗口
远程主机地址
阿里云服务器IP地址(华东)*.iot-as-mqtt.cn-shanghai.aliyuncs.com *为自己账号的ProductKey
*表示自己账号的ProductKey注意
华东端口1883
输入远程主机地址后 将上文最后得到的完整连接报文发送至阿里云服务器 得到响应
返回值的意义
MQTT—PINGREQ 心跳请求
固定报头
没有可变报头和有效载荷
MQTT—PINGRESP 心跳响应
固定报头
没有可变报头和有效载荷
实例
连接上阿里云服务器后
以16进制发送C0 00
得到回复D0 00
MQTT—SUBSCRIBE订阅主题
固定报头
剩余长度未知 用?? 代替 即82 ??
可变报头
报文标识符用于区分标记信息 可自定义 此处设为00 0A
此时报文为82 ?? 00 0A
有效载荷
有效载荷即为订阅内容
订阅内容参考Topic列表
${deviceName}
替换为设备名称 Device001 即
/sys/gvlabuKZMsF/Device001/thing/service/property/set
转换为16进制
2F 73 79 73 2F 67 76 6C 61 62 75 4B 5A 4D 73 46 2F 44 65 76 69 63 65 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
共53个字节 转换为16进制 00 35 将00 35 加到订阅信息最前
合并后此时报文为
最后加上服务质量00
即
计算除了固定报头82 ?? 剩下的可变报头和有效载荷字节数 共58 16进制3A 将3A填入??
此时完整报文
MQTT—SUBACK订阅确认
连接服务器后 发送订阅报文得到返回结果
00 0A代表报文标识符00 0A成功
最后一个字节01
MQTT—UNSUBSCRIBE取消订阅
固定报头
可变报头
即取消订阅的报文步骤:将订阅的报文最后一个服务质量的字节删除
将固定报头的3A减去一个字节剩下39 即固定报头为 A2 39
MQTT—UNSUBACK取消订阅确认
固定报头和可变报头
回复内容如下:
00 0A 为标识符
通过网络调试助手向阿里云服务器发布消息
解析来自阿里的数据
通过在线调试,发送设置主灯关闭的消息
得到报文
解析数据 30 9D 01 为固定报头 00 35 为订阅信息的有效长度十进制为53
取后续53个字节 将其又16进制转换为10进制
可以得到topic
接下来 将剩下的所有字节全部字节由16进制转换为10进制
就可以解析出这样的信息
我们对此信息进行修改 便可以通过网络调试助手向阿里云服务器发布信息
发布的报文
找到属性上报的topic 将${deviceName}替换为我们的设备名称
然后转换为16进制得到
选择发送得到发送量52个字节 16进制00 34 将其加在最前 即
此为topic①
在阿里云产品的功能定义中的物理模型找到属性上报
“method”: “thing.event.property.post”,获得此条topic将其替换至报文中
将id位数不变改为0000000001 参数值发布为1 最后的1.0.0为版本号不用修改
然后将此信息转换为16进制后 得到应发送数据的16进制形式②
完整报文
将上诉报文topic①+数据②拼接结合得到
共155个字节
加上固定报头
30 9B 01
9B 01为字节数量155 按mqtt固定报头协议算出的结果 按具体情况计算
得完整报文
连接服务器后发送即可发布消息 控制led为1
用如上的方法发布温度
将此数据转为16进制 得到①
①
topic: /sys/gvlabuKZMsF/Device001/thing/event/property/post
转换为16进制 共52个字节 转换为16进制为00 34 加在数据最前面,得到②
②
②+①得到可变报文+有效载荷③
③
在③前加上固定报头30 A3 01得到最终报文
阿里云端收到发布的温度