APP下载

空管综合数据交互平台的研究与设计

2023-05-15毅,陈

现代计算机 2023年5期
关键词:空管缓冲区数据源

石 毅,陈 恺

(中国民用航空中南地区空中交通管理局广西分局,南宁 530100)

0 引言

广西空管分局现阶段管理运行的本地相关空管数据类型包括监视数据,报文数据等。而监视数据包括莱斯自动化系统综合航迹、华泰自动化系统综合航迹、雷达数据、ADSB 数据等。以莱斯自动化系统综合航迹数据的引接应用为例,一共包括气象融合系统、自动化主备同步监控系统、空中交通流量预测系统等七套系统引接该路数据。若均直接通过莱斯自动化系统DOP(综合数据输出)服务器引接,将极大增加服务器的工作负荷。因此,为加强分局本地数据管理,规范数据信号输出,合理规划数据信号资源,并有效监控各路本地数据链路状态,拟研制空管综合数据交互平台。

1 系统的总体结构及信号流程

空管综合数据交互平台采用基于Java 语言的C/S 架构进行系统的构建[1],系统主要包含一台数据处理服务器及防火墙,其结构如图1 所示。

图1 空管综合数据交互平台结构框图

系统主要功能模块包括数据接收处理模块、数据输出模块及终端显示模块。系统通过接收处理各路监视数据、报文数据及其他本地空管数据,并根据终端用户应用需求,将相应数据定制输出到对应系统,实现数据资源的规划应用。此外,系统提供收发链路的开关操作,断线告警,延迟监测及历史数据的查询和调用输出等功能。系统的信号处理流程如图2所示。

图2 系统信号处理流程

2 系统关键模块及算法研究

2.1 NIO技术实现数据接收处理

数据接收处理效率,是衡量数据接收处理模块的重要技术指标之一。由于在输入链路上,各监视数据、报文数据及其他相关空管数据存在输入上的流量差异(各数据类型流量统计为:监视数据>报文数据>其他空管数据),以气象报文、自动化系统报文数据接收为例,气象报文数据链路仅在每个整点发送一份报文数据,其余均为空闲时段,而自动化系统当处于主用状态时,系统报文数据链路将对外发送数据。若对上述链路的数据接收处理均采用传统的多线程技术,将占用系统大量进程资源,极大增加系统服务器的工作压力。因此,提出采用基于Java的NIO技术,该方法将有效提高数据接收效率,节约系统资源。

Java NIO 即同步非阻塞I/O 模型,它包含Channel、Buffer、Selector三大核心组件[2]。Channel 为通道,它表示一个打开的连接,这个连接可以连接到I/O 设备或者一个支持I/O 访问的应用程序;Buffer 为缓冲区,在NIO 库中,所有数据都是通过缓冲区进行处理;Selector 为选择器,其提供了选择已经就绪的任务的能力。在Java NIO中,通过使用缓冲区和通道来进行数据传输。而选择器将会不断地轮询注册在上面的所有通道,如果某个通道为读写等事件做好准备,那么就处于就绪状态,即可进行后续的IO操作。这样,一个单独的线程可以管理多个通道,从而管理多个网络连接,提高效率。Java NIO连接模型如图3所示。

图3 Java NIO连接模型

目前,空管综合数据交互平台共引接莱斯自动化系统综合航迹、莱斯自动化系统计划、S模式雷达、ADS-B 数据、气象报文等共九路数据源。Java NIO技术实现各路数据接收处理的主要步骤如下:

(1)根据低流量数据源的数据类型,设置不同类型的缓冲区。如QNH 数据设置为ByteBuffer类型;

(2)为每个缓冲区建立通道,如QNH 数据缓冲区的通道类型为ServerSocketChannel,该通道类型可以监听新进来的TCP 连接,对每一个新进来的连接都会创建一个SocketChannel,通过TCP 读写网络中的数据;

(3)创建选择器,并向选择器注册通道;

(4)设置选择器对通道的监听事件类型,如对于QNH数据缓冲区的通道监听事件类型为SelectionKey.OP_WRITE,即有数据写入缓冲区时,再读取缓冲区写入通道的数据;

(5)调用Buffer clear()方法,清空缓冲区,等待下次数据的写入。

