理解 MQTT 协议,在智能家居设备上实现它:先走一遍决策树

智能家居玩到一定程度,总会遇到同一个问题:灯、传感器、开关、音箱各自为政,谁也不跟谁说话。MQTT 就是让它们互相传消息的一套通用语言。理解它不难,难的是搭的时候别把安全这一步省掉。下面这棵决策树,按顺序走完,你就知道自己家该怎么搭。

理解 MQTT 协议,在智能家居设备上实现它:先走一遍决策树

本文涉及的协议口径按 MQTT 5.0 标准与 Eclipse Mosquitto 官方说明核实,核实日期 2026-11-07;各家智能家居平台与 Broker 的具体安装细节未逐项核实,动手前以对应官方文档为准。

先弄清:MQTT 是什么

MQTT 是一套轻量的消息协议,名字里的字母不用背,记住它的工作方式就行:设备之间不直接对话,所有消息都经过一个中间人。这个中间人叫 Broker(代理),设备叫客户端。

一盏灯想告诉全屋“我被打开了”,它不是挨个去通知每个设备,而是把这条消息发给 Broker;所有关心这件事的设备,提前向 Broker 说一声“我要听这个话题”,Broker 就把消息转发给它们。发消息的叫发布,收消息的叫订阅,消息的分类名叫主题。

它很轻:消息头小、耗电少,对网络要求低。它是 OASIS 的标准协议,当前版本是 2019 年发布的 MQTT 5.0,老设备常用的 3.1.1 版本至今也能在大多数 Broker 上正常工作。

发布、订阅与主题:三个概念一次讲清

主题是 MQTT 里最重要的概念,它是一串用斜杠分层的地址,比如 home/livingroom/light/status。发布者往这个主题发消息,订阅者订阅这个主题收消息。

主题支持通配符,这是它好用的地方。订阅 home/livingroom/#,就能收到客厅下面所有主题的消息;订阅 home/+/light/status,就能收到所有房间灯的状态。井号代表后面所有层级,加号只代表一层,写错一个符号,收到的消息可能多一倍,也可能一条都收不到。

消息本身还分轻重。MQTT 有三个服务质量等级:0 级是发出去就不管,丢了也不补,适合不重要的状态上报;1 级是至少送到一次,可能会重复,适合大多数开关指令;2 级是恰好送到一次,最稳也最慢,适合不能重复执行的指令。

保留消息让新订阅者立刻拿到最新状态,遗嘱消息让 Broker 在设备突然断线时代发一条通知,家里用它来判断传感器是不是掉线了。

决策一:你家真的需要 MQTT 吗

先别急着装 Broker,回答三个问题。

  • 如果你的设备不到十个,而且全是同一个品牌,直接用这个品牌的 App 与自动化就够了,MQTT 是多余的复杂度。
  • 如果设备来自两三个品牌,但你只是想让它们联动开关,先看看你用的智能家居平台自带的集成能不能打通,能打通就不用 MQTT。
  • 如果设备越来越多、品牌越来越杂,或者你想自己写自动化逻辑,MQTT 就值得上了。它把设备之间的通信变成统一的主题,新增设备不用改旧设备的配置。

结论很简单:设备杂、想自己掌控、打算长期玩下去,这三条占两条,再往下走;否则先把现有平台的联动用熟。

决策二:选哪种 Broker

Broker 是整套系统的中枢,选它只看两点:你家里有没有一台长期开机的机器,以及你愿不愿意自己维护。

  • 家里已有 Home Assistant 这类中枢,优先用它自带的 Broker 插件,配置最少,设备发现也最顺。插件版本与具体设置以官方文档为准,本文未逐项核实。
  • 有一台长期开机的电脑或小主机,装 Eclipse Mosquitto。它是开源免费的老牌 Broker,体积小、文档全,是新手最常见的选择。
  • 没有长期开机的机器,先别搭。Broker 停机,全屋的 MQTT 消息就断了,设备之间立刻失联;先解决“有一台 24 小时开机的机器”这个问题。
  • 云端托管的 Broker 只适合测试和远程演示,日常家用不推荐:消息要绕到公网再回来,延迟高不说,断网就全停。

