石 毅,陳 愷
(中國民用航空中南地區空中交通管理局廣西分局,南寧 530100)
廣西空管分局現階段管理運行的本地相關空管數據類型包括監視數據,報文數據等。而監視數據包括萊斯自動化系統綜合航跡、華泰自動化系統綜合航跡、雷達數據、ADSB 數據等。以萊斯自動化系統綜合航跡數據的引接應用為例,一共包括氣象融合系統、自動化主備同步監控系統、空中交通流量預測系統等七套系統引接該路數據。若均直接通過萊斯自動化系統DOP(綜合數據輸出)服務器引接,將極大增加服務器的工作負荷。因此,為加強分局本地數據管理,規范數據信號輸出,合理規劃數據信號資源,并有效監控各路本地數據鏈路狀態,擬研制空管綜合數據交互平臺。
空管綜合數據交互平臺采用基于Java 語言的C/S 架構進行系統的構建[1],系統主要包含一臺數據處理服務器及防火墻,其結構如圖1 所示。

圖1 空管綜合數據交互平臺結構框圖
系統主要功能模塊包括數據接收處理模塊、數據輸出模塊及終端顯示模塊。系統通過接收處理各路監視數據、報文數據及其他本地空管數據,并根據終端用戶應用需求,將相應數據定制輸出到對應系統,實現數據資源的規劃應用。此外,系統提供收發鏈路的開關操作,斷線告警,延遲監測及歷史數據的查詢和調用輸出等功能。系統的信號處理流程如圖2所示。

圖2 系統信號處理流程
數據接收處理效率,是衡量數據接收處理模塊的重要技術指標之一。由于在輸入鏈路上,各監視數據、報文數據及其他相關空管數據存在輸入上的流量差異(各數據類型流量統計為:監視數據>報文數據>其他空管數據),以氣象報文、自動化系統報文數據接收為例,氣象報文數據鏈路僅在每個整點發送一份報文數據,其余均為空閑時段,而自動化系統當處于主用狀態時,系統報文數據鏈路將對外發送數據。若對上述鏈路的數據接收處理均采用傳統的多線程技術,將占用系統大量進程資源,極大增加系統服務器的工作壓力。因此,提出采用基于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 數據接收處理模塊部分代碼
空管綜合數據交互平臺提供歷史數據查詢及調用功能。其歷史數據儲存主要為監視數據的存儲,儲存方式通過數據文件(.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 算法,數據存儲過程更加安全、快速,從而實現了數據存儲模塊的高效性及可靠性。
以配置數據輸出至流量預測系統為例,該系統需要通過UDP 協議接收自動化系統綜合航跡及自動化系統報文數據。由于空管綜合數據交互平臺至流量預測系統間為單機通訊,因此采用單播進行傳輸通訊。
Java 提供了DatagramSocket 類作為基于UDP協議的Socket[4],該方法可以實現UDP 發送數據,主要步驟為:①調用DatagramSocket()方法,創建發送端Socket 對象,構造數據報套接字并將其綁定到本地主機上的任何可用端口;②分別創建綜合航跡及報文數據包對象,該數據包寫入待發送數據,并調用DatagramPacke(t)方法,進行目的地址及端口號的數據封裝;③調用Send()方法,通過udp 的socket 服務將數據包發送。通過上述方法,實現了發送端的自動化系統綜合航跡及報文數據的數據封裝和發送。
線程是進程中的實際運作單位,是進程的一條流水線,是程序的實際執行者,是最小的執行單位。通常在一個進程中可以包含若干個線程,且一個進程中至少有一個線程。而進程指正在運行的程序,是系統進行資源分配和調用的獨立單位,每一個進程都有它自己的內存空間和系統資源。因此,進程的創建和銷毀耗費大量的系統資源,從而衍生出線程的概念。即允許在一個進程中創建多個線程,這些線程共享進程的資源,并且每個線程擁有自己獨立的程序計數器、線程局部變量等資源,叫多線程技術[5]。多線程技術具有提高進程使用率、CPU利用率及數據吞吐量等優點。
目前,空管綜合數據交互平臺共配置三路數據,分別輸出至流量預測系統、空管復盤分析系統和QNH 不一致告警系統。Java 內置了對多線程的支持,可以很方便地開發出具備多線程功能,同時處理多個任務的應用。多線程技術實現數據的多路輸出的主要步驟為:①為各路數據輸出創建MyThread 類的對象;②重寫run()方法,即定義該線程輸出數據類型及輸出目的地址和端口號;③調用線程對象的start()方法啟動線程。
由于空管綜合數據交互平臺可對各路數據輸出進行開關操作,當配置了多條輸出鏈路時,進程的創建和銷毀將占用較大資源,影響系統性能。使用Java 的線程池接口,因為線程池具有多重優點:可減少創建新線程的時間,提高響應速度;重復利用線程池中線程,不需要每次都創建,降低資源消耗;便于線程管理等。調用Java newCacheThreadPol(l)方法,創建一個可緩存的線程池,并提前創建好多個線程,放入線程池中,使用時直接獲取,使用完放回池中。可以避免頻繁創建銷毀、實現重復利用。
上述多線程技術,最終實現了數據輸出模塊的多路輸出,并具有穩定性及可靠性。
空管綜合數據交互平臺的人機界面采用分頁式界面設計[6],總共劃分成數據輸入流監控、數據輸出流監控、歷史數據查詢(調用)、日志記錄及配置管理共五大功能頁。各功能頁面顯示簡潔、友好,其中通過數據輸入、輸出流監控頁面可直觀查看到各條鏈路狀態,并可在數據輸入、輸出流配置界面對鏈路進行開關或者數據源選擇等操作。數據輸入流監控界面及數據輸出流配置界面分別如圖7、圖8所示。

圖7 數據輸入流監控界面

圖8 數據輸出流配置界面
系統的歷史數據查詢功能頁面,可以查詢到各輸入監視源的歷史數據,并可進行歷史數據導出或調用輸出操作。而系統的日志記錄功能頁面可以查詢到歷史告警信息,系統操作日志等內容。最后一項管理配置功能頁面則提供常用告警參數設置,歷史數據輸出目的地址及端口號等參數設置。
空管綜合數據交互平臺通過NIO、多線程技術實現多路數據的輸入及輸出。通過改進型Hash 算法實現信息的共享性和數據封裝性。在系統的實際應用中,技術維護人員通過系統可進行本地數據的統一管理,數據資源的合理規劃,數據應用的規范輸出,提高了技術維護部門的工作效率,降低在用系統服務器的工作壓力。同時,系統采用模塊化設計,提高了系統的可擴展性和可維護性,為后期本地三級數據中心建設提供了借鑒經驗;此外,系統還可與分局的自研項目,如:空管復盤分析系統、雷達質量分析系統進行互聯,實現數據回放及數據質量分析等功能,該系統將在空管單位和地方機場具有廣泛的應用前景。