【摘 要】提出一種基于C#正則表達(dá)式的民航報(bào)文分析系統(tǒng),該系統(tǒng)將從在用轉(zhuǎn)報(bào)機(jī)進(jìn)行路由配置后接收相應(yīng)的報(bào)文并進(jìn)行分析及統(tǒng)計(jì)。
【關(guān)鍵詞】民航轉(zhuǎn)報(bào);C#;正則表達(dá)式;報(bào)文分析
0.引言
當(dāng)代空中交通管理在平面通信上長(zhǎng)期依賴(lài)于民航轉(zhuǎn)報(bào)系統(tǒng)。該系統(tǒng)將提供包括SITA和AFTEN在內(nèi)的報(bào)文接收、存儲(chǔ)、分析及相關(guān)告警。在實(shí)際工作中,技術(shù)保障工作的開(kāi)展有必要對(duì)相關(guān)信道的報(bào)文進(jìn)行分析及監(jiān)控。另一方面,在業(yè)務(wù)培訓(xùn)上,特別對(duì)于新參加工作者對(duì)于報(bào)文的理解和實(shí)際的應(yīng)用是工作安全要求不可缺少的一部分。在實(shí)踐中,本文提出一種基于C#正則表達(dá)式的報(bào)文分析系統(tǒng),該系統(tǒng)將部署與轉(zhuǎn)報(bào)機(jī)網(wǎng)絡(luò)內(nèi)的一臺(tái)windows平臺(tái)終端(以下簡(jiǎn)稱(chēng)實(shí)驗(yàn)終端),對(duì)需要進(jìn)行監(jiān)控及分析的報(bào)文信道進(jìn)行實(shí)時(shí)監(jiān)控、存儲(chǔ)及統(tǒng)計(jì)。實(shí)現(xiàn)上比以往人工分析更為快捷和簡(jiǎn)單。
1.總體設(shè)計(jì)
在設(shè)計(jì)上,首先為系統(tǒng)創(chuàng)造環(huán)境條件,在轉(zhuǎn)報(bào)機(jī)IP終端上實(shí)現(xiàn)多路由轉(zhuǎn)發(fā)機(jī)制,通過(guò)對(duì)需要監(jiān)控的信道進(jìn)行路由轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)至需要監(jiān)控的實(shí)驗(yàn)終端,實(shí)現(xiàn)監(jiān)控系統(tǒng)數(shù)據(jù)監(jiān)控、分析報(bào)文的同時(shí)保證在用系統(tǒng)的不中斷及安全使用。具體的路由轉(zhuǎn)發(fā)設(shè)置以轉(zhuǎn)報(bào)機(jī)的廠(chǎng)家說(shuō)明書(shū)為準(zhǔn),型號(hào)不同操作步驟不一,此處不再贅述。經(jīng)過(guò)路由轉(zhuǎn)發(fā)的轉(zhuǎn)報(bào)系統(tǒng)實(shí)驗(yàn)終端,能夠?qū)崿F(xiàn)對(duì)監(jiān)控信道的無(wú)誤完全轉(zhuǎn)發(fā)接收,甚至可以同時(shí)監(jiān)控多個(gè)信道(在轉(zhuǎn)報(bào)機(jī)服務(wù)器設(shè)置)。這也為后續(xù)程序設(shè)計(jì)的功能和人機(jī)交互友好性實(shí)現(xiàn)提供了思路。
另一方面,如上所述,系統(tǒng)在實(shí)現(xiàn)上通過(guò)串口接收相應(yīng)的報(bào)文數(shù)據(jù),并在人機(jī)交互界面上提供對(duì)多路數(shù)據(jù)的監(jiān)控可選擇項(xiàng)??傮w程序設(shè)計(jì)由接收模塊,報(bào)文分析模塊和數(shù)據(jù)庫(kù)設(shè)計(jì)構(gòu)成。
1.1接收模塊與數(shù)據(jù)存儲(chǔ)模塊
在傳統(tǒng)的報(bào)文接收方面,系統(tǒng)提供了包括網(wǎng)絡(luò)接口和串口在內(nèi)的多種接入方式,根據(jù)實(shí)際工作情況采用串口接收方式。在C#中,系統(tǒng)在此模塊設(shè)計(jì)上首先對(duì)串口進(jìn)行初始化。
根據(jù)實(shí)際的需求,系統(tǒng)在應(yīng)用中定義串口觸發(fā)事件,形成以中斷為主的數(shù)據(jù)訪(fǎng)問(wèn)方式,一方面降低實(shí)驗(yàn)終端對(duì)轉(zhuǎn)報(bào)系統(tǒng)的影響,另一方面也提高系統(tǒng)的整體資源利用率和對(duì)應(yīng)轉(zhuǎn)報(bào)系統(tǒng)的實(shí)際工作。具體接收函數(shù)如下:其中buf二級(jí)制數(shù)組為程序聲明的一個(gè)臨時(shí)數(shù)組,用于存儲(chǔ)當(dāng)前系統(tǒng)接收來(lái)的串口數(shù)據(jù)。而在C#中串口控件定義為comm,其提供的讀取函數(shù)能夠直接獲取串口數(shù)據(jù)。另外一方面則應(yīng)用了C#的異步方式進(jìn)行接收,并按照ASCII進(jìn)行字符串轉(zhuǎn)換,完成一個(gè)完整的報(bào)文接收,具體實(shí)現(xiàn)如下:
voidcomm_DataReceived(objectsender, SerialDataReceivedEventArgs e)
{
byte[] buf=new byte[n];
comm.Read(buf,0,n);
builder.Clear();
this.Invoke((EventHandler)(delegate
{
builder.Append(Encoding.ASCII.GetString(buf));
this.txGet.AppendText(builder.ToString());
this.txGet.AppendText(“\n”);
labelGetCount.Text=\"Get:\"+received_count.ToString();
}));
}
作為數(shù)據(jù)存儲(chǔ)模塊,visual2010開(kāi)發(fā)平臺(tái)實(shí)現(xiàn)了C#程序設(shè)計(jì)與SQL SEVER的完美快速結(jié)合,因此可以在數(shù)據(jù)庫(kù)中建立相應(yīng)的表格對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),具體設(shè)計(jì)由于篇幅所限不再贅述。
1.2報(bào)文分析模塊
對(duì)于按照固定格式發(fā)送的報(bào)文數(shù)據(jù),根據(jù)文獻(xiàn)[2]在處理上可以使用C#正則表達(dá)式。在國(guó)內(nèi)航空通信網(wǎng)中,傳遞標(biāo)準(zhǔn)的AFTN和SITA格式電報(bào),每份電報(bào)均由以下五部分組成:報(bào)頭行、收電地址部分、發(fā)電地址部分、電文部分和電報(bào)結(jié)束符號(hào)。
1.2.1報(bào)頭行
A電報(bào)開(kāi)始信號(hào):由一組ZCZC和一個(gè)間隔組成。該信號(hào)必須作一整組發(fā)送,不得插入任何字符。
B電路識(shí)別代號(hào)和電報(bào)流水號(hào):電路識(shí)別代號(hào)由三位字母組成,它緊跟ZCZC之后,電路識(shí)別代號(hào)后緊跟電報(bào)流水號(hào)。電報(bào)流水號(hào)從001開(kāi)始到999(假設(shè)流水號(hào)位數(shù)為3位)順序編發(fā)和循環(huán),并于每日零時(shí)(UTC)起從001開(kāi)始,用來(lái)表明本機(jī)收發(fā)電報(bào)的份數(shù),以防漏報(bào)。
C拍發(fā)時(shí)間:由一個(gè)空格和四位數(shù)字組成,緊跟在電路識(shí)別代號(hào)和電報(bào)流水號(hào)后面,始發(fā)時(shí),拍發(fā)時(shí)間表示開(kāi)始向外發(fā)送的時(shí)間;接收時(shí),拍發(fā)時(shí)間表示本機(jī)開(kāi)始收到該報(bào)的時(shí)間。
D改路標(biāo)志:由三個(gè)字母V和一個(gè)間隔信號(hào)組成,僅在電報(bào)通過(guò)備用路由承轉(zhuǎn)時(shí)使用。
1.2.2收電地址部分
A電報(bào)等級(jí)代號(hào):由兩個(gè)字母組成,兩個(gè)字母必須同發(fā)一組,不得插入其他字符,每份電報(bào)只準(zhǔn)使用一個(gè)電報(bào)等級(jí)代號(hào)。
B收電地址:AFTN格式的電報(bào)每個(gè)收電地址代號(hào)由八個(gè)字母組成,前四個(gè)字母為地名代號(hào),第五至第七個(gè)字母為單位部門(mén)代號(hào)或航空公司代號(hào)。第八個(gè)字母為填充字符或航空公司內(nèi)部使用的單位代號(hào)。
1.2.3發(fā)電地址部分
A電報(bào)簽發(fā)時(shí)間:由一組六位數(shù)的日時(shí)組(1、2位為日期,3、4位為小時(shí),5、6位為分鐘)組成。對(duì)于A(yíng)FTN電報(bào)先發(fā)此項(xiàng),而對(duì)于SITA電報(bào)則先發(fā)發(fā)電地址代號(hào)部分即電報(bào)簽發(fā)時(shí)間緊跟在發(fā)電地址部分之后。
B發(fā)電地址代號(hào):字母含義與收電地址代號(hào)相同,需注意的是SITA電報(bào)中發(fā)電地址前面要加一個(gè)”.”。
1.2.4電文部分
電文由發(fā)電人按規(guī)定要求編寫(xiě)。電文結(jié)束符號(hào)現(xiàn)采用一個(gè)或幾個(gè)換行鍵來(lái)實(shí)現(xiàn)。
1.2.5電報(bào)結(jié)束部分
AFTN格式電報(bào)由七次連續(xù)的升格(四至七個(gè)均可)、四個(gè)連續(xù)的字母N組成。而SITA格式的電報(bào)則有它的特殊要求,在電文結(jié)束時(shí)需另起一行加“=”,再由七次連續(xù)的升格(四到七個(gè)均可)、四個(gè)連續(xù)的字母N組成。
因此在設(shè)計(jì)中只需要按照上述規(guī)定制定好正則表達(dá)式模板,實(shí)現(xiàn)對(duì)報(bào)頭、發(fā)電地址、收電地址、電文進(jìn)行分析處理就可以完成分析任務(wù)。而在C#中,正則表達(dá)式的設(shè)計(jì)顯得十分方便。
首先引入命名空間引入System.Text.RegularExpressions,并用正則表達(dá)式構(gòu)造一個(gè)Regex類(lèi),該類(lèi)在IsMatch方法驗(yàn)證匹配中將返回一個(gè)bool值,如果有匹配項(xiàng),返回true,否則返回1。
為了實(shí)現(xiàn)的方便系統(tǒng)還提供了分割字符更換函數(shù),以應(yīng)對(duì)后續(xù)的數(shù)據(jù)處理,具體實(shí)現(xiàn)如下:
publicvoid Replace(string source){
Regexregex=newRegex(\"http://\",RegexOptions.IgnoreCase);
stringresult=regex.Replace(source,\"|\");}
2.結(jié)束語(yǔ)
本文提出一種基于C#正則表達(dá)式的民航報(bào)文分析系統(tǒng),該系統(tǒng)借助轉(zhuǎn)報(bào)機(jī)的路由轉(zhuǎn)發(fā)功能,在網(wǎng)內(nèi)部署相應(yīng)的分析實(shí)驗(yàn)終端,通過(guò)報(bào)文接收、分析和存儲(chǔ)實(shí)現(xiàn)了對(duì)民航轉(zhuǎn)報(bào)系統(tǒng)的另一種技術(shù)保障手段。該系統(tǒng)能夠不影響正常業(yè)務(wù)的運(yùn)行為安全事件調(diào)查、業(yè)務(wù)培訓(xùn)學(xué)習(xí)以及故障排查提供另一種數(shù)據(jù)支持。
【參考文獻(xiàn)】
[1]陳齊亞,米超.民航氣象報(bào)文綜合應(yīng)用系統(tǒng)軟件的總體設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2011(30).
[2]曾培彬,高升秋.基于Web信息處理的機(jī)位信息融合設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)民航飛行學(xué)院學(xué)報(bào),2014(05).