通过Java NIO 技术,统计系统满负荷情况下,共减少非必要线程开支数量四个,释放了约500 M 的内存资源。数据接收处理模块部分代码如图4所示。

图4 数据接收处理模块部分代码

2.2 改进型Hash算法实现数据存储及调用

空管综合数据交互平台提供历史数据查询及调用功能。其历史数据储存主要为监视数据的存储,储存方式通过数据文件(.DAT)方式,按天为单位以时间戳YYYYMMDD 命名进行存储,文件存放到服务器指定目录下。若各路数据源存储过程或进行历史数据调用输出操作时,均采用实时文本读写的方式,将极大影响数据存储模块的读写速度,增加服务器的工作压力。因此,提出一种改进型Hash 算法,实现数据存储模块的数据高性能存储及调用功能,增强系统可塑性及可靠性。

Hash 定义为基于特定键将一个值转换为另一个值的过程,是一种将输入值转换为通常更短的输出值的函数,并且被设计为对于每个输入值都是唯一的。Hash 函数的主要优点是可以用于在相对较小的空间中存储任何大小的数据,其在计算机编程中用于各种目的,例如将数据存储在数据库中或验证数据完整性。而选择对应的Hash 算法主要考虑三点:①安全性,算法具有一定加密性;②算法的速度,算法具备高性能处理能力;③输入的大小,算法可以满足处理数据源的数据大小。由于空管综合数据交互平台运行环境为内网环境,数据存取较为安全,而数据处理速度相对要求较高,且监视数据源的数据流量较大,因此,选择SHA-256算法。在密码学中,SHA 是加密哈希函数,SHA-256是最常用的使用32 位字计算的哈希函数。对于任意长度的消息,SHA-256 都会产生一个256位的哈希值,称作消息摘要。这个摘要相当于是个长度为32 个字节的数组,通常由一个长度为64 的十六进制字符串来表示。本质上,它是一个通过将消息区块为密钥对中间哈希值进行加密的256位加密算法。该算法具备安全、快速的特点,并且可以处理大量数据。最后,通过调用Java HashMap方法实现Hash[3]。

HashMap 类使用Hash 算法来存储和检索数据,它存储表示为键值对的数据,其中键是非空且唯一的。Hash 算法实现数据存储的主要步骤为:①为各路接入监视数据源创建HashMap,HashMap 以接收时间戳为键值,算法通过调用getInstance(“SHA-256”)的静态方法进行初始化;②当监视数据源有数据接收时,为数据标记当前接收时间戳,并调用add()方法,存入对应HashMap;③设置监听HashMap 的大小,当到达一定值后,调用ge(tkey)方法,按接收时间顺序查找时间戳键值,获取其对应的数据值;④调用spli(t)方法,按时间戳对数据值进行拆分,并打印输出;⑤调用BufferedWriter()方法,将打印内容写入数据文件;⑥调用remove()方法,删除HashMap 中已完成查找的时间戳键值及其对应的数据数值。实现数据存储的部分代码如图5所示。

图5 数据存储模块部分代码

而当执行历史数据调用功能时,实现该功能的关键步骤为:①调用Java的Date()方法,设置数据回放的开始时间;②调用Java 的Timer()方法,设置数据回放的时间轴为1秒步进;③调用Java 的InputStreamReader()和BufferedReader()方法,读取该回放时间的数据文件中满足当前回放时刻的数据段,并暂存数据回放Hashmap;④将Hashmap 内容输出至数据输出模块,进行封装,并最终发送至指定地址及端口;⑤调用Java 的Runnable()方法线程,对数据回放过程进行实时监听,当到达回放结束时间后,停止数据回放。实现历史数据调用功能的部分代码如图6所示。

图6 Runnable()方法实现数据回放过程监听

上述步骤中需要调用到的Java Buffered-Writer()及BufferedReader()方法均带有缓冲区,可以实现文本数据的多次、高效读写。并通过Hash 算法,数据存储过程更加安全、快速,从而实现了数据存储模块的高效性及可靠性。

2.3 DatagramSocket 类实现发送端数据封装及发送

以配置数据输出至流量预测系统为例,该系统需要通过UDP 协议接收自动化系统综合航迹及自动化系统报文数据。由于空管综合数据交互平台至流量预测系统间为单机通讯,因此采用单播进行传输通讯。

