mqtt协议 阿里云物联网平台

mqtt协议 阿里云物联网平台

  • MQTT报文结构
  • MQTT—CONNECT连接服务器报文
    • 固定报头
    • 可变报头
    • 有效载荷
      • 客户端ID
      • 用户名
      • 密码
      • 转换
    • 通过网络调试助手连接阿里云服务器
      • 远程主机地址
  • MQTT—PINGREQ 心跳请求
    • 固定报头
  • MQTT—PINGRESP 心跳响应
    • 固定报头
    • 实例
  • MQTT—SUBSCRIBE订阅主题
    • 固定报头
    • 可变报头
    • 有效载荷
  • MQTT—SUBACK订阅确认
  • MQTT—UNSUBSCRIBE取消订阅
    • 固定报头
    • 可变报头
  • MQTT—UNSUBACK取消订阅确认
    • 固定报头和可变报头
  • 通过网络调试助手向阿里云服务器发布消息
    • 解析来自阿里的数据
    • 发布的报文
    • 完整报文

MQTT报文结构

mqtt协议 阿里云物联网平台

mqtt协议具体标准协议内容见文档
mqtt标准协议文档


MQTT—CONNECT连接服务器报文

固定报头

mqtt协议 阿里云物联网平台

剩余长度暂时未知 用??代替
mqtt协议 阿里云物联网平台


可变报头

mqtt协议 阿里云物联网平台

mqtt协议 阿里云物联网平台

byte1和byte2为 00 04
MQTT字符串通过转换为16进制发送为 4D 51 54 54
所以目前报文内容为
mqtt协议 阿里云物联网平台
加入协议级别04
mqtt协议 阿里云物联网平台

mqtt协议 阿里云物联网平台

对应为11000010 十六进制C2
目前报文为
mqtt协议 阿里云物联网平台

mqtt协议 阿里云物联网平台

设置保持连接时间为100s 即 00 64
当前报文
mqtt协议 阿里云物联网平台


有效载荷

mqtt协议 阿里云物联网平台

填入客户端ID 用户名 密码

mqtt协议 阿里云物联网平台

客户端ID :*|securemode=3,signmethod=hmacsha1|
用户名: *
密码:clientId*deviceName*productKey#

客户端ID

设备名称在设备中的DeviceName
mqtt协议 阿里云物联网平台
用其替换
mqtt协议 阿里云物联网平台
中的*

用户名

在设备中查询设备证书
mqtt协议 阿里云物联网平台
mqtt协议 阿里云物联网平台
*为设备名称DeviceName的名称 #为ProductKey的值 进行替换
mqtt协议 阿里云物联网平台

密码

使用在线加密解密对clientId*deviceName*productKey#进行加密
注意将*替换为设备名称 #替换为ProductKey
密钥为设备证书中的
mqtt协议 阿里云物联网平台
选择
mqtt协议 阿里云物联网平台
得到的结果为密码

转换

将得到的客户端ID 用户名 密码 转为对应的格式
将客户端ID输入网络调试助手,并选择16进制发送
mqtt协议 阿里云物联网平台
mqtt协议 阿里云物联网平台
得到结果如下
mqtt协议 阿里云物联网平台
选择发送后 得到对应字节数
mqtt协议 阿里云物联网平台
将43转为16进制 即00 2B
mqtt协议 阿里云物联网平台
在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

当前报文为:
mqtt协议 阿里云物联网平台
前2个字节为固定报头 接下来10个字节为可变报头
客户端ID作为有效载荷加入了报文中 按照此方法 将用户名和密码转换后加在报文中作为有效载荷

转换后得到有效载荷后 将有效载荷加上可变报头的10个字节 粘贴至网络调试助手发送 得到总字节数 将这个数转换为16进制 根据固定报头协议要求填写至固定报头中的??中
这样完整的连接服务器的控制报文就完成了


通过网络调试助手连接阿里云服务器

先勾选按16进制发送后将控制报文复制至窗口

远程主机地址

阿里云服务器IP地址(华东)*.iot-as-mqtt.cn-shanghai.aliyuncs.com *为自己账号的ProductKey
*表示自己账号的ProductKey注意
华东端口1883

输入远程主机地址后 将上文最后得到的完整连接报文发送至阿里云服务器 得到响应
mqtt协议 阿里云物联网平台
返回值的意义
mqtt协议 阿里云物联网平台


MQTT—PINGREQ 心跳请求

固定报头

mqtt协议 阿里云物联网平台
mqtt协议 阿里云物联网平台

没有可变报头和有效载荷

MQTT—PINGRESP 心跳响应

固定报头

