MQTT协议

MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

MQTT协议流程

MQTT实现

角色划分:

  • 订阅者(Subscriber):接收消息的客户端
  • 发布者(Publisher):发送消息的客户端
  • 代理服务器(Broker):消息中继服务器

架构分类:

  • 服务器端:仅包含代理服务器
  • 客户端:包含订阅者和发布者

通信特点:

  • 客户端可同时具备发布和订阅功能
  • 通过向代理服务器发送连接请求建立通信

MQTT实现过程

设计原则与特性

精简设计

把传输量降到最低

  • 设计理念:仅传输必要内容,去除冗余功能
  • 适用场景:考虑物联网设备网络条件苛刻(远距离传输、时断时续)
  • 实现方式:协议头精简,数据包体积最小化

发布/订阅模式

一对多消息发布

  • 工作模式:
    • 采用(Pub/sub)模式
  • 优势:
    • 解除应用程序耦合
    • 一条消息可被多个订阅者接收
    • 类似广播机制,节省带宽资源
  • 主题结构:
    • 采用分层结构(如home/temperature)
    • 支持通配符订阅(#表示多级,+表示单级)

动态主题管理

允许用户动态创建主题

  • 管理特性:
    • 运行时动态创建/修改主题
    • 支持主题取消订阅
    • 发布者可灵活切换主题
  • 示例:温湿度传感器可动态发布home/temperature和home/humidity两个主题

服务质量管理

三种消息发布服务质量

  • QoS 0(至多一次):
    • 代理服务器最多推送一次
    • 不保证消息到达
  • QoS 1(至少一次):
    • 保证消息至少到达一次
    • 可能产生重复消息
  • QoS 2(只有一次):
    • 确保消息精确到达一次
    • 适用于计费系统等关键场景

遗嘱特性

通知客户端异常中断的机制

  • 工作机制:
    • 客户端首次连接时设置遗嘱消息
    • 异常断开时代理服务器执行遗嘱
  • 应用场景:
    • 网络不稳定导致的意外断开
    • 设备故障通知
  • 实现方式:通过心跳包检测连接状态,超时后触发遗嘱

MQTT消息报文

MQTT是应用层协议,需要借助TCP/IP协议进行传输,与HTTP/FTP协议类似

固定头部

用于区分多种消息类型(如连接、发布、订阅等)

  • 结构组成:

    • 首字节:表示MQTT消息的报文类型及控制标记

      • 高4位表示协议类型,对应16种消息类型

      • 常见类型:

        • 1:CONNECT(客户端连接请求)

        • 2:CONNACK(连接确认)

        • 3:PUBLISH(发布消息)

        • 8:SUBSCRIBE(订阅请求)

        • 12:PINGREQ(心跳请求)

        • 特殊值:14为DISCONNECT(断开连接),15为保留值

    • 剩余长度:标识消息报文的剩余部分长度

      • 低四位表示位域定义(仅PUBLISH消息有效):
        • DUP位(bit3):0表示首次发送,1表示重发消息
        • QoS位(bit2-1):
          • 00:最多发送一次(QoS=0)
          • 01:至少发送一次(QoS=1)
          • 10:精确发送一次(QoS=2)
          • 11:非法值,触发连接关闭
        • 保留位(bit0):固定为0
  • 功能特点:通过首字节的高4位和低4位分别承载不同类型的信息

可变头部

部分协议类型中存在,部分协议中不存在

  • 协议名称:固定为"MQTT"字符串,占用6个字节(byte 1-6),其中:
    • byte 1-2:长度标识(0x00 0x04)
    • byte 3-6:ASCII码分别为’M’(0x4D)、‘Q’(0x51)、‘T’(0x54)、‘T’(0x54)
  • 协议级别:byte 7表示协议版本号,值为4表示MQTT 3.1.1版本
  • 连接标志:byte 8包含7个控制位(从高位到低位):
    • User Name Flag:用户名标识
    • Password Flag:密码标识
    • Will Retain:遗嘱保留标志
    • Will QoS:遗嘱服务质量(2位)
    • Will Flag:遗嘱标志
    • Clean Session:清理会话标志
    • Reserved:保留位(必须为0)

MQTT可变头部

MQTT连接:在TCP连接建立后,客户端发送CONNECT报文(PSH,ACK标志),长度37字节

消息载体

包含消息的主要内容

一个仍在爬山的人