Java 提供了DatagramSocket 类作为基于UDP协议的Socket[4],该方法可以实现UDP 发送数据,主要步骤为:①调用DatagramSocket()方法,创建发送端Socket 对象,构造数据报套接字并将其绑定到本地主机上的任何可用端口;②分别创建综合航迹及报文数据包对象,该数据包写入待发送数据,并调用DatagramPacke(t)方法,进行目的地址及端口号的数据封装;③调用Send()方法,通过udp 的socket 服务将数据包发送。通过上述方法,实现了发送端的自动化系统综合航迹及报文数据的数据封装和发送。

2.4 多线程技术实现数据的多路输出

线程是进程中的实际运作单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。通常在一个进程中可以包含若干个线程,且一个进程中至少有一个线程。而进程指正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源。因此,进程的创建和销毁耗费大量的系统资源,从而衍生出线程的概念。即允许在一个进程中创建多个线程,这些线程共享进程的资源,并且每个线程拥有自己独立的程序计数器、线程局部变量等资源,叫多线程技术[5]。多线程技术具有提高进程使用率、CPU利用率及数据吞吐量等优点。

目前,空管综合数据交互平台共配置三路数据,分别输出至流量预测系统、空管复盘分析系统和QNH 不一致告警系统。Java 内置了对多线程的支持,可以很方便地开发出具备多线程功能,同时处理多个任务的应用。多线程技术实现数据的多路输出的主要步骤为:①为各路数据输出创建MyThread 类的对象;②重写run()方法,即定义该线程输出数据类型及输出目的地址和端口号;③调用线程对象的start()方法启动线程。

由于空管综合数据交互平台可对各路数据输出进行开关操作,当配置了多条输出链路时,进程的创建和销毁将占用较大资源,影响系统性能。使用Java 的线程池接口,因为线程池具有多重优点:可减少创建新线程的时间,提高响应速度;重复利用线程池中线程,不需要每次都创建,降低资源消耗;便于线程管理等。调用Java newCacheThreadPol(l)方法,创建一个可缓存的线程池,并提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。

上述多线程技术,最终实现了数据输出模块的多路输出,并具有稳定性及可靠性。

3 实验结果与分析

空管综合数据交互平台的人机界面采用分页式界面设计[6],总共划分成数据输入流监控、数据输出流监控、历史数据查询(调用)、日志记录及配置管理共五大功能页。各功能页面显示简洁、友好,其中通过数据输入、输出流监控页面可直观查看到各条链路状态,并可在数据输入、输出流配置界面对链路进行开关或者数据源选择等操作。数据输入流监控界面及数据输出流配置界面分别如图7、图8所示。

图7 数据输入流监控界面

图8 数据输出流配置界面

系统的历史数据查询功能页面,可以查询到各输入监视源的历史数据,并可进行历史数据导出或调用输出操作。而系统的日志记录功能页面可以查询到历史告警信息,系统操作日志等内容。最后一项管理配置功能页面则提供常用告警参数设置,历史数据输出目的地址及端口号等参数设置。

4 结语

空管综合数据交互平台通过NIO、多线程技术实现多路数据的输入及输出。通过改进型Hash 算法实现信息的共享性和数据封装性。在系统的实际应用中,技术维护人员通过系统可进行本地数据的统一管理,数据资源的合理规划,数据应用的规范输出,提高了技术维护部门的工作效率,降低在用系统服务器的工作压力。同时,系统采用模块化设计,提高了系统的可扩展性和可维护性,为后期本地三级数据中心建设提供了借鉴经验;此外,系统还可与分局的自研项目,如:空管复盘分析系统、雷达质量分析系统进行互联,实现数据回放及数据质量分析等功能,该系统将在空管单位和地方机场具有广泛的应用前景。

猜你喜欢

空管缓冲区数据源
民航空管2018年运行统计公报
乙醇蒸气放空管设置室内引发爆炸
Web 大数据系统数据源选择*
嫩江重要省界缓冲区水质单因子评价法研究
基于不同网络数据源的期刊评价研究
基于真值发现的冲突数据源质量评价算法
关键链技术缓冲区的确定方法研究
如何做好空管质量安全管理体系(QSMS)内部审核的几点思考
空管自动化系统GPS时钟同步方式
分布式异构数据源标准化查询设计与实现