mqtt协议 阿里云物联网平台

没有可变报头和有效载荷

实例

连接上阿里云服务器后
以16进制发送 C0 00
得到回复 D0 00
mqtt协议 阿里云物联网平台

MQTT—SUBSCRIBE订阅主题

固定报头

mqtt协议 阿里云物联网平台

剩余长度未知 用?? 代替 即82 ??

可变报头

mqtt协议 阿里云物联网平台

报文标识符用于区分标记信息 可自定义 此处设为00 0A
此时报文为82 ?? 00 0A

有效载荷

mqtt协议 阿里云物联网平台
有效载荷即为订阅内容

订阅内容参考Topic列表
mqtt协议 阿里云物联网平台
${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 加到订阅信息最前
合并后此时报文为
mqtt协议 阿里云物联网平台
最后加上服务质量00

mqtt协议 阿里云物联网平台
计算除了固定报头82 ?? 剩下的可变报头和有效载荷字节数 共58 16进制3A 将3A填入??
此时完整报文
mqtt协议 阿里云物联网平台


MQTT—SUBACK订阅确认

mqtt协议 阿里云物联网平台
mqtt协议 阿里云物联网平台

连接服务器后 发送订阅报文得到返回结果
mqtt协议 阿里云物联网平台
00 0A代表报文标识符00 0A成功
最后一个字节01
mqtt协议 阿里云物联网平台

MQTT—UNSUBSCRIBE取消订阅

固定报头

mqtt协议 阿里云物联网平台

可变报头

mqtt协议 阿里云物联网平台
mqtt协议 阿里云物联网平台

即取消订阅的报文步骤:将订阅的报文最后一个服务质量的字节删除
将固定报头的3A减去一个字节剩下39 即固定报头为 A2 39
mqtt协议 阿里云物联网平台

MQTT—UNSUBACK取消订阅确认

固定报头和可变报头

mqtt协议 阿里云物联网平台
回复内容如下:

mqtt协议 阿里云物联网平台
00 0A 为标识符


通过网络调试助手向阿里云服务器发布消息

解析来自阿里的数据

通过在线调试,发送设置主灯关闭的消息
mqtt协议 阿里云物联网平台

得到报文mqtt协议 阿里云物联网平台
解析数据 30 9D 01 为固定报头 00 35 为订阅信息的有效长度十进制为53
mqtt协议 阿里云物联网平台
取后续53个字节 将其又16进制转换为10进制
mqtt协议 阿里云物联网平台
可以得到topic

接下来 将剩下的所有字节全部字节由16进制转换为10进制
mqtt协议 阿里云物联网平台
就可以解析出这样的信息

我们对此信息进行修改 便可以通过网络调试助手向阿里云服务器发布信息

发布的报文

mqtt协议 阿里云物联网平台找到属性上报的topic 将${deviceName}替换为我们的设备名称
mqtt协议 阿里云物联网平台
然后转换为16进制得到
mqtt协议 阿里云物联网平台
选择发送得到发送量52个字节 16进制00 34 将其加在最前 即
mqtt协议 阿里云物联网平台
此为topic

在阿里云产品的功能定义中的物理模型找到属性上报
mqtt协议 阿里云物联网平台
“method”: “thing.event.property.post”,获得此条topic将其替换至报文中
mqtt协议 阿里云物联网平台
将id位数不变改为0000000001 参数值发布为1 最后的1.0.0为版本号不用修改
然后将此信息转换为16进制后 得到应发送数据的16进制形式②

完整报文

将上诉报文topic①+数据②拼接结合得到
mqtt协议 阿里云物联网平台
共155个字节

加上固定报头
30 9B 01
9B 01为字节数量155 按mqtt固定报头协议算出的结果 按具体情况计算

得完整报文
mqtt协议 阿里云物联网平台

连接服务器后发送即可发布消息 控制led为1
mqtt协议 阿里云物联网平台

用如上的方法发布温度

mqtt协议 阿里云物联网平台
将此数据转为16进制 得到①


mqtt协议 阿里云物联网平台

topic: /sys/gvlabuKZMsF/Device001/thing/event/property/post
转换为16进制 共52个字节 转换为16进制为00 34 加在数据最前面,得到②


mqtt协议 阿里云物联网平台

②+①得到可变报文+有效载荷③


mqtt协议 阿里云物联网平台

在③前加上固定报头30 A3 01得到最终报文
mqtt协议 阿里云物联网平台
阿里云端收到发布的温度
mqtt协议 阿里云物联网平台

本文章来源于互联网,如有侵权,请联系删除!原文地址:mqtt协议 阿里云物联网平台