李祥 吳瑞祥 薛雯
(中國電子科技集團公司第二十八研究所 江蘇 210007)
隨著信息技術的發展,戰場信息的探測和收集手段越來越多,這對信息的處理與展現提出了很大的挑戰。人對信息最直觀的認識來源于視覺和聽覺。而對于戰場綜合情報而言,最直觀的表現方式是圖形。由于戰場態勢復雜多變,需要各專業人員進行分析與處理。處理完后,如何以一種統一的方式展現在很大程度上決定了情報的效用。因此,構建一個可擴展的開放式圖形展現框架是指揮信息系統的必然需要。
同時,從軟件的角度來看,可擴展性作為軟件的非功能性屬性意義重大,它在一定程度上決定了軟件的生命力。可擴展性好的軟件能夠適應各種變化,能夠很快的響應用戶的需求。因此,軟件開發者總是力求提高軟件的可擴展性。良好的設計是可擴展性的保障,插件式開發作為一種良好的設計得到了廣泛的應用。Eclipse就是插件式開發的典型案例。Eclipse基于OSGi(Open Services Gateway Initiative,OSGi,開放服務網關協議),開發者按照其規范開發的插件能夠無縫集成到Eclipse軟件中。
戰場態勢總體分為兩大類:動態目標情報和靜態部署情報。其中動態目標情報包括:雷達情報、技偵情報、電抗情報等,靜態部署情報包括:機場、港口、兵力部署等軍事部署信息。此外,在綜合態勢之上還可根據實時態勢疊加作戰計劃等信息,進行作戰推演評估,擬制修改作戰計劃。如圖1所示為戰場態勢綜合集成展現示意圖。

圖1 戰場態勢綜合集成展現
圖 1中,“原始態勢數據”來源有:雷達站、觀通站探測的實時目標數據,作戰標準數據庫的靜態部署數據、作戰計劃數據和評估模型數據等。這些數據都會通過“統一信息傳遞平臺”發送給綜合態勢展現終端,綜合態勢展現終端通過各處理模塊對這些數據進行預處理,并通過統一圖形繪制命令進行圖形繪制,將數據圖形化顯示。此外,綜合態勢展現終端具有與展現數據的干預交互能力,能夠在態勢圖上擬制修改作戰計劃。
如何對各處理模塊進行有效的管理(加載、調用等)決定了綜合態勢展現終端的可擴展性和實用性。好的模塊管理方法能夠按需集成多個數據處理模塊,又不增加軟件的復雜度,能夠提高軟件的穩定性和展現的效果。
針對戰場綜合態勢展現的要求,本文提出了一種可擴展開放圖形框架XOGF(eXtend Open Graphic Frame),用于有效管理和集成基于態勢圖的業務處理模塊。本節將對XOGF的主體思想和工作原理進行介紹。
可擴展開放圖形框架(以下簡稱圖形框架)是一個提供圖形插件式開發的基礎平臺,由一個核心部件和一系列管理部件組成,其體系結構如圖 2所示。

圖2 可擴展開放圖形框架體系結構圖
從圖 2可以看出,基于圖形框架的應用軟件有三個組成部分:
(1)核心部件
圖形框架核心部件的作用是:加載插件,調用插件的標準化響應函數,負責插件間信息交互。
(2)管理部件
圖形框架管理部件的作用是管理插件(增加、刪除、更改優先級),分配命令碼和干預命令,管理操作對象。管理部件具有六個子部件:插件管理器、命令碼分配器、干預命令分配器、操作對象管理器、插件生成器和日志分析器。
(3)插件
插件是依據一定準則開發的能夠應用于圖形框架軟件以達到擴充其能力的動態庫。這些準則由核心部分制定。

圖3 圖形框架組件關系圖
如圖 3所示為圖形框架組件關系圖。主程序通過插件表來加載插件,插件管理自己的菜單和工具欄。當主程序觸發事件后,核心部件將其分發給各插件,各插件決定是否要響應這一事件。然而,不同的事件會產生不同的狀態,而不同的狀態會決定下一事件應該由哪個插件響應。由于各插件之間是自治的和自完備的,如何保證某一插件響應事件后系統狀態的變化能夠被其他插件感知而又不破壞插件的自治性和完備性是圖形框架設計的重點和難點。我們將這一問題分解為三個核心問題:(1)插件間如何通信;(2)如何確定系統的唯一狀態;(3)右鍵菜單如何組合。下面將分別討論這三個問題。
2.2.1 插件間通信
XOGF有兩類插件通信問題:(1)核心部件與插件間的通信問題;(2)插件之間的通信問題。
對于問題(1),框架核心部件向插件傳輸信息的問題已解決,如圖 4所示,通過調用插件的標準導出函數來實現;而插件向框架核心部件的信息傳輸可通過向主程序發送消息,再由主程序轉發給框架核心部件。

