MQTT 设备监控
后台常驻订阅你的 MQTT 设备,消息落进本地库。给 topic 起个人话名字,AI 就能听懂「客厅温度现在多少」。
它要解决的问题
MQTT 是个实时协议:你不订阅的时候,消息就流过去了。所以要问「设备昨天报过错吗」,得先有人一直在听。
Sigil 的做法是在后台常驻订阅并落库,AI 提问时读本地缓存、不碰网络——回答快,也不会因为一次提问就去连一遍设备。
同时把 topic 路径翻译成人话:配了别名之后,你说「客厅温度」,AI 自己找得到 home/living/temp。
添加 Broker
MQTT 页点「添加 Broker」,连接信息会作为 mqtt_broker 凭据加密存进金库——和 GitHub Token、邮箱授权码放在一起,共享文件夹、标签、过期提醒、备份导出。
| 字段 | 说明 |
|---|---|
| 主机 / 端口 | 端口不填按 TLS 取默认(8883 / 1883) |
| TLS | |
| Client ID | 不填则每次随机生成,避免多客户端撞 ID 互相踢下线 |
| 用户名 / 密码 | |
| 发布白名单 | 允许发布的 topic,支持 + # 通配符;留空 = 不限制 |
只支持原生 MQTT over TCP
不支持 WebSocket(ws:// / wss://)。QoS 支持 0 和 1。
凭据页的「测试连接」只建连、收到确认就断开,不订阅也不发布,对设备零副作用。
连接失败的提示都翻译成人话且不含账号密码,例如「TLS 握手失败(证书不受信任,或该端口其实不是 TLS 端口)」「broker 返回了非 CONNACK 报文(该端口可能不是 MQTT 服务)」。
设备总览
顶部一条统计:在线 topic 数、消息速率、历史条数、历史占用、已丢弃。
- 消息速率是最近 10 秒的平均值,所以一波集中上报后会持续显示约 10 秒
- 已丢弃不为 0 说明写入队列满了——订阅面超出磁盘吞吐,建议收窄订阅或关掉部分 topic 的「留历史」
最新值表每 topic 一行,覆盖写入、不随时间增长。新鲜度三态:
| 状态 | 判据 |
|---|---|
| 正常 | 10 分钟内有上报 |
| 陈旧 | 超过 10 分钟 |
| 离线 | 超过 30 分钟 |
实时消息流滚动显示最近 300 条,覆盖所有订阅(含没开「留历史」的),不落库。「暂停接收」只冻结滚动,后台连接与落库照常,不会丢数据。
页面底部有「试着问问 AI」示例问题,点一下把问题预填进 AI 对话页——但不自动发送,你可以先改。
配置:订阅、设备、存储
一个设置弹窗,三个页签,对应「收哪些 → 叫什么 → 留多久」。改动即时生效,不用保存。
订阅(面级)
填 topic 过滤器(支持 home/+/temp、cmd/# 这样的通配符),选 QoS,决定要不要「留历史」。
| 留历史 | 存什么 |
|---|---|
| 关 | 只维护最新值,每 topic 恒定一行,跑多久都只占一行 |
| 开 | 每条消息追加进历史表,默认保留 5000 条(0 = 不限) |
订阅上的设置是「这一片 topic 的默认值」,个别 topic 想单独决定就去「设备」页签覆盖。
改了订阅集合(过滤器 / QoS / 是否留历史)会重启该 broker 的连接,10 秒内对齐。改别名不会——改个设备名字不该让它短暂离线。
设备(点级)
给 topic 配别名、单位、分组,以及留历史的单独覆盖。
devices/+/temp → 「设备温度」 ← 一条通配覆盖所有
devices/gw-01/temp → 「网关温度」 ← 个别设备单独命名,精确优先多条通配都命中时,取最具体(pattern 最长)的那条。
分组(如「客厅」「一号产线」)会参与 AI 的模糊匹配:配了分组「客厅」+ 别名「温度」,你问「客厅温度」也能命中。
单位(如 °C、%RH)展示时拼成「客厅温度(°C)」。
模糊匹配相当宽容——「客厅温度」「客厅的温度」「客厅 温度」都能找到同一个设备,但「湿度」不会误命中「客厅温度」。
留历史覆盖是三态:跟随(用订阅的默认值)/ 留 / 不留。用来实现「温度留、心跳不留」。
面板还会列出还没命名的 topic,点一下直接填进新增行。
存储(全局)
历史消息保留天数,默认 7 天(0 = 永不按时间清理)。这里的设置对所有 Broker 生效。
「立即清理」按钮跑一次条数裁剪 + 过期删除,不必等后台任务(后台是启动 3 分钟后首次、之后每小时一次)。
两条约束都只作用于历史
最新值每 topic 恒定一行,不清理——清了就答不上来「设备现在什么状态」。
单条消息超过 8KB 时只记字节数不存正文,防止某个 topic 推固件包把库撑爆。
删除 broker 凭据时,它的四张缓存表一起清空。
AI 能做什么
五个能力,四个只读、一个需审批:
| 能力 | 走网络 | 说明 |
|---|---|---|
mqtt_device_status | 否 | 查单个设备最新值。可以直接传「客厅温度」这样的设备名 |
mqtt_latest_list | 否 | 列各 topic 最新值。默认只返回超过 10 分钟没上报的(疑似掉线) |
mqtt_history | 否 | 查历史。只有开了「留历史」的订阅才有数据 |
mqtt_subscribe_once | 是 | 订阅收一小段就断开(最多等 30 秒 / 50 条)。只能看订阅期间新到的消息 |
mqtt_publish | 是 | 发布消息,每次都要审批 |
发布是硬审批
topic 那头可能是继电器、网关、门锁——一条消息就是一次物理动作,retain 还会覆盖 broker 上的既有保留值。发错不可撤回,所以每次调用都要你在桌面端确认 topic 与内容。
除此之外还有两道闸:topic 不能含通配符;凭据上可以配发布白名单,不在名单里直接拒绝。
锁屏时会怎样
应用锁锁屏期间,MQTT 照常连接、照常收信落库。
这是刻意的:应用锁只锁界面,MCP 仍在正常服务 AI 客户端。锁屏的攻击者本来就够不到这条连接,断开换不来安全收益;代价却是实打实的——锁一晚等于一整夜的数据空洞,而 AI 此时仍能读到几小时前的值、把它当成现状。
断线重连
指数退避:1 → 2 → 4 秒…封顶 60 秒,连上后立刻归零。界面上显示「重连中 N s」倒计时。
某个 broker 的凭据不可用(解密失败、已删除)时只是跳过它并记日志,不影响其他 broker。
