本系列主要目的在于记录腾讯云物联网设备端的学习笔记,并且对设备端SDK进行补充说明。
控制包格式概述
MQTT所有控制包由3部分组成:固定头部+可变头部+消息体。其中固定头部又分为 包类型、标志以及剩余长度。
CONNECT | CONNACK | PUBLISH | PUBACK | SUBSCRIBE | SUBACK | UNSUBSCRIBE | UNSUBACK | PINGREQ | PINGRESP | DISCONNECT | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
固定头部 | 包类型4bits | 0001 | 0010 | 0011 | 0100 | 0100 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 |
标志4bits | 保留0000 | 保留0000 | DUP 1bit QoS 2bits RETAIN 1bit | 保留0000 | 保留0010 | 保留0000 | 保留0010 | 保留0000 | 保留0000 | 保留0000 | 保留0000 | |
剩余长度1-4 bytes | 不定 | 0x02 | 不定 | 0x02 | 不定 | 不定 | 不定 | 0x02 | 0x00 | 0x00 | 0x00 | |
可变头部 | 协议名 6bytes 协议等级 1 byte 连接标志 1 byte 保活时间 2 bytes | 连接确认标志 1 byte 连接返回值1 byte | 主题 (长度 + 主题名) (支持1个) 包ID 2bytes (仅QoS1) | 包ID 同PUBLISH | 包ID 2bytes | 包ID 同SUBSCRIBE | 包ID 2bytes | 包ID 同UNSUBSCRIBE | 无 | 无 | 无 | |
消息体 | ClientIdusr name (可选)password (可选) | 无 | 应用消息 | 无 | 主题 (长度 + 主题名) (支持1个) 期望最大QoS 1 byte | 返回值 1 byte | 主题 (长度 + 主题名)(支持1个) | 无 | 无 | 无 | 无 | |
控制包作用
- CONNECT:客户端发起连接到平台,每次连接第一个发送的包
- CONNACK:CONNECT的回复
- PUBLISH:客户端发布消息到服务器,服务器发布消息到客户端
- PUBACK:QoS1中用作PUBLISH回复,QoS0无此回复
- SUBSCRIBE:订阅主题,在一次会话中,客户端接收相应的topic发布的消息必须先进行订阅
- SUBACK:SUBSCRIBE的回复
- UNSUBSCRIBE:取消订阅主题
- UNSUBACK:UNSUBSCRIBE的回复
- PINGREQ:用作保活
- PINGRESP:PINGREQ的回复
- DISCONNECT:客户端断开连接,不过通过客户端断开连接是因为网络断开,这个时候其实DISCONNECT包也发送不出去
控制包抓包分析
可以使用SDK通过TCP非TLS方式连接平台1883端口,运行示例,进行抓包分析。
简单分析下,CONNECT包的结构和上面保持一致
- 头部基本固定,唯一可以设置的为Connect Flags中的Clean Session,以及使用TLS鉴权时可以不需要User Name和Password
- 非TLS鉴权下,连接平台1883端口,鉴权通过User Name和Password。
主要是针对CONNECT包的回复,无其他特殊的,主要是返回值Retrun Code上会有差异
SUBSCRIBE和SUBACK为对应关系,其中Message Identifier要匹配,QoS设置也要对应。
QoS0的PUBLISH包没有回复
PUBLISH和PUBACK为对应关系,其中Message Identifier要匹配,QoS设置也要对应。
断开连接时,由客户端发送,通常用不上,因为一般MQTT都是保持长连接,而连接断开往往因为网络,这个时候DISCONNECT包一般无法发送出去