南京防雷防电检测系统

发布于 2023-05-08  265 次阅读


项目概要

港口油罐区硬件设备通过双绞线布设周围,然后底部通过光纤连,每个区域连一个串口服务器,然后通过交换机连到中控室和服务器;

研究生期间,主要参与了与江苏科源公司合作的一个港口油罐区防雷防爆防雷电监测预警系统的开发,现在系统部署于辽宁营口市两处港口现场,运行状态稳定。

前端5s轮询一次,1h是持久化到数据库

redis存的是 key:设备(40) map<类型:值> ip端口

这个项目是基于Springboot开发的web项目,在研一入学前开始对系统进行设计和开发,并部署于港口现场,后续对系统持续进行迭代升级。系统主要用于与港口油罐区布设的电压,电阻,温度等监测设备交互,通过modbus协议向设备发送请求获取设备返回的数据。在系统后端对数据进行解析并展示于前端。

  1. 根据modbus协议,构建请求帧,生成CRC校验码,通过串口或串口服务器发送至设备,获取返回帧
  2. 根据具体设备(每个硬件不同)解析协议配置解析流程,根据协议对返回帧进行解析,返回的是一个16进制字符串,校验CRC编码,以及数据长度,判断返回数据是否有效
  3. 在redis中维护产品信息,记录每个产品的相关信息以及当前状态,设备状态变化时予以更新
  4. 定义全局变量DataDisplays,将解析好的设备数据存入其中。
  5. 解析时根据配置好的设备阈值判定是否达到预警条件,捕捉预警数据,前端轮询异常设备信息进行报警
  6. 配置一个定时线程,每隔一个小时从缓存中读取设备数据写入mysql进行持久化

系统流程

  1. 在系统启动时,通过一个监听器来监听web应用,在web应用启动时,对系统进行初始化
  • 清空redis,从mysql中读取各个设备报警阈值配置,写入redis
  • 初始化全局变量DataDisplays,读取区域,到区域内产品类别,到具体产品,到产品解析协议的继承关系。将各设备展示数据赋null,写入全局变量
  • 启动轮询线程,进行数据读取和解析
  1. 获取产品和解析协议的继承关系,逐个轮询设备,调用readData方法获取设备返回的字节流,以map的形式存储
  2. 在readData中调用getReturnData,根据解析协议,为设备构建请求帧,生成CRC校验码,通过串口或串口服务器发送至设备
  • 串口服务器方式通过与串口服务器ip建立socket连接,以字节缓冲输入输出流的形式发送和读取数据
  • 串口方式根据端口名打开端口,配置串口参数,发送和读取数据
  1. 对返回数据进行判定,校验CRC编码,以及数据长度,判断返回数据是否有效
  • 当返回数据为空时,根据配置好的重试次数进行重新读取,若重试次数达到上限依旧没有读取到有效数据从redis中读取对应设备的字节缓存信息
  • 当返回数据不为空时,更新缓存状态,将数据更新时间写入redis。
  1. 将字节数据以map的形式返回给readData
  • 若返回数据为空,从redis中读取,否则,记录设备当前字节流,写入redis
  1. 对返回的字节数据进行解析,封装成用于展示的数据
  • 在解析过程中对报警数据进行捕捉,如果解析到当前数据为报警数据,将该报警数据写入mysql。
  1. 如果解析数据不为空,更新全局变量DataDisplays中的数据
  2. 在一类产品轮询结束后,统计解析数据中报警设备,更新redis设备信息中的状态
  3. 通过一个可以周期性执行任务的单线程线程池执行该线程
  4. 通过@Scheduled定义一个每小时执行一次的轮询任务,从全局变量中读取各个设备的数据写入mysql
  5. 报警功能通过前端轮询向后端发送请求读取设备信息,设备从redis中读取每个设备的状态信息,统计状态异常的设备数量,如果数量不为零,前端进行报警

改进

数据实时显示

现在是前端轮询调用后端接口,读取数据,效率不高

改进:

引入websocket:通过websocket在服务器和浏览器间建立持久性的连接

协议有两部分:握手和数据传输。握手是基于http协议的。

一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实现了“真·长链接”,实时性优势明显。

WebSocket有以下特点:

  • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
  • HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。WebSocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)