返回作品

火车站测风仪监控系统

创建于 2025 年 6 月 1 日

标签
  • Java 8
  • Spring Boot 2.6
  • MyBatis
  • MySQL
  • Thymeleaf
  • jSerialComm

项目介绍

铁路车站的站台、道口对瞬时大风高度敏感,风速达到一定等级需要提前启动应急预案。这个项目为车站部署的测风仪搭建了一套从采集、判定到提醒的监控系统:应用启动后自动在 777 端口监听,测风终端(或采集网关)主动接入,服务端按客户端 IP 从数据库匹配车站名称,再以 Modbus TCP 协议向终端请求风速数据,解析后入库并驱动报警逻辑。

系统在 WindSpeedServerService 中以 @PostConstruct 启动 ServerSocket,为每个客户端连接开辟独立线程处理:连接建立后等待一段时间,发送读保持寄存器请求帧 01 03 00 00 00 01 84 0A,接收响应帧后校验帧头(0x010x03、数据长度 0x02),将第 4、5 字节拼接的整数值除以 100 还原为实际风速(单位 m/s),再交给业务服务落库。

项目架构

项目是典型的单体 Web 应用,基于 Spring Boot 2.6.13 + Java 8 构建。依赖上同时引入 MyBatis(注解式 SQL Mapper)与 Spring Data JPA(仅用于建表),数据库为 MySQL,页面由 Thymeleaf 渲染,原生 HTML/CSS/JavaScript 通过 fetch 调用 REST 接口实现大屏刷新。

代码按 controller、service、mapper、pojo 分层组织:

  • WindSpeedServerService:Socket 采集服务,负责监听、协议请求、响应校验与风速解析,另有 V2 变体调整了轮询节奏;
  • WindSpeedService:核心业务,处理风速记录的更新、报警判定、风力等级换算与报警消息生成;
  • WindSpeedAlertService:报警记录的 CSV 导出;
  • REST 接口:/api/stations/*(车站增删改查)、/api/wind-speeds(实时风速)、/api/wind-speeds-alert/*(报警列表与确认)、/api/alerts/export/*(CSV 导出)。

数据库设计围绕两张表:station_wind_speed 保存每个车站的当前风速、5 分钟前风速、记录时间、报警时间与解除时间,并绑定车站 IP;wind_speed_alerts 保存报警事件(车站、报警时间、实时风速、提醒消息与是否已提醒)。项目以站点维度拆分为多个部署变体(大同站、阳泉站、admin 管理版),其中 admin 版额外增加 wind_speed_his 历史表,报警触发时同步写入历史,并由定时任务每日 0 点自动清理一个月前的数据。

核心功能

  • Modbus TCP 风速采集:应用启动即监听 777 端口,按客户端 IP 反查车站(findStationByIpAddress),无法识别则拒绝连接;发送标准读寄存器请求后校验响应帧,解析出的风速写入 recordOrUpdateWindSpeed
  • 6 级大风报警闭环:阈值 10.8 m/s 与蒲福风力 6 级分界一致。风速首次达到或超过阈值时记录 alert_time 并写入报警记录,消息自动生成”车站 + 时间 + 风力已达 X 级,请提醒车站启动应急预案”;风速回落后记录 release_time,构成完整的报警—解除闭环。
  • 风力等级换算:服务端 getWindSpeedLevel 与前端 getWindSpeedLevel 各自实现 0–12 级蒲福风力分档(如 10.8–13.8 m/s 为 6 级),保证展示口径一致。
  • 实时监测大屏:页面每 60 秒自动刷新,实时风力表按当前风速排序,达到 6 级及以上行标红;报警区按”绿色=已确认、红色=待确认”展示,点击”未提醒”按钮可调用接口将状态置为已提醒;检测到大风且用户启用声音时播放报警音(可静音,状态存 localStorage)。
  • 设备与数据管理:侧边栏登录(admin/123456)后进入设备管理,可新增车站(需授权码)、修改车站名称与 IP、删除车站;报警记录支持按单站或全部导出 CSV,导出时写入 UTF-8 BOM 以保证中文在 Excel 中正常显示。
  • 模拟联调工具WindSpeedClient / WindSpeedClient1 模拟测风终端,连接服务端后按协议回送风速数据帧,方便在没有真实硬件时验证整条采集链路。

功能截图

暂无运行截图。

快速上手

项目为 Maven 工程,要求 JDK 1.8。先执行 rs485.sql 初始化数据库(库名 rs485),再按环境修改 application.properties 中的数据库连接与端口(站点版默认 8081,admin 版默认 9090)。mvn package 打包后执行 java -jar demo-0.0.1-SNAPSHOT.jar 启动,应用会同时开启 777 端口等待测风终端接入。

无真实终端时,可运行 WindSpeedClientmain 方法)连接本地 777 端口完成一次模拟采集,也可用 ModbusTcpServer 参考代码模拟服务端收发。浏览器访问 http://localhost:8081/index 打开监测大屏,刷新数据即可看到对应车站的实时风力、历史报警与确认状态。

总结

这个项目的核心不是复杂的算法,而是一条严谨的采集—判定—提醒链路:用 Modbus TCP 协议帧与测风终端对话,用数据库 IP 台账完成”连接即车站”的自动识别,用 10.8 m/s 这一铁路场景关心的阈值驱动报警与解除状态机,最终在监测大屏上以红色标记、声音提醒和确认状态让值班人员一眼掌握风险。

系统已按大同、阳泉等多个车站站点分别部署,并演化出带历史归档与自动清理的 admin 版本,说明项目已经从单点演示走向了可落地的多站点监控形态。后续可扩展的方向包括:在服务端为每个车站维护独立的历史风速趋势曲线、增加多级风速阈值(如 8 级、10 级)分级预警、以及通过短信或语音外呼对接车站值班流程。