03.腾讯云物联网设备端学习---MQTT控制包概述

本系列主要目的在于记录腾讯云物联网设备端的学习笔记,并且对设备端SDK进行补充说明。

控制包格式概述

MQTT控制包格式

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包也发送不出去
MQTT流程图

控制包抓包分析

可以使用SDK通过TCP非TLS方式连接平台1883端口,运行示例,进行抓包分析。

MQTT CONNECT

简单分析下,CONNECT包的结构和上面保持一致

  • 头部基本固定,唯一可以设置的为Connect Flags中的Clean Session,以及使用TLS鉴权时可以不需要User Name和Password
  • 非TLS鉴权下,连接平台1883端口,鉴权通过User Name和Password。
MQTT CONNACK

主要是针对CONNECT包的回复,无其他特殊的,主要是返回值Retrun Code上会有差异


MQTT SUBSCRIBE QoS0
MQTT SUBACK QoS0
MQTT SUBSCRIBE QoS1
MQTT SUBACK QoS1

SUBSCRIBE和SUBACK为对应关系,其中Message Identifier要匹配,QoS设置也要对应。


MQTT PUBLISH QoS0

QoS0的PUBLISH包没有回复

MQTT PUBLISH QoS1
MQTT PUBACK QoS1

PUBLISH和PUBACK为对应关系,其中Message Identifier要匹配,QoS设置也要对应。


MQTT DISCONNECT

断开连接时,由客户端发送,通常用不上,因为一般MQTT都是保持长连接,而连接断开往往因为网络,这个时候DISCONNECT包一般无法发送出去