Eclipse Mosquitto

轻量级开源MQTT消息代理

概述

Eclipse Mosquitto是Eclipse基金会维护的轻量级开源MQTT Broker,采用C语言编写,以资源占用小、部署简单著称。支持MQTT 3.1.1和5.0协议,适用于嵌入式设备、边缘网关、树莓派、小型物联网项目。与EMQX等企业级Broker相比,Mosquitto更轻量,单机连接数通常在万级以内,适合资源受限或中小规模场景。支持TLS加密、用户名密码认证、ACL主题权限控制,可满足基本安全需求。在智能家居、工业边缘、原型验证等场景中广泛使用。

Mosquitto与EMQX的选型:Mosquitto适合连接数<1万、单机部署、资源受限场景;EMQX适合百万级连接、集群、规则引擎、多协议场景。Home Assistant、Node-RED等开源项目常推荐Mosquitto作为本地MQTT Broker,与EMQX形成"轻量本地+大规模云端"的搭配。

核心特性

轻量与跨平台

内存占用小,可运行在树莓派、嵌入式Linux、Windows、macOS。支持Docker部署。无额外依赖,安装配置简单。适合作为边缘或本地的轻量消息中枢。

协议与安全

MQTT 3.1.1、MQTT 5.0完整支持。TLS/SSL加密、用户名密码、ACL(按Topic控制读写权限)。支持匿名访问(可配置关闭)。可对接外部认证(如HTTP、MySQL插件)。

持久化与桥接

消息持久化、持久会话(Clean Session=0)、遗嘱消息(LWT)。支持Broker桥接,可将本地Topic转发到远程Broker,实现本地+云端的混合架构。

物联网典型应用

智能家居本地中枢:Home Assistant+Mosquitto,设备通过MQTT接入。工业现场边缘采集:边缘网关内嵌Mosquitto,本地设备汇聚后桥接到云端EMQX。原型验证与学习:快速搭建MQTT环境,验证设备通信。达希物联在物联网方案中,Mosquitto可作为边缘或小规模场景的MQTT选型,与物联网卡配合实现设备联网与消息传输。

单机 Broker 的会话与权限边界

代理进程承担的转发职责

Mosquitto 在系统里是一个 MQTT 代理进程:接受客户端连接,按主题把发布转给当前订阅者,并按服务质量完成这一跳的确认。它保存会话和少量需要持久的消息,业务档案和历史曲线都不在这里。主题是路由键,载荷对代理透明。QoS 0 尽力转发,QoS 1 要求至少一次到达代理,QoS 2 在客户端与代理之间做完整握手。这些保证停在这一跳,业务上是否只处理一次,要由订阅方用自己的幂等键决定。

持久会话用来记住干净会话标志关闭之后的订阅,以及尚未完成的确认。遗嘱在连接被判定异常断开时,由代理替客户端发到预先约定的主题。保留消息是某个主题上最后一条带保留标志的载荷,新订阅者一订阅就能拿到。这三份状态在重启后是否还在,取决于持久化文件有没有打开。只在内存里运行的进程,掉电后会话、未确认消息和保留消息会一起消失,现场会表现为“代理恢复了,设备却像刚装上一样”。

放在网关旁边时要满足的资源条件

它适合连接规模停留在单机可看管的范围、安装包要小、配置可以用文件维护的场合。网关、工控机或小型服务器上,用它把现场设备收成一个本地主题空间,再按需要桥接到别处,是稳妥的摆法。前提是有人看管并发连接、在途消息和磁盘上的持久化文件。慢订阅者会占满在途窗口,发布者随之被堵住。明文、TLS 和 WebSocket 应使用不同监听器,证书路径和协议版本写在对应监听器上。改一处全局项,并不自动覆盖每一个端口。

需要多节点共同分担连接,或要在代理内部做大规模规则计算时,应把 Mosquitto 留在边缘或试验环境,汇聚后的流量交给按集群设计的代理。它和Node-RED或Home Assistant放在一起时,代理只做主题转发,流程或自动化中枢负责把主题译成动作。两边不要各写一套互相矛盾的主题权限。

匿名接入、桥接环路和保留消息

匿名接入在试验台省事,端口一旦能被现场网络扫到,就等于把发布权交给任意客户端。上线前关闭匿名,改为用户名口令或证书,并用访问控制列表按主题前缀限制读写。列表写反很常见:设备拿到整棵主题树的订阅权后,就能听到其他设备的上行。主题应先有前缀,再写规则,避免先放行全树通配、打算以后再收紧。

桥接不是把两台代理变成一个集群。两端若互相桥接同一主题且不加前缀,一条消息会在两边来回放大,磁盘和带宽一起被打满。桥接方向、主题过滤器和本地前缀要成对设计,并在试验环境里用一条测试消息确认它只出现一次。保留消息的偏差是旧载荷一直被新订阅者当成当前值:设备已经停报,界面仍显示数小时前的温度。停用点位时应发布空的保留消息把旧值清掉,或在载荷里带上采样时间,由订阅方判断过期。干净会话和持久会话混用时,重连后订阅丢失,表现是代理在线却收不到数据。此时先核对干净会话标志,再查网络。


相关链接