做物联网这块五年,我最大的一个感受是:硬件选型决定你能不能采到数据,而数据方案决定这些数据到底有没有用。我参与过的项目里,十个有九个不是设备连不上,而是数据好不容易上来了,又乱、又丢、又查不动,最后大屏上的曲线根本不敢给客户看。所谓“物联网的数据方案”,说的就是这条从传感器产生数据,到数据最终变成业务能用的信息之间的完整链路——协议怎么选、模型怎么建、存哪里、怎么处理、怎么查。这篇文章不打算讲什么高深理论,就把我在几个设备远程运维类项目里反复趟过的坑和最终落地的做法完整拆给你看:为什么这么选、每一步怎么操作、以及出问题之后怎么排查。适合刚把设备调通、正准备搭数据平台的团队,也适合对时序数据入门感兴趣的后端开发参考。
1. 先想清楚:物联网数据方案到底在解决什么问题
很多团队一上来就急着选型,端口还没定就嚷嚷着要上什么数据库。我的建议是反过来的,先把你手头的设备数据分好类,想清楚哪些数据值钱、哪些数据只是噪声,再来谈方案。数据方案本质上是三件事:不丢、不乱、不慢。所有架构决策都围着这三件事转。
1.1 不同设备的数据节奏完全不同
做方案判断,首先要理解设备数据的“节奏”。我习惯把设备数据分成三类:
第一类是高频采样数据,比如振动、电流波形、瞬时流量,采样频率可能到每秒几十次甚至上千次。这类数据最花带宽和存储,但真正有价值的往往不是原始波形,而是从波形里算出来的FFT特征、RMS值、峰值。所以高频数据不能盲目全量上云,应该尽量在边缘侧做特征提取,只把特征值和压缩后的片段传上来。
第二类是常规过程数据,比如温度、压力、液位、能耗,采样周期通常一分钟到几秒一次。这类数据是业务分析的主体,适合全量采集和长期存储,也是时序数据库最拿手的场景。
第三类是事件数据,包括告警、开关动作、工单记录、设备上下线。事件数据是稀疏的、突发的,量不大但逻辑关系强,适合用关系型的结构来管理,并且要跟过程数据做关联。
为什么要把这个分类放在最前面?因为很多方案失败的根源就是一刀切:拿处理高频采集的思路去处理事件数据,导致消息风暴;或者拿业务数据库去存传感器高频数据,导致写入锁死。数据节奏不同,传输策略、存储策略、计算策略全都不一样。
1.2 三个设计目标的取舍
接着说我前面说的三件事。
“不丢”,指的是数据从设备产生到落库,任何一个环节都要有保障机制。无线环境下网络抖动是常态,设备离线几分钟很常见,所以协议要支持离线消息和重连补偿,网关要具备断网缓存的缓存能力。
“不乱”,指的是所有设备的数据格式、命名、单位、时间戳必须统一。我见过最崩溃的场景:一台设备温度单位是摄氏度,另一台是华氏度,还有一台把温度塞在字符串里传上来,加上时间戳用的是设备本地时间,导致同一个项目里数据根本没法横向比较。建模规范是数据方案的地基,地基歪了,后面所有分析都是空中楼阁。
“不慢”,包含写入速度和查询速度两层。物联网的写入是持续的、高吞吐的,存储选型不行,数据库的写入就会成为瓶颈;查询要能快速按时间范围、设备维度做聚合,否则大屏页面转半天出不来。
在这三个目标之外还有一个隐藏约束:成本。存储买的是容量和吞吐,传输买的是带宽和流量费,数据方案要在满足业务需求的前提下,把存储分层、把传输压缩、把保真度分级。不要什么都想存,存了又用不上的数据,直接就是烧钱。
2. 采集与传输:协议选型是源头,错了后面全是补丁
数据方案的第一站是设备怎么把数据送上来。这一步的选型基本决定了整条链路的稳定上限,因为协议一旦定死,后面的网关和平台都得围着它转。
2.1 为什么M系列轻量消息协议成了事实标准
在绝大多数物联网场景里,实际上MQTT已经是公认的事实标准,如果你还没有特殊理由,直接用它,这在跨厂商设备接入、云端接入层面都会省掉大量麻烦。
我简单给MQTT做个定位:它是一种基于发布/订阅模式的轻量级消息协议,走TCP长连接,非常适合设备这种网络不稳定的场景。设备端作为客户端发布消息到某个主题,平台端订阅这个主题就能收到数据,两者解耦。它有几个特性是物联网场景里不得不用的:
- 长连接复用,不需要像HTTP那样频繁握手,省流量也省电量;
- 支持QoS消息质量级别,从最多一次、至少一次到精确一次,按需选择;
- 内置遗嘱消息,设备异常掉线时能自动发布一条上下线状态消息;
- 支持持久会话,设备重连之后能补收离线期间积压的消息。
对比一下HTTP轮询:设备每隔几秒发一次GET或POST请求,实时性差、流量浪费严重,而且设备一多,服务端压力极大。CoAP虽然是为受限设备设计的UDP协议,但生态和工具链远不如MQTT成熟。Modbus这类工业总线协议更多是设备内部通信用的,需要在网关做协议转换后对接MQTT。
我整理过一个对比表格,方便你根据场景快速判断:
| 协议 | 方向 | 适合场景 | 实时性 | 流量开销 | 可靠机制 |
|---|---|---|---|---|---|
| MQTT | 设备到平台双向 | 主流物联网传输 | 秒级 | 低 | QoS、持久会话 |
| HTTP | 平台到设备/设备到平台 | 简单上报、管理接口 | 秒到分钟级 | 高 | 请求应答 |
| CoAP | 受限设备与网关 | 低功耗无线传感网 | 秒级 | 极低 | 确认消息 |
| Modbus | 设备内部采集 | 工业现场总线 | 毫秒级 | 低 | 无,需网关兜底 |
结论很直接:除非你整条链路都是短周期请求应答型应用,否则不要用HTTP做设备数据主通道。我在一个项目里见过用HTTP POST上报温湿度的方案,设备量到了几百台之后,服务端并发连接直接被打爆,最后整个采集模块推倒重做,代价非常大。
2.2 主题设计是数据方案的根
MQTT里主题是路由数据的核心,但很多初学者根本不重视主题设计。最常见的错误是把设备ID直接拼在主题里,比如device/abc123/data,然后平台上每个设备单独订阅一个主题。设备一多,订阅关系爆炸,broker内存和路由开销都扛不住。
我的设计习惯是采用“项目/设备类型/功能域”三段式结构,举个我自己的例子:
iot/aircompressor/101/metrics iot/aircompressor/101/alarm iot/aircompressor/101/event第一段是项目或租户标识,第二段是设备类型,第三段是具体的功能域。设备ID放在payload里,而不是主题里。这样平台侧只需要订阅iot/aircompressor/+/metrics通配符,就能收所有空压机的遥测数据;想只看某一台,再按payload里的设备ID过滤。主题层级保持在两到四级就够用了,层级越多,topic匹配的成本越高,对broker压力越大。
另外有个细节:主题尽量用稳定不变的名词,不要带时间戳或动态序号。我见过有人把时间戳放主题里(iot/device/20240601/data),看起来能区分周期数据,实际上完全不必要,还破坏了通配符订阅的语义。时间戳就该放payload或者消息属性里,主题只做静态路由。
2.3 QoS级别怎么选,别拍脑袋
MQTT的QoS有三个级别,很多人只知道个大概,真到项目里不知道选哪一个,干脆全部用QoS 1,结果发现消息拥塞、延迟飙升,又怪broker不行。其实这三个级别对应的是“最多一次”“至少一次”“精确一次”:
- QoS 0:消息发出后不确认、不重发,最快最省流量,但可能丢。
- QoS 1:保证至少收到一次,但可能产生重复消息,因为确认包丢了会重发。
- QoS 2:通过四步握手保证唯一性和不重复,代价是延迟和资源开销最高。
我自己的选择经验是这样的:周期性的遥测数据,比如每分钟上报一次的温湿度、压力,用QoS 0就够了,因为下一分钟的数据马上就来,丢掉一条不会对业务有实质影响,还能大幅减轻broker压力。开关状态、告警、设备控制指令这类“丢一条就出问题”的消息,用QoS 1。至于QoS 2,绝大多数场景我都不建议用,真正想保证精确一次,可以在应用层做去重,成本远低于QoS 2的协议开销。
还要提一个和QoS相关的坑:消息的“可靠”不能只靠QoS,还要配合会话设置。如果客户端设置了非持久会话,断线重连后就收不到离线期间的消息;如果要保证断线补发,客户端连接时必须使用持久会话,并且合理设置会话过期间隔,同时保留消息在broker上的时间要足够覆盖设备的最大离线时长。
3. 数据建模与存储选型:模型定错,后面全乱
数据到了平台之后,第一件事不是急着入库,而是先把数据模型想清楚。物联网数据的建模比单纯的表结构设计复杂,因为它涉及设备对象的描述、测点定义、时间维度,以及和业务对象之间的映射。
3.1 从“点表”到统一的测点模型
做设备接入的人对“点表”不会陌生:一个设备包含若干个测点,每个测点对应一个物理量,比如温度、转速、累计电量。点表本质上定义的就是设备的能力。数据方案要做的事,是把这些点表翻译成一个统一的物模型,让所有设备遵循同一套名字和单位规范。
我的物模型分三层:产品层、设备层、测点层。产品定义一类设备具备哪些测点,设备是产品的具体实例,测点则是实际的时序数据出口。举个例子,“空气压缩机”这个产品定义测点:出口压力(bar)、出口温度(℃)、运行时间(秒)、加载状态(布尔)。具体设备ac-101是产品的一个实例,上报的数据就按这套测点来。
上报的数据格式我强烈建议统一成JSON,并且固定字段名。一个实际的payload示例:
{ "deviceId": "ac-101", "ts": 1717200000000, "points": { "outPressure": 7.5, "outTemp": 86.2, "runSeconds": 52010, "loadState": true } }注意两点:一是时间戳ts使用毫秒级Unix时间戳且统一使用UTC时区,入库时按需转本地时区展示,千万不要让设备直接上报“2024-06-01 10:30:00”这种本地时间字符串,跨时区项目里这就是灾难来源;二是测点名统一用驼峰或下划线命名,单位在物模型里登记,payload里不重复带单位,避免“温度33℃”和“压力0.7kgf/cm2”这种带单位字符串在解析时出乱子。
3.2 时序数据库和关系库的分工
数据建模清楚之后,存储选型才有意义。物联网数据最核心的特点是:追加写入为主、数据带时间戳、写入量高频稳定。拿关系数据库存高频传感器数据,是个典型的“能跑但会慢慢跑死”的方案。几十台设备时MySQL毫无压力,几百台就频繁告警,几千台直接无法写入。原因在于关系库的索引、MVCC、行存储结构都是为频繁更新设计的,对这种持续高吞吐的追加型写入非常不友好。
时序数据库(TSDB)是为时间戳数据专门设计的存储引擎,它的核心优势两点:Columnar存储降低存储成本,配合压缩算法能压掉一半以上的磁盘占用;按时间分区做管理,保留策略到期直接删分区,不需要走复杂的delete操作。项目里我在用的几个常见时序数据库各有侧重点,你可以根据团队背景选:
| 数据库 | 特点 | 适合场景 | 注意点 |
|---|---|---|---|
| InfluxDB | 生态最成熟,类SQL查询,Grafana集成好 | 中小规模设备接入,快速出可视化 | 集群版收费,单机有写入瓶颈 |
| TimescaleDB | PostgreSQL扩展,支持标准SQL | 已经是PG阵营、需要SQL兼容 | 大数据量下需调优分区策略 |
| TDengine | 国产,写入吞吐高,自带超级表 | 大规模设备、工业现场 | 生态相对封闭,迁移成本要评估 |
我的经验是引入一个原则:高频时序数据进TSDB,事件类和业务类数据进关系库。比如设备遥测的每分钟一条的曲线数据进时序库;而告警工单、设备档案、用户权限这类强关系的结构化数据进MySQL或PostgreSQL。两边通过设备ID和时间戳做关联,各司其职。这也是目前主流物联网平台常见的双库架构。
3.3 保留策略与降采样,省钱的杠杆
时序数据的量增长非常快,一台设备一分钟一条遥测数据,一年就是52万条;一万台设备一年就是52亿条。如果全量原始数据永久保留,存储成本很快就把项目拖垮。我见过不少团队因为不敢删数据,最终存储费用失控。
正确做法是分层保真。我在项目里用的典型策略是:原始数据保留30天,之后只保留每分钟的均值;再往后按每小时汇聚一次,保留一年。这个思路就是降采样,把原始明细数据的精华提取出来,粗粒度保存,既保证长周期趋势分析的能力,又不至于无限膨胀。
以InfluxDB为例,实现这个策略的路径是:先创建两个库(或两个保留策略),一个存原始数据,保留周期短,一个存降采样数据,保留周期长,再用连续查询把它自动汇聚过去。实际的建库和保留策略语句大致是:
CREATE DATABASE iot_raw; CREATE DATABASE iot_downsample; CREATE RETENTION POLICY "rp_30d" ON "iot_raw" DURATION 30d REPLICATION 1 DEFAULT; CREATE RETENTION POLICY "rp_1y" ON "iot_downsample" DURATION 365d REPLICATION 1 DEFAULT; CREATE CONTINUOUS QUERY "cq_1m" ON "iot_raw" BEGIN SELECT mean("outPressure") AS "outPressure_mean", mean("outTemp") AS "outTemp_mean" INTO "iot_downsample"."autogen"."metrics_1m" FROM "metrics" GROUP BY time(1m), "deviceId" END;这段CQ的意思很好理解:每过一分钟就计算上一分钟内每个设备各测点的平均值,写入降采样库。这样原始库的数据过期清理后,历史趋势仍然完整,只是粒度变粗了。配好之后我基本不关心它,查询大屏的时候直接查降采样库,响应速度还快。
这里有一个必须提醒的坑:连续查询写进降采样库的测量名称最好不要和原始测量名称一样,不然查询时会出现同一段时间内有两套粒度的数据混在一起。我在一个项目里就踩过这个坑,大屏上曲线一会儿跳分钟粒度一会儿跳小时粒度,排查了很久才明白是序列合并的问题。
4. 端到端实操:从传感器数据到可视化大屏
前面说的是方法论,这块我把一套在项目中反复验证过的完整链路走一遍。你会看到从模拟设备发布数据开始,到消息中间件接收、数据采集器订阅、写入时序数据库、最后用可视化平台出图,每个环节怎么做、怎么配,都是可以直接照着抄的程度。
4.1 链路架构与组件选择
整套链路我习惯分成五段:
设备/网关 --> MQTT Broker --> 数据采集器 --> 时序数据库 --> 可视化设备端我用Python模拟,因为Python里paho-mqtt客户端最方便,且几乎所有设备网关都支持Python脚本环境。MQTT Broker我选了开源版EMQX,它在单机并发和规则引擎方面比Mosquitto更容易扩展。数据采集器用Telegraf或Node-RED,前者适合纯采集入库,后者适合还要做流式处理的场景。时序数据库用InfluxDB,可视化用Grafana。这套组合全部开源,搭建速度极快,一个下午能把整条链路跑通。
划分这五段的原因很简单:每段各管一件事,谁出问题查谁。不少小项目试图省掉采集器,让业务代码直接订阅MQTT再写库,设备量一上来,业务代码就成了瓶颈,MQTT消息积压,库写入也卡死。采集器独立出来之后,可以用消息缓冲和批量写入快速消费,彻底解耦。
4.2 发布端:模拟设备上报数据
模拟设备的代码我尽量写得简单,核心是建立一个连接、发布一条消息。以刚才空压机设备为例,Python代码如下:
import json import time import random from paho.mqtt import client as mqtt broker = "127.0.0.1" port = 1883 device_id = "ac-101" topic = "iot/aircompressor/101/metrics" client = mqtt.Client(client_id=device_id, clean_session=False) client.username_pw_set("device", "device_pwd") client.connect(broker, port, keepalive=60) client.loop_start() while True: payload = { "deviceId": device_id, "ts": int(time.time() * 1000), "points": { "outPressure": round(random.uniform(6.8, 7.9), 2), "outTemp": round(random.uniform(72.0, 95.0), 2), "runSeconds": int(random.uniform(50000, 60000)), "loadState": random.random() > 0.3 } } client.publish(topic, json.dumps(payload), qos=0) time.sleep(5)三个细节说明下:第一,clean_session=False表示使用持久会话,设备断线重连后broker能继续给它补发离线期间的消息,配合遗嘱消息就能做到可靠的上下线感知;第二,keepalive=60表示如果60秒没有消息往来,MQTT协议层会发送PINGREQ心跳保活,一般建议设成设备上报周期的一到两倍,太短会白白增加无效心跳流量,太长会导致断线检测延迟增大;第三,我故意用qos=0发布遥测,因为高频周期数据价值密度低,偶发丢弃可接受,这也呼应了前面说的QoS选型。
设备端如果存在弱网环境,不能只依赖MQTT,还需要在网关侧做本地缓存。具体做法是在网关上加一层文件缓冲或者本地时序存储,MQTT断线期间数据先写本地,恢复连接后再按序补送,避免大量数据在网络恢复瞬间同时轰向broker。
4.3 订阅端配置:Telegraf写入InfluxDB
设备数据到了broker之后,采集端要把它消费下来写库。Telegraf是InfluxData推出的指标采集器,它的MQTT消费者插件把订阅、解析、入库封装成一条配置,开销很低。
我的Telegraf配置节选如下:
[[inputs.mqtt_consumer]] servers = ["tcp://127.0.0.1:1883"] topics = ["iot/#"] qos = 0 client_id = "telegraf_collector" username = "collector" password = "collector_pwd" data_format = "json" [[inputs.mqtt_consumer.topic_parsing]] topic = "iot/aircompressor/+" measurement = "_/_/measurement" tags = "_/_/device_kind" [outputs.influxdb] urls = ["http://127.0.0.1:8086"] database = "iot_raw" retention_policy = "rp_30d" flush_interval = "5s" batch_size = 2000这里有几个容易踩的配置细节:topics = ["iot/#"]用通配符订阅所有主题,比逐个订阅节省broker路由开销;qos要和消息重要程度匹配,遥测消息qos=0没问题,但告警和事件主题最好单独开一个采集器实例用qos=1,保证不丢;最关键的是flush_interval和batch_size,Telegraf默认flush间隔可能过大,导致消息在内存里积压,我调成5秒刷一次、2000条一批,既保证了入库延迟可控,又减少了频繁小批量写入对时序库的压力。
如果不想引入Telegraf这个环节,用Node-RED也可以,它把MQTT输入、JSON解析、InfluxDB输出拖成一条流,几十秒就能搭好。我用Node-RED多的地方是还要做规则过滤的边缘场景。比如只允许合法设备ID的消息入库,或者对越限的数据打标签,在Node-RED里加一个function节点处理json串,比在Telegraf里写解析脚本直观得多。
4.4 查询端:Grafana出图与常用时序查询
数据入库之后,最后一步是可视化。Grafana接入InfluxDB作为数据源很简单,关键是查询语句要会写。在面板的Query编辑器里,我常用的两个查询模板:
按设备查最近24小时的出口压力曲线:
SELECT mean("outPressure") FROM "metrics" WHERE "deviceId" = 'ac-101' AND time >= now() - 24h GROUP BY time(5m) fill(null)这里GROUP BY time(5m)把原始数据按5分钟窗口聚合成均值,曲线出来会平滑很多,大屏加载也更快。如果不需要平滑,直接去掉GROUP BY子句查原始值也行。
跨设备对比同一时间的平均温度,按设备分组:
SELECT mean("outTemp") FROM "metrics" WHERE time >= now() - 1h GROUP BY "deviceId"这类查询在大屏上就是多设备曲线对比,能一眼看出哪台设备运行异常。如果查询速度慢,优先检查是不是没有按时间范围限制,或者是标签基数过大。时序数据库的索引和标签设计息息相关,设备ID这种高基数标签建议打在最细的measurement维度,而不是每条数据都写垃圾标签。
Grafana面板左上角的变量可以做成设备下拉框,用SHOW TAG VALUES FROM "metrics" WITH KEY = "deviceId"填充,这样一张面板就能切换所有设备,不用每台设备复制一个面板,这是做很多台设备大屏时最实用的技巧。
5. 高频故障实录:数据方案运维排错手册
方案再好,跑起来总会出幺蛾子。下面这些问题是我在多个项目里真实遇到过的,按问题现象、排查路径、解决办法三条线整理,你可以把这个小手册直接贴进项目wiki。
5.1 现象一:大屏曲线突然缺了一段,数据丢了
这是最让人头皮发麻的问题。排查时不要一上来怀疑数据库,要沿着链路一段一段查。我的排查顺序是:数据生成端有没有异常退出,模拟设备进程是不是被系统杀掉了,查看轨迹日志;broker侧看主题订阅数和活跃连接数是否正常;采集器侧看输入指标有没有波动,重点看MQTT消费速率和入库行数是否对齐。
真实原因往往是两类:一类是消息中间件配置了最大消息大小,超长的payload被静默丢弃;另一类是设备端重连之后,主题订阅没有重新建立,或者会话过期间隔设置过短,导致离线期间的消息被清理。前者把max_packet_size调大并加告警,后者把session expiry设成设备可能的最大离线时长,比如48小时。
5.2 现象二:数据时间戳混乱,两条曲线前后颠倒
时序数据最怕的就是时间错乱。我踩过的坑是设备端本地时钟不准,设备离线一段时间后重连,上报时间戳用的是本地时间,而网关入库用的是当前时间,两套时钟混在一起,查询结果自然乱套。
解决办法的核心是:平台入库时间统一以设备生成的业务时间戳为准,不要自己额外生成一个写入时间覆盖它。设备侧要支持NTP对时,并且在物模型里声明时间戳字段语义。如果设备确实没有可靠时钟,那么网关在转发时补上接收时间戳,平台侧要把“设备业务时间”和“平台接收时间”两个字段分开存,防止将来排查问题时无从下手。此外,如果消息乱序到达,临时处理可以在查询层面用fill(linear)做线性插值,长期方案是在写入端对同一设备的同测点做乱序排序或使用支持乱序写入的时序引擎。
5.3 现象三:设备量增长后,数据库写入卡死、查询暴涨
这是一个经典的可扩展性问题。设备从几十台涨到几百台时,写入开始明显变慢。首先要确认数据库的版本和部署模式,如果是单机InfluxDB,写入瓶颈可能在磁盘IO,而不是CPU。解决手段有三个,按优先级排列:
第一,确认采集端的批量写入是否生效。Telegraf的batch_size如果太小,库会频繁处理小写入请求,写吞吐上不去。我把批量调到5000条、flush间隔压到5秒之后,同一台机器上写入吞吐提升很显著。
第二,检查tags的基数。有些时序库对tag基数很敏感,比如每条消息都带上动态变化的高基数标签(如CPU占用、随机批次号),索引会被撑爆,写入变慢、查询也变慢。高基数数据应该放在field里,低基数元数据才放到tag里。
第三,实在扛不住就扩展。单机方案换成集群部署,或者给TSDB前面加一层Kafka缓冲,统一以大批次的方式从Kafka消费写入,把流量尖峰削平。这在工业现场尤其有用,因为设备上报经常存在整点齐发、批量上线导致的流量潮汐。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 快速处理方式 |
|---|---|---|
| 消息时有时无 | QoS设置不当或订阅未匹配 | 按数据价值选QoS,检查通配符订阅 |
| 离线数据补不上 | 非持久会话或会话过期 | 开启持久会话,调大会话过期间隔 |
| 入库行数远少于消息数 | 采集器配置了错误主题或解析失败 | 核对topic与JSON解析格式,看采集端日志 |
| 时间轴乱序 | 设备时钟不准、乱序到达 | 设备NTP对时,业务时间戳为准,引擎乱序处理 |
| 查询很慢 | 查询未限时间、tag基数过大 | 加时间范围,清理高基数tag,查降采样库 |
| 存储增长异常 | 缺少保留策略与降采样 | 配置RP和连续查询,分层存储 |
| 写入报超时 | 批量太小、磁盘慢、单机瓶颈 | 增大批量写入,检查磁盘IO,考虑加Kafka缓冲 |
| 同一设备数据重复 | 采集端重复订阅或重传 | 检查客户端订阅数,应用层按时间戳去重 |
上面这张表我基本贴在每个项目的告警群里,出现问题时直接对号入座,能省下大量排查时间。
最后再分享一个我自己反复验证的经验:数据方案不要追求一步到位,但有两个底线一定要守住——设备时钟必须可信,原始数据必须有保留周期内的完整落库。只要这两点守住,哪怕将来要换存储、换可视化,数据都在,方案随时可以优化;要是这两点守不住,再华丽的平台也只是一块只能看不能信的大屏。你先从一条设备到一张曲线把链路走通,再逐步加设备、加规则、加告警,这个方案就是你的了。