APP下载

基于通信的列车控制系统数据采集与解析软件的设计与实现*

2018-11-02白广争白广良

城市轨道交通研究 2018年10期
关键词:配置文件线程交换机

白广争 李 亮 白广良

(1.中国铁道科学研究院通信信号研究所,100081,北京;2. 中国石油辽河油田兴隆台采油厂,124011,盘锦 //第一作者,助理研究员)

CBTC(基于通信的列车控制)系统包括CBI(计算机联锁)、ATS(列车自动监控)、VOBC(车载控制器)、ZC(区域控制器)和DCS(数据通信)等子系统[1]。各子系统之间实时进行各种控制信息及反馈信息的交互,各子系统内部实时完成自身逻辑功能运算。为了深入分析各子系统自身逻辑运算的准确性及系统间信息交互的可靠性,从系统的角度而言,需要开发一套对整个CBTC系统进行实时数据抓包并根据接口协议进行解析的软件,为工程测试人员提供参考。

文献[2]是在Wireshark的基础上通过脚本嵌入二次开发实现的应用协议解析。本文所介绍的软件,其开发基于C# 语言,包含了数据抓包解包的过程。本文描述了解决软件开发过程中出现的一些关键问题的思路。软件主要完成局域网内数据抓包、接口解析配置文件设计与读取、数据记录与历史查询、界面显示等功能。

1 数据抓包

CBTC系统一般采用交换机组建局域网。为了实现抓取流经交换机的所有数据,需要做两方面的工作:一是设计数据抓包机制,二是对交换机进行端口镜像配置。

1.1 数据抓包机制

在硬件方面,网卡的工作模式分为广播模式、多播传送、直接模式和混杂模式等。默认情况下,网卡只接收广播帧和发至本终端的帧[3]。只有采用混杂模式,网卡才能接收局域网络内所有发送至本终端的数据包,实现监视捕获网络信息的目的。在软件方面,通过调用Sharpcap应用类库进行底层网卡的操作。CBTC系统采用A、B双网组建局域网,分别由两台交换机管理。因此,在同一终端上,可采用两个网卡分别抓取两台交换机上的数据,数据抓包机制如图1所示。

图1 数据抓包机制

为了避免多个线程同时操作某一块内存,引起并发性问题,需要在数据存入缓存的过程中设置互斥锁。互斥锁的原理为:当线程n需要操作某一被锁定的内存时,必须首先获取锁,然后才能进行该内存操作;当线程n正在操作某一内存时,该内存则被置于锁定状态,其他线程不能再对其进行操作;当线程n操作某一内存结束后,需要释放锁,从而允许其他线程进行相关操作。

1.2 交换机端口镜像配置

由于交换机不会把收到的每个数据信息都以广播的方式发送到其他所有端口,而是根据MAC地址表进行智能转发。因此,经过1.1节的配置仍无法实现在一个端口上抓取局域网内的所有数据。通过端口镜像配置方法,能够将多个端口的数据流镜像到同一个端口上,这样,局域网数据抓包条件就能从物理上得到保证。

为了完成端口镜像配置,首先,交换机需具有网络管理功能;其次,由于不同型号交换机的配置命令不同,因此对不同的交换机采用与其相应的配置命令进行配置。

2 数据包解析

对于从交换机上获得的数据包,需要获取应用层数据,并根据接口协议进行解包,从而提供给测试人员进行验证。本软件的数据包解析由XML配置文件和文件读取程序(解包程序)两个模块完成。

2.1 XML配置文件

通常情况下,随着工程的深入和细化,一些接口协议、工程数据等都会有所改动,为了降低这种改变对程序开发的影响,同时也为了提高开发效率,减少程序开发工作量,接口协议及工程数据等需要以配置文件的方式提供,以便于后期的维护。本解析软件采用XML文件对CBTC系统中的接口协议进行描述。

XML文件格式能跨平台使用,具有良好的可扩展性,适合面向对象的程序开发。XML提供的是树形层次结构,可以很方便地定位某个功能块[4]。针对CBTC各子系统接口协议,本软件采用5层节点的XML文件来描述。第1层为标志数据方向的节点,如ZC→VOBC等;第2层为标志数据包类型的节点,如列车控制信息、列车注册请求报文等;第3层为普通节点,如ZC_ID等应用层字段含义;第4层为被控节点,如某号道岔的信息等;第5层为表示被控节点属性的子节点,如道岔定位、反位信息等。

其中,普通节点又分为非控制类型节点和控制类型节点两类,设置节点属性control来区分这两种类型。若control为0,表示该节点为非控制类型节点。对于该类节点,只需获取其中各属性的值,如每个字段的长度、字段含义描述等。若control为1,表示该节点为控制类型节点。对该类节点的处理方式是,根据控制节点的值对被控节点进行操作。例如,假设数据包中包含N个道岔信息,则通过道岔控制节点获取N值,然后对描述道岔的被控节点进行N次循环读取。XML配置文件整体结构如图2所示。

图2 XML配置文件结构设计示意图

采取这种设计模式能够将CBTC系统的所有接口协议文件转化为XML配置文件,供解包程序统一调用。若后期协议中需要增加新的字段,只需增加新的节点,文件结构及解包程序均不需改变;若出现新的控制条件或控制类型时,可以通过调整control的值做进一步扩展。

2.2 解包程序

XML配置文件的解包程序,首先获取数据包的源ID、目的ID和数据类型等包头信息,读取XML配置文件,并据此查找与该数据包的数据方向和类型相同的方向节点和类型节点。在此基础上,对数据包中其他各字段按节点逐个进行解析。XML配置文件解包程序读取流程如图3所示。

图3 XML配置文件解包程序流程图

为了提高程序的实时响应能力,在抓包过程中,并不对应用层数据全部进行实时解包,而是只获取包头的一些必要信息,如时间、PacketID、数据包类型等,并进行数据分类存储,以便于以后的查询操作。只有在离线情况下,才响应测试人员的查询记录请求,调用解包程序对相应的数据包进行解包处理。

3 数据存储设计

为了方便测试,提高软件的可用性,降低数据库对环境配置的要求,本项目采用SQLite数据库。该数据库是一种开源的嵌入式关系型数据库,与Oracle复杂的客户-服务器模式不同,SQLite整个数据库都在一个单一文件中,可以直接通过程序来创建数据库文件及表单,并进行相关的数据库操作。另外,SQLite还具有处理速度快、支持跨平台、能与多种程序语言相结合等优点。

从网络上抓取到的数据均需存入数据库,若每获得一条数据即进行一次存储操作,频繁连接和断开数据库比较耗时,存储速度就无法满足实时性要求。通常情况下,对于实时数据都采取集中式存储方式。

本文介绍的软件设置了两个缓存区,轮流接收抓取的数据,并在缓存区满时各自进行存储。缓存区的大小与抓包速率有关,若单位时间内从局域网上抓到的数据包较多,则需要设计较大的缓存区。通过显式启动事务的方法将缓存中的数据批量插入数据库,能够大大提高存储效率。

存储机制分定量存储和定时存储两种方式。定量存储是指在程序中开辟固定大小的缓存区,当缓存区满时,执行数据存储过程。这种存储机制便于控制内存的合理运用,但存储周期是不确定的,需要根据缓存区大小和网络内数据流量来计算;定时存储是指每间隔固定的时间进行一次存储,这种存储机制在存储周期上是固定的,但需定义动态缓存区,不利于内存管理。本文介绍的软件采用定量存储的方式。

根据以上设计思路,设存储周期为T,网络抓包速率为v,单个缓冲区大小为s,则三者满足如下的关系:

T=s/v

(1)

设每次存储事务的执行时间为t,若要保证有足够的时间存储数据,则须满足如下的要求:

t≤T

(2)

存储速率根据程序的抓包速率来设计。存储速率要略大于抓包速率,这样既能避免内存溢出,又能有效减少资源占用。

根据式(1)、式(2)的关系,v、s与t之间的关系需满足:

tv

(3)

当式(3)的条件满足时,能有效避免内存溢出。同时,若式(3)右端远大于左端,则会造成内存资源的浪费或数据库连接资源的浪费。

为了提高程序的实时性,抓包线程负责将抓取的数据包放入缓存中,并调用解包头程序,将更新界面显示和存储事务交由数据存储线程处理。设置两个缓存区进行数据的轮流接收与存储,同一时刻只能由其中一个缓存区负责数据接收,当该缓存区存满后才能由另一个缓存区进行数据接收,具体的控制流程如图4所示。

图4 数据接收及存储流程图

4 软件总体结构及界面

以上描述了软件所涉及到的主要功能模块,软件采用基于Winform的C# 语言编程,整体运作流程如图5所示。

软件界面提供实时数据抓包显示,用Listview控件显示。用户选择某一包的数据记录,软件界面相应显示该数据包的解析信息。也可以通过设置筛选条件进行选择性显示。该软件具有历史数据查询、Excel导入/导出等功能。

图5 主程序控制流程图

通过应用验证,软件在Intel Core i5-4590四核8 G内存的终端上运行,能够满足CBTC系统的需求,没有出现漏包现象,抓包及处理效率能够跟上系统内数据包的产生速度。

5 结语

本文阐述了抓包、存储及离线解析CBTC系统局域网内数据的软件的设计过程。该软件的研发有助于提高CBTC系统接口测试效率,加快问题定位,提高测试质量。按照本文介绍的设计方法开发的软件具有扩展性好、开发效率高、通用性强等特点,这些设计方法对于其他类似应用系统的开发具有一定的借鉴意义。

在此基础上的进一步研究工作是:通过统计所抓取数据包的类型来判断CBTC系统实时网络状态;通过修改数据包内容,模拟某一子系统向其他子系统发送错误数据包,实现故障注入等功能。

猜你喜欢

配置文件线程交换机
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
互不干涉混用Chromium Edge
基于地铁交换机电源设计思考
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
修复损坏的交换机NOS
为View桌面准备父虚拟机
使用链路聚合进行交换机互联
浅谈linux多线程协作