圖4 核心部件與插件間的通信
對于問題(2),插件通過核心部件中轉信息。插件間通信的方式有兩種:主動獲取與被動接收。無論是哪種模式,都需要一塊內存區域來存儲通信的“信息”。圖 5示意了插件如何主動獲取與被動接收信息。
插件間的通信主要應用于兩種場景:(1)某一插件狀態發生改變通知其他插件;(2)某插件選中了其導出對象,要將導出對象的信息傳給依賴于他的插件,這種情況主要應用于右鍵菜單的合并。

圖5 插件間的通信
2.2.2 確定系統的唯一狀態
圖形操作交互式事件有三類:按鈕事件(菜單和工具欄產生的事件)、鼠標事件和鍵盤事件。在程序中,一個動作有可能由單個事件直接完成,也可能由事件引起,由隨后產生的若干個事件完成。對于由單個事件直接完成的動作不會引起狀態的變化。由若干個事件完成的動作在動作發生時其它插件處于休眠狀態。為了更好地說明事件、動作與狀態變化的關系,下面對相關術語進行定義:
(1)動作
動作指一個操作單元,如在要圖標繪時繪制平行四邊形、折線,放大/縮小地圖,求地圖兩點距離,等等。動作可以由“動作事件”完成,也可以由“動作觸發事件”引起,進一步由鼠標事件、鍵盤事件完成。
(2)狀態
我們將“動作”視為“狀態”,狀態的變遷由按鈕事件(指動作觸發事件)引起,但按鈕事件(指動作事件)并不一定會引起狀態的變遷。我們用兩個元素來唯一確定一個狀態:插件的激活狀態和插件內部狀態。插件的激活狀態由圖形框架核心部件統一管理,而插件內部狀態由插件自身進行管理。插件的激活狀態通過為插件增加一個變量進行標識。我們認為通常插件之間是互斥的,即當一個插件被動作觸發事件激活時,其它插件應被通知休眠。插件向核心部件通告其狀態,核心部件據此決定其它插件的狀態。核心部件的處理流程如圖 6所示。

圖6 狀態切換處理流程
只有在“動作觸發事件”發生時才需要確定插件的唯一狀態,動作觸發事件的事件爭用問題可通過插件的狀態機制來解決。動作觸發事件引起的動作由若干鼠標事件和鍵盤事件完成。在動作發生時,只有響應了動作觸發事件的插件處于激活狀態,其它的插件處于休眠狀態。因此,插件中的鼠標事件和鍵盤事件需要根據是否處于激活狀態來觸發。
2.2.3 右鍵菜單組合
在圖形界面上操作時,有時會需要彈出右鍵菜單。右鍵菜單可能只來自于某個插件,也可能同時來自于某幾個插件,后者涉及到右鍵菜單組合的問題。此問題解決方法為:右鍵菜單的彈出需要指出“操作對象”,沒有操作對象就沒有右鍵菜單,對插件導出的右鍵菜單進行組合。解決右鍵菜單組合問題應以“操作對象”(簡稱“對象”)為中心,遵循三個原則:1)每個插件導出操作對象;2)每個插件給出要操作(依賴)的操作對象;3)對具有相同操作對象的插件定義其優先級。此優先級用于右鍵菜單組合時的前后順序。默認的優先級為插件加載的順序(越先加載優先級越高)。插件的加載順序取決于插件的依賴關系,而插件的依賴關系則取決于對象的依賴關系。“操作對象”是關系依賴的最小粒度。在插件描述文件中,給出了各插件的導出對象和導入(依賴)對象。在軟件形成前,先要根據導出對象和導入對象計算出插件的依賴關系,形成插件的優先級,并將優先級寫到插件描述文件中。
右鍵菜單只有在多個插件要操作同一個對象時才要組合。因此,當導出對象的插件要彈出與導出對象相關的菜單時,該插件需要向其他依賴他的插件發送對象的相關消息。為每個對象開辟一個存儲空間,用于存儲對象的信息。插件根據對象的信息決定是否要創建并返回右鍵菜單,框架核心部件將多個右鍵菜單拼接起來。

