一、MQTT基础回顾:协议概述、发布/订阅模型、主题与通配符、QoS等级详解

各位同学,欢迎来到《MQTT遗嘱消息与保留消息应用实战》的第一章。

在正式开始之前,我想先聊聊MQTT这个协议。说实话,我最早接触MQTT是在做智能家居项目的时候。当时设备端资源紧张,HTTP太重了,WebSocket又太复杂。后来发现MQTT,简直像发现了新大陆——轻量、可靠、还支持双向通信。嗯,今天我们就从最基础的东西开始,把地基打牢。

1.1 MQTT协议概述

MQTT,全称Message Queuing Telemetry Transport,翻译过来就是「消息队列遥测传输」。名字挺长,但说白了,它就是一个轻量级的发布/订阅消息协议

为什么说它轻量?我举个例子。一个最简单的MQTT控制报文,头部只有2个字节。相比之下,HTTP的头部动不动就几百字节。你想想看,在那些只有几十KB内存的嵌入式设备上,这个差距有多明显。

MQTT有几个核心特点:

  • 基于TCP/IP:提供可靠的连接保障
  • 发布/订阅模式:解耦了消息的发送方和接收方
  • QoS机制:三种服务质量等级,按需选择
  • 遗嘱消息:设备异常断开时的最后通知
  • 保留消息:新订阅者也能获取最新状态

我个人习惯把MQTT比作一个「消息邮局」。你不需要知道信送到谁手里,只需要把信交给邮局(Broker),邮局会帮你分发给所有订阅了该地址的人。这个模型,就是发布/订阅。

1.2 发布/订阅模型

发布/订阅模型,是MQTT最核心的设计思想。它把通信双方彻底解耦了。

在MQTT的世界里,有三个角色:

  • 发布者(Publisher):发送消息的一方
  • 订阅者(Subscriber):接收消息的一方
  • 代理(Broker):消息的中转站

发布者不需要知道谁在订阅,订阅者也不需要知道谁在发布。它们只跟Broker打交道。我在项目中遇到过很多新手,总想搞明白「消息到底发给谁了」。其实没必要,你只要把消息发到正确的主题上,Broker会帮你搞定一切。

核心要点:发布/订阅模型的最大优势就是解耦。发布者和订阅者在时间、空间、流量上完全解耦。哪怕订阅者不在线,Broker也可以暂存消息(取决于QoS和配置)。

1.3 主题(Topic)与通配符

主题,就是MQTT中的「地址」。发布者把消息发到某个主题,订阅者订阅某个主题,Broker负责匹配。

主题的格式是分层的,用斜杠/分隔。比如:

home/livingroom/temperature
factory/line1/machine01/status
sensor/+/temperature

这里有个重要的概念——通配符。MQTT支持两种通配符:

通配符 含义 示例
+ 匹配单层主题 sensor/+/temperature 匹配 sensor/room1/temperature
# 匹配多层主题 home/# 匹配 home/livingroom/temperature

注意:通配符只能用在订阅时,不能用在发布时。我曾经见过有人试图用通配符发布消息,结果Broker直接拒绝了。记住,发布者必须指定一个明确的主题。

另外,主题的命名有一些约定俗成的规则。我个人建议:

  • 使用有意义的层级结构,比如 设备类型/位置/传感器
  • 避免使用特殊字符,除了斜杠和通配符
  • 不要以$开头,那是Broker保留的系统主题

1.4 QoS等级详解

QoS,全称Quality of Service,服务质量等级。MQTT定义了三个等级,分别对应不同的可靠性要求。

QoS等级 含义 可靠性 适用场景
0 至多一次 最低 传感器数据,丢失一两次没关系
1 至少一次 中等 控制指令,必须到达但可重复
2 恰好一次 最高 计费、交易等关键数据

QoS 0:说白了就是「发出去就不管了」。Broker收到消息后不会回复确认,发布者也不知道消息到底到没到。效率最高,但可能丢消息。我在做环境监测项目时,温度数据就用QoS 0,因为每秒都在上报,丢一两个没关系。

QoS 1:保证消息至少到达一次。Broker收到后会回复一个PUBACK。如果发布者没收到确认,就会重发。但问题来了——可能重复。你想想看,如果控制灯的指令重复了,灯就会闪一下。所以QoS 1适合那些「重复了也没事」的场景。

QoS 2:最严格,也最复杂。它通过两次确认(PUBREC、PUBREL、PUBCOMP)来保证消息恰好到达一次。开销最大,但最可靠。我曾经在金融支付项目中用过QoS 2,每一笔交易都不能多也不能少。

避坑指南:我曾经犯过一个错误——把所有消息都设成QoS 2。结果设备性能直线下降,Broker也扛不住。后来才明白,QoS的选择要权衡。能用0就别用1,能用1就别用2。别为了「保险」而牺牲性能。

另外,QoS还有一个重要的点——发布者和订阅者的QoS可以不同。比如发布者用QoS 1发消息,订阅者用QoS 0订阅,那么Broker会以较低的QoS 0转发给订阅者。这个规则叫「降级转发」,记住就行。

1.5 小结

好了,这一章我们回顾了MQTT的基础知识。从协议概述到发布/订阅模型,从主题通配符到QoS等级,这些都是后续学习遗嘱消息和保留消息的必备基础。

下一章,我们会正式进入遗嘱消息的实战。到时候我会分享一个真实的项目案例——设备异常断电后,如何通过遗嘱消息通知运维人员。嗯,那个案例挺有意思的,到时候细说。

今天就到这里。记住,基础不牢,地动山摇。把这一章的内容吃透了,后面的路就好走了。