高速公路智能运维平台架构设计与告警工单闭环实践
1. 高速公路智能运维平台到底在解决什么问题
干了几年交通信息化,最大的感受是:高速公路这条“线”上的设备,比大多数城市级项目都难伺候。一条几百公里的路段,横跨平原、山区、隧道群、特大桥,沿线分布着摄像机、情报板、车道指示器、隧道风机、照明回路、消防泵组、ETC门架、气象站、边坡位移计,少则几千台,多则几万台设备。它们不像机房里的服务器,有恒温恒湿、有专人值守;它们常年暴露在风吹日晒、雷击、粉尘、震动里,坏了没人立刻知道,等知道的时候往往已经堵成一锅粥。
高速公路智能运维平台要干的,就是把这条线上所有“哑设备”变成“会说话的设备”,把运维从“人找故障”变成“数据推故障”。它不只是一个监控大屏,也不是简单地把几个子系统拼在一起,而是一套覆盖设备接入、状态感知、异常告警、工单派发、养护决策的完整链路。做这个方向的,有交通机电集成商、有做IoT平台的技术团队、也有路段管理单位的信科部门,不管你是哪一类,下面这些内容基本都能直接对上号。
我见过不少项目,招标文件写得漂亮,验收时大屏很炫,但真正跑一年下来,运维人员还是靠电话和微信群报故障。问题不在于技术不行,而在于平台没解决“最后一公里”——告警准不准、工单派得动派不动、数据能不能扛住断网。这篇就把我在实际项目里踩过的坑、验证过的方案、以及基于常见工程实践的补充细节,尽量说透。
2. 平台整体设计思路与技术选型拆解
2.1 高速公路运维场景的特殊性决定了架构长什么样
先把场景特征摆清楚,架构才有依据。我总结下来是四句话:点多线长、无人值守、多源异构、环境恶劣。
“点多线长”意味着通信链路是短板。很多路段的机电设备通过光纤环网连接,但隧道口、边坡、桥梁下方的监测点往往是无线回传,链路抖动是常态。“无人值守”意味着设备必须能自诊断、断网自缓存,恢复后自己补传,不能指望现场有人手动重启。“多源异构”体现在协议上,视频走国标联网协议,机电设备走 Modbus 或 OPC UA,结构监测传感器各有各的私有协议,新老设备混装是常态。“环境恶劣”则直接决定了硬件选型和防护等级,路侧机箱不做到 IP65 以上、不做防雷,夏天一场雷雨就能批量下线。
基于这四点,我倾向的架构是分层解耦的:感知层负责采,传输层负责送,数据层负责存和算,应用层负责人看。层与层之间用标准协议和消息总线隔开,任何一层换技术栈,都不至于把整个系统推倒重来。这个思路看着朴素,但真到了要替换视频分析厂商或者换时序数据库的时候,你会感谢当初的分层。
2.2 五层架构的职责边界与关键组件选型
把架构拆成五层,每层说清楚它该干什么、不该干什么,这是避免后期扯皮的关键。
| 层级 | 核心职责 | 常见组件 | 不该干的事 |
|---|---|---|---|
| 感知层 | 采集设备状态、视频、环境量 | 摄像机、雷达、传感器、边缘盒子 | 不做长期存储、不做跨路段关联分析 |
| 传输层 | 数据可靠回传、断点续传 | 光纤环网、工业交换机、无线回传 | 不做业务逻辑判断 |
| 数据层 | 接入、清洗、存储、计算 | 消息队列、流计算、时序库、对象存储 | 不直接面向最终用户 |
| 算法层 | 异常检测、趋势预测、事件识别 | 规则引擎、时序模型、视觉模型 | 不承担实时控制指令下发 |
| 应用层 | 一张图、告警、工单、报表 | Web端、移动端、大屏 | 不绕过数据层直连设备 |
这张表看起来简单,但我在评审会上见过太多“把算法塞进边缘盒子、把告警逻辑写在应用层”的方案,最后的结果就是规则改了要发版、模型更新要停机。职责分清楚,后面维护成本能降一大截。
2.3 数据层选型:时序库为什么比关系库更合适
高速公路运维的数据,本质上是带时间戳的测点序列。一个两万测点的路段,如果每个测点10秒采一次,一天就是:
- 测点数 20000 × 每天采样次数 8640 = 1.728 亿条记录/天
- 按每条约 50 字节(含时间戳、测点ID、值、质量码)估算,原始数据约 8.6 GB/天
- 时序库压缩比通常在 5:1 到 10:1 之间,压缩后约 0.9~1.7 GB/天,一年下来 300~600 GB
这个量级用 MySQL 硬扛,写入会先崩,查询更是灾难。所以我一般直接上时序库,选型上看几个维度:
- TDengine:国产、集群版成熟、自带超级表模型,测点量大时优势明显,压缩率高
- InfluxDB:生态好、查询语言友好,单机性能强,但集群版是商业授权
- ClickHouse:查询分析极快,适合做大范围统计报表,但写入需要自己封装,不是纯粹的时序库
实测下来,如果团队里没有专门的数据库运维,TDengine 的部署和运维成本最低;如果已经有一套 ClickHouse 在大数据平台里跑着,直接复用也行,只是要自己设计表结构和写入链路。
消息中间件这块,我的分工习惯是:设备侧用 MQTT 接入,平台内部用 Kafka 流转。MQTT 协议轻量、适合弱网、支持 QoS 和遗嘱消息,正好匹配路侧设备的不稳定链路;Kafka 负责扛住平台内部的高吞吐和削峰填谷。中间用规则引擎桥接,不要在设备侧直接连 Kafka,那会让边缘设备的内存和心跳管理变得非常麻烦。
2.4 边缘和云的分工:什么东西必须放在路边
这个问题我被问过无数次:“视频分析到底放边缘还是放中心?”答案取决于带宽和实时性。
假设一段路有 200 路高清摄像机,按 1080P、4 Mbps 码流算,全部回传中心需要 800 Mbps 的持续带宽。而这段路的光纤环网可能只有 1 Gbps,还要承载收费、电话、广播等业务,根本不够。所以视频结构化必须在边缘完成,边缘盒子只把结构化结果和事件抓拍图回传,一路事件图片按 300 KB 算,一天抓 200 张也就 60 MB,200 路合计 12 GB/天,带宽压力瞬间降到可接受范围。
而跨路段的关联分析,比如“同一辆车连续经过三个门架的时间异常”,这种必须放在中心做。边缘算力有限,做不了全局比对。我的原则是:毫秒级响应、带宽敏感、隐私敏感的放边缘;需要全局视野、需要历史数据、需要复杂模型的放中心。中间用统一的数据格式对接,边缘上传的结果字段要在项目初期就定死,不然后期对接会让双方都痛苦。
3. 核心功能模块拆解,哪些细节最容易翻车
3.1 设备接入与数据归一化:编码体系是地基
平台接入的第一道难关不是协议,是编码。同一条路上,养护部门用一套桩号,收费部门用另一套桩号,监控系统里又是按摄像机编号来定位。如果没有统一的设施编码体系,后面所有告警和工单都会变成“某处设备故障”,运维人员根本找不到位置。
我的做法是建立三层编码:路段编码 → 设施类型编码 → 单体设备编码。路段按行政区划和线路编号组合,设施类型按国标分类(监控、收费、通信、供配电、照明、通风、消防),单体设备用“设施类型 + 桩号 + 流水号”生成。桩号统一换算成“线路号 + 公里数 + 米数”的数值形式,方便做区间查询,比如“查询 K120+000 到 K125+000 之间所有隧道风机”。
点位映射表是另一个高频坑点。设备的寄存器地址和平台测点ID之间要维护一张映射表,我建议这张表用配置文件或者数据库表管理,千万不要硬编码在代码里。原因很简单,现场调试时改地址是家常便饭,硬编码意味着每次都要重新发版。用 YAML 配置是常见做法,改完热加载即可:
这张表写清楚,后面不管是算法同学要用数据,还是运维同学要核对现场,都能对上。
3.2 告警引擎:从死阈值到动态基线
最原始的告警就是“电流大于 10 安就报”,这在夏天和冬天会呈现完全不同的误报率,因为环境温度本身就影响电机负载。我一般做三层告警策略:
第一层是硬阈值,用于保护类场景,比如温度超过 85 度、电压低于额定值 15%,这种必须立刻报,不容商量。
第二层是统计基线。用滑动窗口计算均值 μ 和标准差 σ,超过 μ + 3σ 才报。窗口长度按业务周期定,环境温度这种有明显日周期的,窗口至少取 24 小时,或者用 STL 分解把周期分量剥离掉再判断残差。裸用 3σ 在非平稳序列上误报率会很高,这一点我在隧道照明回路上吃过亏——白天和夜间的电流基线差了将近一倍。
第三层是趋势预测。用 EWMA 或者简单的线性回归外推,提前预判劣化。比如电缆绝缘电阻缓慢下降,硬阈值可能几个月都不触发,但趋势外推能提前两周预警。
告警抑制是另一个必须做的东西。风机启动瞬间电流冲击会触发过流告警,如果不在规则里加“启动后 30 秒静默窗口”,运维人员的手机能被炸掉。抖动抑制也很关键,状态量在阈值边缘来回跳动时,要设置去抖次数,比如连续 3 次越限才确认告警。还有告警风暴抑制,当一条链路断掉导致几百个测点同时失联,平台应该只报一条“链路故障”的父告警,把子告警挂上去,而不是发几百条消息。这个逻辑我在多个项目里验证过,是提升运维信任度的关键动作。
3.3 视频事件检测的工程化落地
视频 AI 事件检测,模型选型反而是最简单的一环,YOLO 系列、检测加跟踪的组合已经很成熟。真正难的是误报控制。
我在实际项目里统计过,误报来源排前三的是:夜间车灯强光导致目标丢失、雨雾天气下的虚警、以及大车遮挡造成跟踪 ID 跳变。针对这些,几个有效的手段:
- 多帧确认:单帧检测到抛洒物不报,连续 5 帧以上同一位置有静止目标才报,误报能降一个数量级
- 区域屏蔽:把龙门架、路灯杆、广告牌这些固定干扰源在画面里框出来,不参与检测
- 天气自适应:接入气象站数据,雨雾天自动提高置信度阈值,宁可漏报也不误报,因为运维人员对误报的容忍度远低于漏报
- 目标尺寸过滤:小于一定像素面积的物体直接忽略,避免把飞鸟、落叶当事件
算力规划也要提前算清楚。一个边缘盒子标称 32 TOPS,实际跑 1080P、25 帧的视频分析,单路大概占用 1.5~2.5 TOPS,考虑余量和散热降频,稳妥做法是按标称算力的 60% 来规划路数,32 TOPS 的盒子带 8 到 12 路比较合适。超配的后果就是盒子长期高负载、温度飙到 80 度以上,夏天直接宕机。
3.4 养护决策与工单闭环
告警只是开始,能不能把工单派下去、干完能不能闭环,才是平台价值的体现。
我的设计是四级流转:告警生成 → 自动分级 → 工单派发 → 结果回填。分级按影响范围来定,比如“单点摄像机离线”是三级,影响局部监控;“隧道照明全灭”是一级,直接影响行车安全。派发要对接值班表,按路段归属和人员排班自动找人,找不到人就升级到班组长,这个升级机制必须在配置里写死,不能靠人盯。
工单闭环之后,数据要回流到资产台账,形成设备的“病历本”。一台风机三年报修了多少次、换了什么件、修完之后的运行曲线怎么样,这些数据积累下来,才有可能做真正的预测性维护。很多平台缺的就是这一步闭环,数据只进不出,台账永远是静态的。
4. 动手搭一套最小可用平台
4.1 组件清单与部署拓扑
这套最小可用版本,目标是用最少的组件跑通“采集—存储—告警—展示”全链路,适合做技术验证或者小路段试点。清单如下:
- 接入层:EMQX(MQTT Broker,开源版够用)
- 流转层:Kafka(单节点三副本或者三节点集群,看规模)
- 流计算:Flink(做清洗、窗口聚合、规则匹配)
- 存储层:TDengine(时序数据)+ MinIO(图片和文件)+ PostgreSQL(台账和工单)
- 应用层:后端服务 + Web 前端 + 移动端小程序
部署上我建议先单机再集群。技术验证阶段全部塞一台 16 核 64G 的机器上跑,除了 Flink 稍微吃资源,其他都轻松。等验证通过再拆开部署,这样能省掉大量前期的调优时间。
4.2 数据接入链路配置实操
设备侧通过 MQTT 上报,主题按“路段/设施类型/设备ID”分层,这样订阅和权限控制都方便:
Flink 侧做清洗和窗口聚合,把原始点位数据打上质量码,同时计算 1 分钟均值,避免全量原始数据都落库:
TDengine 建表时,我习惯用超级表 + 子表的模型,一个测点一张子表,超级表按测点类型建,这样写入和查询都高效:
4.3 告警规则配置示例
规则我用 JSON 配置,方便动态加载。下面这条是“风机电流异常 + 启动静默窗口”的组合规则:
其中有几个参数值得说明。k: 3 是统计学的三倍标准差,覆盖约 99.7% 的正常波动;debounce_count: 3 是为了过滤瞬时抖动;dedup_window_sec: 300 保证同一条告警五分钟内只发一次,避免刷屏。这些数值不是拍脑袋来的,是根据现场三个月的正常数据反复调的,新上线的路段建议前两个月先用“只记录不推送”的观察模式跑,把误报摸清楚再开推送。
4.4 可视化与移动端推送
大屏这块,我不建议一上来就搞三维实景,成本高、维护难、对运维帮助有限。一张二维 GIS 图加上分层筛选,反而更实用:按路线展示设备分布,红黄绿三色显示状态,点开弹窗看详情和历史曲线。运维人员真正高频用的是移动端,所以告警推送必须做到“点开就能看到设备位置、历史告警、一键派单”,这三步要在两次点击内完成,超过三次就没人用了。
推送通道上,短信和 App 推送各有场景。一级告警用短信加电话,保证叫醒;二三级告警走 App 推送就够了。这里有个细节:推送内容要带设备名称和桩号,不要只发设备 ID,运维人员大半夜收到“设备 TUN-A-001 告警”是没法直接行动的。
5. 上线后最容易踩的坑与排查实录
5.1 数据断链排查速查表
数据断链是最高频的问题,我整理了一张速查表,基本能覆盖八成情况:
| 现象 | 常见原因 | 排查动作 |
|---|---|---|
| 单台设备无数据 | 现场断电、网线松、防护箱进水 | 查设备心跳、远程 ping、看现场照片 |
| 整段链路无数据 | 光纤环网断点、交换机重启 | 看交换机端口状态、查环网告警 |
| 数据时断时续 | 无线信号弱、设备供电不稳 | 看丢包率、查电压曲线 |
| 数据有值但不变 | 传感器卡死、采集程序挂起 | 对比同类型设备、重启采集服务 |
| 时间戳错乱 | 设备未同步时间 | 检查 NTP 配置、看时区设置 |
时间同步这个问题要单独说。很多路侧设备默认不开 NTP,时间能漂几分钟甚至几小时,结果是数据落到时序库里排序全乱,告警判断也跟着错。我的做法是在接入层做一次时间戳校验,如果设备上报时间和平台时间偏差超过 30 秒,就用平台时间覆盖,同时打上质量标记。
5.2 误报漏报的四个典型成因
误报和漏报是运维人员对平台信任度下降的头号原因,我总结的经验是四个:
一是阈值一刀切。 不同路段的同一型号设备,因为环境差异,正常值范围能差 20% 以上。解决办法是按路段甚至按设备做基线,别用全局统一阈值。
二是告警风暴。 一台交换机故障,可能带出几百条设备离线告警。前面说的父子告警机制必须做,否则运维人员的手机真的会被打爆。
三是状态量抖动。 有些老设备的开关量输出不稳定,在临界点来回跳。除了去抖计数,还可以加“状态保持时间”,比如状态变化后至少保持 10 秒才确认。
四是模型漂移。 视频分析模型在部署后,随着季节变化、镜头污染、光线角度改变,准确率会缓慢下降。建议每月做一次抽样复核,用人工标注的样本评估准确率,低于阈值就重新训练或者微调。
5.3 平台自身的稳定性问题
平台跑得越久,越容易暴露自身的问题。我遇到过的几个典型:
- 时序库磁盘写满:默认保留策略没设置,数据无限增长。上线前一定要配数据保留周期,原始数据保留 3 到 6 个月,聚合数据保留 2 到 3 年,长期归档数据转冷存储。
- Kafka 消费积压:Flink 任务挂了没告警,Kafka 里的数据堆积几天才发现。所以要给消费延迟加监控,超过阈值就报警。
- 数据库连接池耗尽:应用层查询没做缓存,每个页面刷新都打数据库。加一层 Redis 缓存,把设备列表、最新状态这些高频读取的数据缓存起来。
- 边缘盒子批量掉线:夏天高温导致盒子过热重启。选型时要看工作温度范围,机箱要做遮阳和散热设计,这个钱不能省。
6. 从智能风电运维借来的几条思路
最近和做智能风电运维的朋友聊得多,发现这两个领域虽然场景差得远,但底层逻辑惊人地相似:都是分布式的、无人值守的、多源异构设备的远程运维。风电场一台风机几千个测点,一条高速公路一个隧道群也是几千个测点,问题结构几乎一样。我把验证过能迁移过来的几条经验说一下。
6.1 状态量分层与劣化趋势建模
风电运维里有一个很好的习惯,把测点分成“保护量、状态量、性能量”三层。保护量是直接触发停机的硬阈值,状态量反映设备当前健康程度,性能量用于评估效率衰减。高速公路场景完全可以照搬:隧道风机的过流保护是保护量,轴承振动和绕组温度是状态量,单位风量的能耗比是性能量。
分层的好处是,告警策略可以按层设计,保护量直接报,状态量做趋势判断,性能量做长期评估。以前我把所有测点混在一起做规则,规则数量爆炸还互相干扰,分层之后清晰多了。
6.2 备件、工单、人员的三方联动
风电场的做法是,当系统判断某个部件进入劣化期,会提前把备件调拨到就近仓库,同时把检修窗口排进计划。这套逻辑放到高速公路上同样成立:桥梁支座、隧道灯具、摄像机这些易损件,如果在劣化趋势判断出来的时候就提前备货,抢修时间能缩短一半以上。
实现上,需要把备件库存、工单系统、人员排班打通。这部分技术上不难,难的是跨部门协调,因为备件归物资部门管、人员归养护部门管。我的建议是先在平台里把数据打通,用报表的形式推送给相关部门,用数据说话,比开会争论有效得多。
6.3 迁移过来要注意的差异
有两条不能直接抄。一是风电场的通信条件比高速公路好,风电场通常有专网覆盖,而高速公路很多点位只有弱网,所以边缘侧的数据缓存和补传机制要做得更重。二是高速公路的应急处置要求更高,隧道里的事故处置窗口以分钟计,平台不能只做“建议”,还要能直接联动情报板和车道指示器,这就涉及控制权限和安全联锁,必须在设计阶段就把权限边界划清楚,不能让运维平台随随便便就能控制交通设施。
最后分享一个我在实际操作中的体会:这类平台的成败,往往不取决于技术多先进,而取决于运维人员愿不愿意用。我做过一个统计,在同一个路段,凡是把告警准确率做到 90% 以上、工单能在两小时内闭环的项目,半年后运维人员的使用率能到 80%;而那些告警一天几十条、一半是误报的项目,三个月后就没人看了。所以如果让我给做这个方向的同行一条建议,那就是前期宁可少接设备、少做功能,也要把告警准确率和工单闭环打磨好,这两件事做好了,平台才活得下去。