两个版本同时运行
MQTT 3.1.1 与 MQTT 5.0 在同一个端口上同时工作,两种版本的客户端可以自由互通。编解码器处理全部 15 种报文,并校验变长整数的取值范围、重复属性和保留位。
这款代理服务器是按实用工具来做的:下面所有内容都在控制台里配置,改完立即生效,无需重启。
MQTT 3.1.1 与 MQTT 5.0 在同一个端口上同时工作,两种版本的客户端可以自由互通。编解码器处理全部 15 种报文,并校验变长整数的取值范围、重复属性和保留位。
完整的握手流程、QoS 2 下的重复抑制,以及重连后对未完成交互的重发。持久会话的离线队列可跨越代理服务器的重启。
保留消息的存储支持用空载荷清除,包括整条分支,另有 Retain Handling 0/1/2 和 Retain As Published。遗嘱在各种断开场景下都会发送,也支持版本 5 的遗嘱延迟。
双向主题别名、会话过期、Receive Maximum 与流量控制、最大报文长度、订阅标识符、通过 $share 的共享订阅、No Local、消息过期、带 UTF-8 校验的载荷格式标识、Content Type、Response Topic、Correlation Data、用户属性、每个报文中的原因码、服务端 DISCONNECT 以及 AUTH 报文。
版本、运行时间以及客户端、消息、字节和错误的各项计数,都以保留消息的形式发布。该分支默认关闭:通配符不会触及 $ 开头的主题,匿名客户端被拒绝访问整个命名空间,设置里的开关还能彻底停止发布。
汇总方块、机器健康状况(CPU、内存以及数据目录所在磁盘)、消息速率、流量和连接数的实时曲线、活跃主题、监听端口和事件流。
带单个客户端详情的会话表格,可断开连接和删除会话。另有一处展示生效中的订阅(含 MQTT 5.0 的全部选项)以及保留消息的存储内容。
消息和代理事件的实时数据流,可过滤、可暂停。你可以直接在控制台里带上版本 5 的全部属性发布一条消息——调试设备时很顺手。
俄语、英语、德语、西班牙语、法语、意大利语和中文。深色与浅色主题可即时切换,所选内容会记为控制台的默认设置。
控制台里就有一份带目录的指南,已翻译成全部七种语言,不必再到别处翻文档。
控制台的管理员只有一个,在 config.json 中定义,他只管理 Web 界面。MQTT 设备是另一份账号列表,各有自己的密码和权限。若试图创建与管理员同名的 MQTT 用户,会被拒绝。
一条规则由过滤器、访问方式(read、write、readwrite)和允许或拒绝的判定组成。规则自上而下检查,命中第一条即生效,且默认一律拒绝。占位符 $u 会展开为客户端名称,因此 $u/# 一条规则就能把每台设备限制在自己的分支里。顺序可以拖动调整。
内置列表、MySQL/MariaDB(EMQX 风格的表结构)、SQLite、支持文件重载的 CSV、JWT 以及外部 HTTP 服务。来源在控制台里切换:先用「测试」按钮验证,再在运行中生效。
密码以 PBKDF2-HMAC-SHA256 存储,迭代 21 万次并加随机盐。会话令牌和 API 令牌同样只保存哈希。外部来源可识别 plain、sha256、sha512、bcrypt 和 pbkdf2。
首次启动时会生成自签名证书,因此 :8883 立刻可用。用于生产环境时,请在配置里填入你自己的证书。
在发布时、订阅时或始终替换主题名称:用一个 MQTT 过滤器做低成本的初筛,配上正则表达式,以及带 $1…$9 分组的目标模板。可以使用 %u 和 %c,$share 前缀会被保留,UNSUBSCRIBE 也走同一套重写。控制台里有用于试验规则的沙盒。
客户端连接之后立刻获得订阅,完全不必发送 SUBSCRIBE。支持 %u、%c 以及版本 5 的全部选项,ACL 照常检查——不被允许的规则会被悄悄跳过,连接不会被切断。
按主题模式设置的规则可把数据流稀释到指定频率,或整条丢弃。稀释会保留最新值:每秒发十次的传感器变成每秒一条,而且是最新鲜的那条。规则详情会显示有多少消息命中、通过和被丢弃。
每个连接一个令牌桶:每秒消息数、突发量、每秒字节数、字节突发量。超出限制既不会断开连接,也不会丢消息——代理服务器会在下一次读取套接字前稍作停顿,TCP 关闭窗口,发送方自己就慢下来了。
主题 $delayed/{秒数}/{主题} 会被代理服务器暂存到期,格式与 EMQX 兼容。间隔从一秒到 49 天,确认立即返回,队列可跨重启保留,并在控制台里带倒计时显示。
代理服务器以客户端身份连接另一台 MQTT 代理服务器,并双向转发主题。地址、账号、TLS、协议版本,以及由过滤器 + 方向 + QoS + 前缀组成的规则都可配置。具备回环保护、自动重连、版本 5 下的 No Local,控制台中还有计数。
控制台能做的一切,凭 Bearer 令牌都能做到:统计、客户端、订阅、保留消息、发布、事件、用户、设置、桥接、规则、延迟消息、导入与导出。令牌也可以只读发放。
POST /api/users 创建设备并同时设置权限,PATCH 修改密码或 ACL,DELETE 删除。改动立即生效:代理服务器会自行切断该用户当前的连接,让新规则马上起作用。
与控制台同一个端口上提供 mqtt 子协议,浏览器客户端无需额外网关即可连接。RFC 6455 基于 net/http 实现,没有依赖。
设置、用户和规则可导出为单个文件并重新载入——迁移到另一台服务器时,不必手工重来一遍。
静态链接的纯 Go 可执行文件:不需要运行时,不需要 libc,也不需要外部数据库。在 Debian 和 Ubuntu 上开箱即跑,并可为 amd64、arm64 和 armhf 构建。
保留消息一有变化就立即写入,持久会话每十秒以及关闭时保存,延迟消息在入队时写入。过期的内容在启动时清理,并在日志中留下一行 state restored。
CPU 负载、已用内存和数据盘剩余空间,全部用标准库计算,不用 cgo,Linux 和 Windows 各有独立实现。超过 75 % 时进度条转为琥珀色,超过 90 % 转为红色。
随包附带 systemd 单元、nginx 配置和幂等的安装脚本:控制台只监听 localhost 并经由 nginx 对外发布,而 MQTT 端口直接工作。
版本号、构建编号和构建时间都写进了可执行文件,可在控制台、「关于」页面以及 -version 选项中看到——你随时都清楚跑的是哪一个。