圖7 多插件右鍵菜單組合流程示意圖
如圖 7所示,為兩個插件右鍵菜單組合流程的示意圖。當主程序調用核心部件加載右鍵菜單時,核心部件依據插件加載的順序獲得插件的右鍵菜單進行組合。當同一個對象有多個插件要對其進行操作時(即多個插件要返回右鍵菜單),操作對象所在的插件將操作對象的數據寫到共享數據區中。依賴此對象的插件將根據共享區中的內容決定創建何種右鍵菜單。
目前,已經基于VC6.0和VS2008實現了XOGF,并已應用到某一體化指揮平臺和某聯合情報處理系統中,兩個系統均已實裝,擔負部隊日常值班任務。本節將對XOGF實現的關鍵思路進行描述。
XOGF核心部件的作用是:加載插件,調用插件的標準化響應函數,負責插件間信息交互。核心部件由插件表、插件標準函數抽象類和相關配置文件組成。
3.1.1 插件標準函數抽象類
核心部件需要定義插件標準函數抽象類作為插件的實現準則和規范。類中的標準函數都是圖形操作常用函數,并提供了擴展能力的函數。這些函數接口包括:初始化插件、創建系統工具欄、創建系統菜單、執行命令碼、更新菜單狀態、執行干預命令、繪制圖形、彈出上下文菜單、定時器響應、鼠標按鍵、鼠標移動、鍵盤按鍵、處理報文、獲取插件信息、釋放插件。
插件標準函數抽象類還描述了插件信息,包括:插件名稱、動態庫名稱、插件命令碼處理范圍、插件版本和開發者信息。
3.1.2 插件表
核心部件通過插件表來加載并調用插件的功能。插件表中每個插件元素包含的信息為:插件調入優先級、插件信息表、插件句柄、插件接口指針等。
3.1.3 核心配置文件格式設計
核心部件依賴一系列的配置文件進行工作,這些配置文件包括:1)插件描述文件;2)插件框架命令碼范圍定義文件。
插件描述文件描述了插件的信息,由插件生成器生成,由插件管理器進行管理,程序員在開發插件前必須先獲得此文件。插件描述文件應該包括以下信息:插件名稱、插件動態庫名稱、優先級、版本號、開發者信息、命令碼處理范圍、插件導入對象和插件導出對象。插件描述文件使用XML格式。
插件核心部件將會根據導出和依賴的對象決定插件的優先級(第一級優先級),然后根據配置文件中的“優先級”決定第二級優先級。由于同一插件導出和依賴的對象有多個,因此由導出和依賴的對象計算出的插件優先級有可能發生沖突。這種沖突在設計插件時是要避免的。在操作對象管理器中,將通過對象依賴圖的形式來查找這種沖突。
插件框架命令碼范圍定義文件使用XML格式,描述了插件框架中插件可分配使用的命令碼范圍,由命令碼分配器負責管理。
圖形框架管理部件的作用是管理插件(增加、刪除、更改優先級),分配命令碼和干預命令,管理操作對象。管理部件的六個子部件為插件的生成和開發提供便利,其功能描述如下:
1)插件管理器
插件管理器是一個應用程序,用于為一個應用載入、刪除插件,調整插件的優先級。插件管理器在應用運行前工作,應用運行時插件管理器產生的更改只有在應用下次運行時才生效。
2)命令碼分配器
因為每個插件可處理的命令碼不能重疊,因此需要統一分配各插件可使用的命令碼范圍。這項工作可由命令碼分配器來完成。
3)干預命令分配器
用于分配干預命令由哪個插件響應。
(4)操作對象管理器
用于指定插件的導出對象、依賴對象,對象的優先級。
(5)插件生成器
插件生成器是一個應用程序,應用于插件開發階段,用于生成插件原始必要代碼和插件描述文件。程序員要開發新插件時必須由插件生成器生成插件原始必要代碼和插件描述文件,并在此基礎上進行二次開發。
插件生成器還依賴于命令碼分配器和操作對象管理器。
(6)日志分析器
日志分析器是一個獨立的應用程序,用于控制日志打印,以便于軟件集成聯試。日志分析器支持文件打印和窗口打印,支持日志分類打印和單步打印。日志的單步打印指日志分析器收到日志消息后,將日志分析器程序掛起,直到某個事件觸發日志分析器,日志分析器繼續執行。
XOGF解決了指揮信息系統中如何組合展現復雜戰場態勢的難題,提出了一種基于插件的模塊組裝機制,實現插件的即插即用,能夠綜合顯示多專業戰場態勢。但是,XOGF并沒有考慮如何有效組合軟件主菜單和工具欄,也沒有考慮如何將狀態欄的空間分配給各插件。在后續工作中,將對這兩個問題進行重點研究,設計一套規則和工具,用于編排主菜單、工具欄和狀態欄的內容。
[1]鄧亞明,楊邦榮.基于ECLIPSE圖形插件開發的研究[J].電腦開發與應用,2009.第22卷 第2期
[2]劉亞濱,楊紅.精通Eclipse[M].北京:電子工業出版社,2004
[3]劉俊平,鄒江南,賀玉寅.美軍戰場態勢感知能力分析[J].國防信息化,2007.第6期
[4]李蘇軍,吳玲達,胡世才,寧漢辰.數字化海戰場態勢表現系統研究[M].系統仿真學報,2009.第21卷 第19期
[5]蔡志浩,彭曉源.基于地理信息系統的虛擬戰場態勢顯示[J].系統仿真學報,2003.第15卷 第7期
[6]楊沁梅,孫曉鳴.基于插件集成技術的通用陸戰場態勢圖,2012.第10期
[7]朱江,孫華,張華.基于插件的通用計劃作業框架[J].指揮信息系統與技術,2013.第2期