白廣爭 李 亮 白廣良
(1.中國鐵道科學(xué)研究院通信信號(hào)研究所,100081,北京;2. 中國石油遼河油田興隆臺(tái)采油廠,124011,盤錦 //第一作者,助理研究員)
CBTC(基于通信的列車控制)系統(tǒng)包括CBI(計(jì)算機(jī)聯(lián)鎖)、ATS(列車自動(dòng)監(jiān)控)、VOBC(車載控制器)、ZC(區(qū)域控制器)和DCS(數(shù)據(jù)通信)等子系統(tǒng)[1]。各子系統(tǒng)之間實(shí)時(shí)進(jìn)行各種控制信息及反饋信息的交互,各子系統(tǒng)內(nèi)部實(shí)時(shí)完成自身邏輯功能運(yùn)算。為了深入分析各子系統(tǒng)自身邏輯運(yùn)算的準(zhǔn)確性及系統(tǒng)間信息交互的可靠性,從系統(tǒng)的角度而言,需要開發(fā)一套對(duì)整個(gè)CBTC系統(tǒng)進(jìn)行實(shí)時(shí)數(shù)據(jù)抓包并根據(jù)接口協(xié)議進(jìn)行解析的軟件,為工程測試人員提供參考。
文獻(xiàn)[2]是在Wireshark的基礎(chǔ)上通過腳本嵌入二次開發(fā)實(shí)現(xiàn)的應(yīng)用協(xié)議解析。本文所介紹的軟件,其開發(fā)基于C# 語言,包含了數(shù)據(jù)抓包解包的過程。本文描述了解決軟件開發(fā)過程中出現(xiàn)的一些關(guān)鍵問題的思路。軟件主要完成局域網(wǎng)內(nèi)數(shù)據(jù)抓包、接口解析配置文件設(shè)計(jì)與讀取、數(shù)據(jù)記錄與歷史查詢、界面顯示等功能。
CBTC系統(tǒng)一般采用交換機(jī)組建局域網(wǎng)。為了實(shí)現(xiàn)抓取流經(jīng)交換機(jī)的所有數(shù)據(jù),需要做兩方面的工作:一是設(shè)計(jì)數(shù)據(jù)抓包機(jī)制,二是對(duì)交換機(jī)進(jìn)行端口鏡像配置。
在硬件方面,網(wǎng)卡的工作模式分為廣播模式、多播傳送、直接模式和混雜模式等。默認(rèn)情況下,網(wǎng)卡只接收廣播幀和發(fā)至本終端的幀[3]。只有采用混雜模式,網(wǎng)卡才能接收局域網(wǎng)絡(luò)內(nèi)所有發(fā)送至本終端的數(shù)據(jù)包,實(shí)現(xiàn)監(jiān)視捕獲網(wǎng)絡(luò)信息的目的。在軟件方面,通過調(diào)用Sharpcap應(yīng)用類庫進(jìn)行底層網(wǎng)卡的操作。CBTC系統(tǒng)采用A、B雙網(wǎng)組建局域網(wǎng),分別由兩臺(tái)交換機(jī)管理。因此,在同一終端上,可采用兩個(gè)網(wǎng)卡分別抓取兩臺(tái)交換機(jī)上的數(shù)據(jù),數(shù)據(jù)抓包機(jī)制如圖1所示。
圖1 數(shù)據(jù)抓包機(jī)制
為了避免多個(gè)線程同時(shí)操作某一塊內(nèi)存,引起并發(fā)性問題,需要在數(shù)據(jù)存入緩存的過程中設(shè)置互斥鎖?;コ怄i的原理為:當(dāng)線程n需要操作某一被鎖定的內(nèi)存時(shí),必須首先獲取鎖,然后才能進(jìn)行該內(nèi)存操作;當(dāng)線程n正在操作某一內(nèi)存時(shí),該內(nèi)存則被置于鎖定狀態(tài),其他線程不能再對(duì)其進(jìn)行操作;當(dāng)線程n操作某一內(nèi)存結(jié)束后,需要釋放鎖,從而允許其他線程進(jìn)行相關(guān)操作。
由于交換機(jī)不會(huì)把收到的每個(gè)數(shù)據(jù)信息都以廣播的方式發(fā)送到其他所有端口,而是根據(jù)MAC地址表進(jìn)行智能轉(zhuǎn)發(fā)。因此,經(jīng)過1.1節(jié)的配置仍無法實(shí)現(xiàn)在一個(gè)端口上抓取局域網(wǎng)內(nèi)的所有數(shù)據(jù)。通過端口鏡像配置方法,能夠?qū)⒍鄠€(gè)端口的數(shù)據(jù)流鏡像到同一個(gè)端口上,這樣,局域網(wǎng)數(shù)據(jù)抓包條件就能從物理上得到保證。
為了完成端口鏡像配置,首先,交換機(jī)需具有網(wǎng)絡(luò)管理功能;其次,由于不同型號(hào)交換機(jī)的配置命令不同,因此對(duì)不同的交換機(jī)采用與其相應(yīng)的配置命令進(jìn)行配置。
對(duì)于從交換機(jī)上獲得的數(shù)據(jù)包,需要獲取應(yīng)用層數(shù)據(jù),并根據(jù)接口協(xié)議進(jìn)行解包,從而提供給測試人員進(jìn)行驗(yàn)證。本軟件的數(shù)據(jù)包解析由XML配置文件和文件讀取程序(解包程序)兩個(gè)模塊完成。
通常情況下,隨著工程的深入和細(xì)化,一些接口協(xié)議、工程數(shù)據(jù)等都會(huì)有所改動(dòng),為了降低這種改變對(duì)程序開發(fā)的影響,同時(shí)也為了提高開發(fā)效率,減少程序開發(fā)工作量,接口協(xié)議及工程數(shù)據(jù)等需要以配置文件的方式提供,以便于后期的維護(hù)。本解析軟件采用XML文件對(duì)CBTC系統(tǒng)中的接口協(xié)議進(jìn)行描述。
XML文件格式能跨平臺(tái)使用,具有良好的可擴(kuò)展性,適合面向?qū)ο蟮某绦蜷_發(fā)。XML提供的是樹形層次結(jié)構(gòu),可以很方便地定位某個(gè)功能塊[4]。針對(duì)CBTC各子系統(tǒng)接口協(xié)議,本軟件采用5層節(jié)點(diǎn)的XML文件來描述。第1層為標(biāo)志數(shù)據(jù)方向的節(jié)點(diǎn),如ZC→VOBC等;第2層為標(biāo)志數(shù)據(jù)包類型的節(jié)點(diǎn),如列車控制信息、列車注冊(cè)請(qǐng)求報(bào)文等;第3層為普通節(jié)點(diǎn),如ZC_ID等應(yīng)用層字段含義;第4層為被控節(jié)點(diǎn),如某號(hào)道岔的信息等;第5層為表示被控節(jié)點(diǎn)屬性的子節(jié)點(diǎn),如道岔定位、反位信息等。
其中,普通節(jié)點(diǎn)又分為非控制類型節(jié)點(diǎn)和控制類型節(jié)點(diǎn)兩類,設(shè)置節(jié)點(diǎn)屬性control來區(qū)分這兩種類型。若control為0,表示該節(jié)點(diǎn)為非控制類型節(jié)點(diǎn)。對(duì)于該類節(jié)點(diǎn),只需獲取其中各屬性的值,如每個(gè)字段的長度、字段含義描述等。若control為1,表示該節(jié)點(diǎn)為控制類型節(jié)點(diǎn)。對(duì)該類節(jié)點(diǎn)的處理方式是,根據(jù)控制節(jié)點(diǎn)的值對(duì)被控節(jié)點(diǎn)進(jìn)行操作。例如,假設(shè)數(shù)據(jù)包中包含N個(gè)道岔信息,則通過道岔控制節(jié)點(diǎn)獲取N值,然后對(duì)描述道岔的被控節(jié)點(diǎn)進(jìn)行N次循環(huán)讀取。XML配置文件整體結(jié)構(gòu)如圖2所示。
圖2 XML配置文件結(jié)構(gòu)設(shè)計(jì)示意圖
采取這種設(shè)計(jì)模式能夠?qū)BTC系統(tǒng)的所有接口協(xié)議文件轉(zhuǎn)化為XML配置文件,供解包程序統(tǒng)一調(diào)用。若后期協(xié)議中需要增加新的字段,只需增加新的節(jié)點(diǎn),文件結(jié)構(gòu)及解包程序均不需改變;若出現(xiàn)新的控制條件或控制類型時(shí),可以通過調(diào)整control的值做進(jìn)一步擴(kuò)展。
XML配置文件的解包程序,首先獲取數(shù)據(jù)包的源ID、目的ID和數(shù)據(jù)類型等包頭信息,讀取XML配置文件,并據(jù)此查找與該數(shù)據(jù)包的數(shù)據(jù)方向和類型相同的方向節(jié)點(diǎn)和類型節(jié)點(diǎn)。在此基礎(chǔ)上,對(duì)數(shù)據(jù)包中其他各字段按節(jié)點(diǎn)逐個(gè)進(jìn)行解析。XML配置文件解包程序讀取流程如圖3所示。
圖3 XML配置文件解包程序流程圖
為了提高程序的實(shí)時(shí)響應(yīng)能力,在抓包過程中,并不對(duì)應(yīng)用層數(shù)據(jù)全部進(jìn)行實(shí)時(shí)解包,而是只獲取包頭的一些必要信息,如時(shí)間、PacketID、數(shù)據(jù)包類型等,并進(jìn)行數(shù)據(jù)分類存儲(chǔ),以便于以后的查詢操作。只有在離線情況下,才響應(yīng)測試人員的查詢記錄請(qǐng)求,調(diào)用解包程序?qū)ο鄳?yīng)的數(shù)據(jù)包進(jìn)行解包處理。
為了方便測試,提高軟件的可用性,降低數(shù)據(jù)庫對(duì)環(huán)境配置的要求,本項(xiàng)目采用SQLite數(shù)據(jù)庫。該數(shù)據(jù)庫是一種開源的嵌入式關(guān)系型數(shù)據(jù)庫,與Oracle復(fù)雜的客戶-服務(wù)器模式不同,SQLite整個(gè)數(shù)據(jù)庫都在一個(gè)單一文件中,可以直接通過程序來創(chuàng)建數(shù)據(jù)庫文件及表單,并進(jìn)行相關(guān)的數(shù)據(jù)庫操作。另外,SQLite還具有處理速度快、支持跨平臺(tái)、能與多種程序語言相結(jié)合等優(yōu)點(diǎn)。
從網(wǎng)絡(luò)上抓取到的數(shù)據(jù)均需存入數(shù)據(jù)庫,若每獲得一條數(shù)據(jù)即進(jìn)行一次存儲(chǔ)操作,頻繁連接和斷開數(shù)據(jù)庫比較耗時(shí),存儲(chǔ)速度就無法滿足實(shí)時(shí)性要求。通常情況下,對(duì)于實(shí)時(shí)數(shù)據(jù)都采取集中式存儲(chǔ)方式。
本文介紹的軟件設(shè)置了兩個(gè)緩存區(qū),輪流接收抓取的數(shù)據(jù),并在緩存區(qū)滿時(shí)各自進(jìn)行存儲(chǔ)。緩存區(qū)的大小與抓包速率有關(guān),若單位時(shí)間內(nèi)從局域網(wǎng)上抓到的數(shù)據(jù)包較多,則需要設(shè)計(jì)較大的緩存區(qū)。通過顯式啟動(dòng)事務(wù)的方法將緩存中的數(shù)據(jù)批量插入數(shù)據(jù)庫,能夠大大提高存儲(chǔ)效率。
存儲(chǔ)機(jī)制分定量存儲(chǔ)和定時(shí)存儲(chǔ)兩種方式。定量存儲(chǔ)是指在程序中開辟固定大小的緩存區(qū),當(dāng)緩存區(qū)滿時(shí),執(zhí)行數(shù)據(jù)存儲(chǔ)過程。這種存儲(chǔ)機(jī)制便于控制內(nèi)存的合理運(yùn)用,但存儲(chǔ)周期是不確定的,需要根據(jù)緩存區(qū)大小和網(wǎng)絡(luò)內(nèi)數(shù)據(jù)流量來計(jì)算;定時(shí)存儲(chǔ)是指每間隔固定的時(shí)間進(jìn)行一次存儲(chǔ),這種存儲(chǔ)機(jī)制在存儲(chǔ)周期上是固定的,但需定義動(dòng)態(tài)緩存區(qū),不利于內(nèi)存管理。本文介紹的軟件采用定量存儲(chǔ)的方式。
根據(jù)以上設(shè)計(jì)思路,設(shè)存儲(chǔ)周期為T,網(wǎng)絡(luò)抓包速率為v,單個(gè)緩沖區(qū)大小為s,則三者滿足如下的關(guān)系:
T=s/v
(1)
設(shè)每次存儲(chǔ)事務(wù)的執(zhí)行時(shí)間為t,若要保證有足夠的時(shí)間存儲(chǔ)數(shù)據(jù),則須滿足如下的要求:
t≤T
(2)
存儲(chǔ)速率根據(jù)程序的抓包速率來設(shè)計(jì)。存儲(chǔ)速率要略大于抓包速率,這樣既能避免內(nèi)存溢出,又能有效減少資源占用。
根據(jù)式(1)、式(2)的關(guān)系,v、s與t之間的關(guān)系需滿足:
tv
(3)
當(dāng)式(3)的條件滿足時(shí),能有效避免內(nèi)存溢出。同時(shí),若式(3)右端遠(yuǎn)大于左端,則會(huì)造成內(nèi)存資源的浪費(fèi)或數(shù)據(jù)庫連接資源的浪費(fèi)。
為了提高程序的實(shí)時(shí)性,抓包線程負(fù)責(zé)將抓取的數(shù)據(jù)包放入緩存中,并調(diào)用解包頭程序,將更新界面顯示和存儲(chǔ)事務(wù)交由數(shù)據(jù)存儲(chǔ)線程處理。設(shè)置兩個(gè)緩存區(qū)進(jìn)行數(shù)據(jù)的輪流接收與存儲(chǔ),同一時(shí)刻只能由其中一個(gè)緩存區(qū)負(fù)責(zé)數(shù)據(jù)接收,當(dāng)該緩存區(qū)存滿后才能由另一個(gè)緩存區(qū)進(jìn)行數(shù)據(jù)接收,具體的控制流程如圖4所示。
圖4 數(shù)據(jù)接收及存儲(chǔ)流程圖
以上描述了軟件所涉及到的主要功能模塊,軟件采用基于Winform的C# 語言編程,整體運(yùn)作流程如圖5所示。
軟件界面提供實(shí)時(shí)數(shù)據(jù)抓包顯示,用Listview控件顯示。用戶選擇某一包的數(shù)據(jù)記錄,軟件界面相應(yīng)顯示該數(shù)據(jù)包的解析信息。也可以通過設(shè)置篩選條件進(jìn)行選擇性顯示。該軟件具有歷史數(shù)據(jù)查詢、Excel導(dǎo)入/導(dǎo)出等功能。
圖5 主程序控制流程圖
通過應(yīng)用驗(yàn)證,軟件在Intel Core i5-4590四核8 G內(nèi)存的終端上運(yùn)行,能夠滿足CBTC系統(tǒng)的需求,沒有出現(xiàn)漏包現(xiàn)象,抓包及處理效率能夠跟上系統(tǒng)內(nèi)數(shù)據(jù)包的產(chǎn)生速度。
本文闡述了抓包、存儲(chǔ)及離線解析CBTC系統(tǒng)局域網(wǎng)內(nèi)數(shù)據(jù)的軟件的設(shè)計(jì)過程。該軟件的研發(fā)有助于提高CBTC系統(tǒng)接口測試效率,加快問題定位,提高測試質(zhì)量。按照本文介紹的設(shè)計(jì)方法開發(fā)的軟件具有擴(kuò)展性好、開發(fā)效率高、通用性強(qiáng)等特點(diǎn),這些設(shè)計(jì)方法對(duì)于其他類似應(yīng)用系統(tǒng)的開發(fā)具有一定的借鑒意義。
在此基礎(chǔ)上的進(jìn)一步研究工作是:通過統(tǒng)計(jì)所抓取數(shù)據(jù)包的類型來判斷CBTC系統(tǒng)實(shí)時(shí)網(wǎng)絡(luò)狀態(tài);通過修改數(shù)據(jù)包內(nèi)容,模擬某一子系統(tǒng)向其他子系統(tǒng)發(fā)送錯(cuò)誤數(shù)據(jù)包,實(shí)現(xiàn)故障注入等功能。