决策三:Broker 装在哪里,怎么才算最小可用

最小可用的意思,是先跑通一条消息,再考虑扩展。流程只有五步。

  1. 装好 Mosquitto,确认它在跑。装完先不要急着接设备,用自带的命令行工具发一条测试消息,再订阅同一个主题,看能不能收到。收不到就先排查本机问题,不要同时接十个设备一起找错。
  2. 给 Broker 一个固定地址。局域网里用固定 IP 或主机名,不要用每次重启都会变的动态地址,否则设备每次开机都要重新找 Broker。
  3. 创建账号密码,关掉匿名访问。Mosquitto 2.x 默认已经不允许匿名连接,但只要你手写过配置文件,就要亲自确认这一项,不能默认它已经关了。
  4. 只在局域网内监听。没有配置文件启动的 Mosquitto 只监听本机回环地址,这是安全默认值;一旦你写了监听配置,就要确认它没有顺手绑到所有网卡上。
  5. 先接一个设备,跑通再加下一个。第一个设备建议选最简单的开关或传感器,确认它上线、发消息、收指令都正常,再批量接剩下的。

决策四:设备怎么接入

设备接入就三件事:连上 Broker、订阅它要听的主题、发布它要说的消息。

拿一个温湿度传感器举例:它连上 Broker 后,每分钟往 home/bedroom/sensor/temperature 发一次温度;你的自动化平台订阅这个主题,温度超过设定值就开风扇。传感器不需要知道风扇的存在,风扇也不需要知道传感器是谁,它们只跟 Broker 打交道。

接入时容易踩三个坑:主题命名不统一,动手前先定一套规则写下来;客户端 ID 重复,两个设备共用一个 ID 会轮流掉线;QoS 乱设,状态上报用 0 级够了,开关指令至少用 1 级。

安全红线:这五条不能省

MQTT 的默认状态并不安全,这一段请逐字读完。

第一,明文传输是 MQTT 的出厂状态。IANA 注册的 1883 端口跑的是不加密的 MQTT,用户名、密码、每一条消息都是明文,出了局域网就完全暴露。

第二,不要把 Broker 端口直接暴露到公网。不要在路由器上把 1883 端口映射出去,不要图方便让手机在外面直连家里的 Broker。需要远程访问,走 VPN 回家,或者用支持加密的 8883 端口加 TLS 证书。8883 是 IANA 注册的 MQTT over TLS 端口,配合 TLS 1.2 或更高版本使用。

第三,改掉默认密码,账号分开给。每个设备用独立的账号密码,不要全屋共用一个账号;管理后台的密码不要用出厂默认值。账号泄露时,独立账号只影响一个设备,共用账号等于把全屋的钥匙一起交出去。

第四,权限按主题收紧。不要给每个设备订阅所有主题的权限,传感器只需要发布自己的数据主题,不需要订阅别人的控制主题。支持访问控制列表的 Broker 都可以按账号限制能发布和订阅的主题,用上它。

第五,保持 Broker 更新。Mosquitto 这类开源 Broker 会定期修安全问题,装好之后不是一劳永逸,隔几个月检查一次有没有新版本。本文未核实各发行版的具体更新方式,按你所用系统的官方说明操作。

这五条里如果只能记住一条,就记住第二条:Broker 不上公网。绝大多数家庭 MQTT 被入侵的案例,起点都是一个暴露在公网上的 1883 端口。

收尾:搭之前再对一遍清单

  1. 确认需求:设备杂、想自己掌控、打算长期玩,三条占两条再上 MQTT。
  2. 选好 Broker:有中枢用插件,有小主机装 Mosquitto,没有长期开机的机器先别搭。
  3. 跑通一条消息:固定地址、账号密码、局域网监听,先接一个设备验证。
  4. 安全五条全做到:不上公网、用 TLS 或 VPN、独立账号、按主题限权、定期更新。

需要把 MQTT 接进更大的智能家居方案时,可以对照本站另一篇用旧电脑搭家庭 NAS:先让一台机器长期稳定在线,再往上叠服务。搭系统时查文档,也可以看本批另一篇用 AI 在几秒内总结长文本。