初探 MQTT的网络调试助手通信测试
上手之前觉得很有难度,但是当你慢慢上手,你回过头来,你会发现哦,原来是这样的啊!
这里用的平台是阿里云的物理网平台所以有必要要介绍一下如何使用平台,如何申请,和白嫖平台。
物联网平台申请
阿里云 – 物联网 MQTT注册
产品 ProductKey
设备 DeviceName
设备三元组 DeviceSecret
进入阿里云物联网平台免费注册 物联网平台 (aliyun.com)
填写 产品名称、所属品类 “、” 节点类型 “、” 连接方式 “、” 数据格式 “、” 认证方式 “,点击下方保存
找到设备三元组
三元组为
{“ProductKey”:“hhyyFwo5b9l”,
“DeviceName”:“D001”,“DeviceSecret”:
“be5c22218e57fc60a64a00c23c05849a” }
添加功能。添加了几个开关和温湿度的属性。
点击产品步骤如下
添加页面
添加标准模块
发布上线
第一步是申请,然后第二步可以说是通过这个设备来了解mqtt报文协议的报文发送原理。
利用网络调试助手连接阿里云物联网
{
“ProductKey”: “hhyyFwo5b9l”,
“DeviceName”: “D001”,
“DeviceSecret”: “be5c22218e57fc60a64a00c23c05849a”
}
客户端id D001|securemode=3,signmethod=hmacsha1| 38字节
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
用户名 D001&hhyyFwo5b9l 16字节
16 进制
44 30 30 31 26 68 68 79 79 46 77 6F 35 62 39 6C
密码 :clientIdD001deviceNameD001productKeyhhyyFwo5b9l
http://encode.chahuo.com/
78776835497cac51798a0e7af0fb9aa07bfd7e68 转16 进制 字长 40
37 38 37 37 36 38 33 35 34 39 37 63 61 63 35 31 37 39 38 61 30 65 37 61 66 30 66 62 39 61 61 30 37 62 66 64 37 65 36 38
MQTT 报文固定格式
固定报头
可变报头
报文连接一般是
报文类型 + 固定报头
01(CONNECT) ??(剩余字节长度)
00 04(协议名长度 MQTT) 4D("M")51("Q")54("T")54("T")
04(协议级别) C2(连接标志) 00 64(保持连接时长100秒,可自行定义)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(客户端ID的字节长度38 hex 26 + 客户端ID)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 68 68 79 79 46 77 6F 35 62 39 6C (用户名长度 16 hex 26 +用户名)00 28 37 38 37 37 36 38 33 35 34 39 37 63 61 63 35 31 37 39 38 61 30 65 37 61 66 30 66 62 39 61 61 30 37 62 66 64 37 65 36 38(密码长度 40 hex 28 +密码)
连接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 68 68 79 79 46 77 6F 35 62 39 6C 00 28 37 38 37 37 36 38 33 35 34 39 37 63 61 63 35 31 37 39 38 61 30 65 37 61 66 30 66 62 39 61 61 30 37 62 66 64 37 65 36 38 (可变报头 + 有效载荷 的总长度 = 110 hex 6E)
网络助手连接连接
阿里云服务器IP地址(华东2) : *.iot-as-mqtt.cn-shanghai.aliyuncs.com *表示自己账号的ProductKey注意替换 hhyyFwo5b9l.iot-as-mqtt.cn-shanghai.aliyuncs.com
阿里云服务器端口号(华东2) : 1883
协议是tcp client
返回 20 02 00 00
CONNACK 确认连接
即为CONNECT的响应,数据流动方向为 S -> C。
正确,返回:20 02 00 00,并且保持链接。00 连接成功。
错误,返回:20 02 00 04,并且断开连接。04 无效的用户名和密码。
其他的值含义,若10s内无上报消息,阿里云会主动断开连接。
DISCONNECT 断开连接
E0 00
显示断开
阿里物联网平台显示离线
PINGREQ 心跳请求
PINGREQ帧:C0 00 在Keep alive时间内,C端应该向S端发送 PINFREQ,告知客户端还存在。
PINGRESP 心跳响应
即为PINGREQ的响应,数据流动方向为 S -> C。
PINGRESP帧:D0 00
心跳响应
SUBSCRIBE 订阅主题
首先要知道与阿里云通信,需要订阅哪几个主题?
回到设备的产品界面,Topic类列表 – 物模型通信Topic,可查看与物模型通信用到的所有主题。
设备上报温湿度消息给云服务器:
/sys/hhyyFwo5b9l/${deviceName}/thing/event/property/post
/sys/hhyyFwo5b9l/D001/thing/event/property/post
云服务器下发控制命令给家居设备:
/sys/hhyyFwo5b9l/${deviceName}/thing/service/property/set
/sys/hhyyFwo5b9l/D001/thing/service/property/set
82 ??
报文标识 00 0A 一个标记 如果订阅很多的话建议自己规定标记
报文有效载荷
Byte 1 Byte 2 (长度MSB,LSB) byte 3…N(主题过滤 话题名) byte N+1(服务质量 0000 00 00质量等级)
固定报头 Byte1 82 | Byte 2 ??(剩余报文长度)
报文标识 Byte1 00 | Byte 2 0A > 00 0A
报文载荷(订阅的主题)
Byte 1 ?? Byte 2 ?? (订阅主题名长度)>00 30
Byte 3-N :2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 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
(/sys/hhyyFwo5b9l/D001/thing/service/property/set 48长度)
Byte N+1 : 00 (QoS等级1)
剩余长度报文: 53 ==> hex 35
00 0A 00 30 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 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 00
订阅(/sys/hhyyFwo5b9l/D001/thing/service/property/set)报文:
82 35 00 0A 00 30 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 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 00
同理订阅/sys/hhyyFwo5b9l/D001/thing/event/property/post
82 34 00 0B 00 2F 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 00
SUBACK – 订阅确认
固定报头
可变报头 + 报文标识符号 和订阅时候设置一样的回文
网络助手 90 03 00 0A 01
阿里云平台的状态
取消订阅
和订阅话题相似 没有质量等级
订阅(/sys/hhyyFwo5b9l/D001/thing/service/property/set)报文:
A2 34 00 0A 00 30 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 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
同理订阅/sys/hhyyFwo5b9l/D001/thing/event/property/post
A2 33 00 0B 00 2F 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
阿里云平台
UNSUBACK 报文没有有效载荷
固定报头+剩余长度 + 订阅标识符
PINGREQ – 心跳请求.
客户端发送 PINGREQ 报文给服务端的。用于:
- 在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。
- 请求服务端发送 响应确认它还活着。
- 使用网络以确认网络连接没有断开。
保持连接(Keep Alive)处理中用到这个报文
固定报头 + 剩余长度 C0 00
心跳响应 D0 00
断开连接 DISCONNECT
固定报头+ 剩余长度 E0 00
PUBLISH – 发布消息
PUBLISH 控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。
固定报头
30 98 01
00 30 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 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 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 31 30 38 37 30 30 32 31 37 35 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
/sys/hhyyFwo5b9l/D001/thing/service/property/set{“method”:“thing.service.property.set”,“id”:“1087002175”,“params”:{“PowerSwitch”:1},“version”:“1.0.0”}
30 是 固定报头 98 01 是剩余长度 152 152 -128=98
模仿上面的数据格式
固定报头 :30 ?? ?? 剩余长度取决于后面的字节
Topic话题+荷载(数据)
00 2F + 数据
/sys/hhyyFwo5b9l/D001/thing/event/property/post 47
2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
{“method”:“thing.event.property.post”,“id”:“000000001”,“params”:{“CurrentHumidity”:32,“CurrentTemperature”:25.65},“version”:“1.0.0”} 132
7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 30 30 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 43 75 72 72 65 6E 74 48 75 6D 69 64 69 74 79 22 3A 33 32 2C 22 43 75 72 72 65 6E 74 54 65 6D 70 65 72 61 74 75 72 65 22 3A 32 35 2E 36 35 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
发布 181 181-128 = 53 0011 0101 ==> 1(标志位) 011 0101 ==> B5
30 B5 01 00 2F 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 30 30 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 43 75 72 72 65 6E 74 48 75 6D 69 64 69 74 79 22 3A 33 32 2C 22 43 75 72 72 65 6E 74 54 65 6D 70 65 72 61 74 75 72 65 22 3A 32 35 2E 36 35 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
温度 湿度 上传成功
发布 等级0 16进制
{“method”:“thing.event.property.post”,“id”:“000000001”,“params”:{“PowerSwitch”:1},“version”:“1.0.0”}
100
7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 30 30 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
开关 关
30 95 01 00 2F 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 30 30 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
开
30 95 01 00 2F 2F 73 79 73 2F 68 68 79 79 46 77 6F 35 62 39 6C 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 30 30 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
先随便给自己整理一下,后面再改。不管这么多先。