功能

这款代理服务器是按实用工具来做的:下面所有内容都在控制台里配置,改完立即生效,无需重启。

协议

两个版本同时运行

MQTT 3.1.1 与 MQTT 5.0 在同一个端口上同时工作,两种版本的客户端可以自由互通。编解码器处理全部 15 种报文,并校验变长整数的取值范围、重复属性和保留位。

QoS 0、1 和 2

完整的握手流程、QoS 2 下的重复抑制,以及重连后对未完成交互的重发。持久会话的离线队列可跨越代理服务器的重启。

retain 与遗嘱消息

保留消息的存储支持用空载荷清除,包括整条分支,另有 Retain Handling 0/1/2 和 Retain As Published。遗嘱在各种断开场景下都会发送,也支持版本 5 的遗嘱延迟。

版本 5 的能力

双向主题别名、会话过期、Receive Maximum 与流量控制、最大报文长度、订阅标识符、通过 $share 的共享订阅、No Local、消息过期、带 UTF-8 校验的载荷格式标识、Content Type、Response Topic、Correlation Data、用户属性、每个报文中的原因码、服务端 DISCONNECT 以及 AUTH 报文。

$SYS 系统主题

版本、运行时间以及客户端、消息、字节和错误的各项计数,都以保留消息的形式发布。该分支默认关闭:通配符不会触及 $ 开头的主题,匿名客户端被拒绝访问整个命名空间,设置里的开关还能彻底停止发布。

Web 控制台

概览

汇总方块、机器健康状况(CPU、内存以及数据目录所在磁盘)、消息速率、流量和连接数的实时曲线、活跃主题、监听端口和事件流。

客户端与主题

带单个客户端详情的会话表格,可断开连接和删除会话。另有一处展示生效中的订阅(含 MQTT 5.0 的全部选项)以及保留消息的存储内容。

流量与发布

消息和代理事件的实时数据流,可过滤、可暂停。你可以直接在控制台里带上版本 5 的全部属性发布一条消息——调试设备时很顺手。

七种语言、两套主题

俄语、英语、德语、西班牙语、法语、意大利语和中文。深色与浅色主题可即时切换,所选内容会记为控制台的默认设置。

内置帮助

控制台里就有一份带目录的指南,已翻译成全部七种语言,不必再到别处翻文档。

访问与安全

两套彼此独立的体系

控制台的管理员只有一个,在 config.json 中定义,他只管理 Web 界面。MQTT 设备是另一份账号列表,各有自己的密码和权限。若试图创建与管理员同名的 MQTT 用户,会被拒绝。

主题 ACL

一条规则由过滤器、访问方式(read、write、readwrite)和允许或拒绝的判定组成。规则自上而下检查,命中第一条即生效,且默认一律拒绝。占位符 $u 会展开为客户端名称,因此 $u/# 一条规则就能把每台设备限制在自己的分支里。顺序可以拖动调整。

六种凭据来源

内置列表、MySQL/MariaDB(EMQX 风格的表结构)、SQLite、支持文件重载的 CSV、JWT 以及外部 HTTP 服务。来源在控制台里切换:先用「测试」按钮验证,再在运行中生效。

只存哈希,不存密码

密码以 PBKDF2-HMAC-SHA256 存储,迭代 21 万次并加随机盐。会话令牌和 API 令牌同样只保存哈希。外部来源可识别 plain、sha256、sha512、bcrypt 和 pbkdf2。

开箱即用的 TLS

首次启动时会生成自签名证书,因此 :8883 立刻可用。用于生产环境时,请在配置里填入你自己的证书。

规则与数据流

主题重写

在发布时、订阅时或始终替换主题名称:用一个 MQTT 过滤器做低成本的初筛,配上正则表达式,以及带 $1…$9 分组的目标模板。可以使用 %u 和 %c,$share 前缀会被保留,UNSUBSCRIBE 也走同一套重写。控制台里有用于试验规则的沙盒。

自动订阅

客户端连接之后立刻获得订阅,完全不必发送 SUBSCRIBE。支持 %u、%c 以及版本 5 的全部选项,ACL 照常检查——不被允许的规则会被悄悄跳过,连接不会被切断。

主题限流

按主题模式设置的规则可把数据流稀释到指定频率,或整条丢弃。稀释会保留最新值:每秒发十次的传感器变成每秒一条,而且是最新鲜的那条。规则详情会显示有多少消息命中、通过和被丢弃。

洪泛控制

每个连接一个令牌桶:每秒消息数、突发量、每秒字节数、字节突发量。超出限制既不会断开连接,也不会丢消息——代理服务器会在下一次读取套接字前稍作停顿,TCP 关闭窗口,发送方自己就慢下来了。

延迟发布

主题 $delayed/{秒数}/{主题} 会被代理服务器暂存到期,格式与 EMQX 兼容。间隔从一秒到 49 天,确认立即返回,队列可跨重启保留,并在控制台里带倒计时显示。

集成

代理之间的桥接

代理服务器以客户端身份连接另一台 MQTT 代理服务器,并双向转发主题。地址、账号、TLS、协议版本,以及由过滤器 + 方向 + QoS + 前缀组成的规则都可配置。具备回环保护、自动重连、版本 5 下的 No Local,控制台中还有计数。

REST API

控制台能做的一切,凭 Bearer 令牌都能做到:统计、客户端、订阅、保留消息、发布、事件、用户、设置、桥接、规则、延迟消息、导入与导出。令牌也可以只读发放。

从你的系统里开通设备

POST /api/users 创建设备并同时设置权限,PATCH 修改密码或 ACL,DELETE 删除。改动立即生效:代理服务器会自行切断该用户当前的连接,让新规则马上起作用。

WebSocket 上的 MQTT

与控制台同一个端口上提供 mqtt 子协议,浏览器客户端无需额外网关即可连接。RFC 6455 基于 net/http 实现,没有依赖。

导入与导出

设置、用户和规则可导出为单个文件并重新载入——迁移到另一台服务器时,不必手工重来一遍。

运维

一个文件,没有依赖

静态链接的纯 Go 可执行文件:不需要运行时,不需要 libc,也不需要外部数据库。在 Debian 和 Ubuntu 上开箱即跑,并可为 amd64、arm64 和 armhf 构建。

SQLite 存储

保留消息一有变化就立即写入,持久会话每十秒以及关闭时保存,延迟消息在入队时写入。过期的内容在启动时清理,并在日志中留下一行 state restored。

机器健康状况

CPU 负载、已用内存和数据盘剩余空间,全部用标准库计算,不用 cgo,Linux 和 Windows 各有独立实现。超过 75 % 时进度条转为琥珀色,超过 90 % 转为红色。

systemd 与 nginx

随包附带 systemd 单元、nginx 配置和幂等的安装脚本:控制台只监听 localhost 并经由 nginx 对外发布,而 MQTT 端口直接工作。

构建标记

版本号、构建编号和构建时间都写进了可执行文件,可在控制台、「关于」页面以及 -version 选项中看到——你随时都清楚跑的是哪一个。

以上一切,全部免费

设备数、消息数和订阅数都不受限制。

下载代理服务器