MQTT协议学习笔记一:基本介绍以及简单抓包

1,973 阅读2分钟

物联网系统在选择网络通信协议时,一般采用发布-订阅的通信模式。发布-订阅模式包含三个角色,分别是发布者(Publisher)、经纪人(Broker)和订阅者(Subscriber)。

因为在物联网场景中,一个传感器通常需要触发多个服务或者终端执行动作。这样,传感器只需要向经纪人发布特定主题的消息,所有订阅了该主题消息的订阅者都会从经纪人收到该消息。

MQTT(MQ Telemetry Transport)协议采用的就是发布 - 订阅通信模式。

MQTT 特点

  1. 采用二进制的消息内容编码格式,所以二进制数据、JSON 和图片等负载内容都可以方便传输。
  2. 协议头很紧凑,协议交互也简单,保证了网络传输流量很小。
  3. 支持 3 种 QoS(Quality of Service,服务质量)级别,便于应用根据不同的场景需求灵活选择。

QoS:指通信双方关于消息传送可靠程度的协商。QoS 0,消息只发送一次,消息可能丢失;QoS 1 呢,发送方会接收反馈,保证消息的送达,但是可能消息会重复。QoS 2 级别,通过发送方和接收方的多次交互,保证消息有且只有一次。

使用hbmqtt体验MQTT

安装hbmqtt

pip3 install hbmqtt

使用Eclipse在线Broke服务

mqtt.eclipse.org
This is a public test MQTT broker service. It currently listens on the following ports:

1883 : MQTT over unencrypted TCP
8883 : MQTT over encrypted TCP
80 : MQTT over unencrypted WebSockets (note: URL must be /mqtt )
443 : MQTT over encrypted WebSockets (note: URL must be /mqtt )

消息传输

  1. 订阅 /mqtt/hello 主题
hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geekbang/iot
  1. 使用hbmqtt_pub 向Eclipse 在线Broke服务发布该主题消息
hbmqtt_pub --url mqtt://mqtt.eclipse.org:1883 -t /mqtt/hello -m Hello,Mqtt!
  1. 演示效果

MQTT 协议报文格式解析

mqtt 报文格式

mqtt报文的第一个字节的高四位为数据类型,MQTT 3.1.1 版本一共定义了 14 种数据包的类型:

MQTT 协议为了实现KeepAlive,定义了 PINGREQ 和 PINGRESP 这两种消息类型。它们都没有可变头部和消息体,也就是说都只有 2 个字节大小

报文第一个字节的低四位指明了数据包标识位

抓包

高四位为03,表示这是一个 publish 的报文。

第二个字节的最高位为延续位,为1时,表示还有第三个字节,消息体的字节数由第二个字节和第三个字节共同指定,同样第三个字节最高位还是延续位,表示是否还有第四个字节。以此类推,最多有5个字节。所以消息体的最大长度为(2^28 = 256MB)。