李祥 吳瑞祥 薛雯
(中國(guó)電子科技集團(tuán)公司第二十八研究所 江蘇 210007)
隨著信息技術(shù)的發(fā)展,戰(zhàn)場(chǎng)信息的探測(cè)和收集手段越來(lái)越多,這對(duì)信息的處理與展現(xiàn)提出了很大的挑戰(zhàn)。人對(duì)信息最直觀的認(rèn)識(shí)來(lái)源于視覺和聽覺。而對(duì)于戰(zhàn)場(chǎng)綜合情報(bào)而言,最直觀的表現(xiàn)方式是圖形。由于戰(zhàn)場(chǎng)態(tài)勢(shì)復(fù)雜多變,需要各專業(yè)人員進(jìn)行分析與處理。處理完后,如何以一種統(tǒng)一的方式展現(xiàn)在很大程度上決定了情報(bào)的效用。因此,構(gòu)建一個(gè)可擴(kuò)展的開放式圖形展現(xiàn)框架是指揮信息系統(tǒng)的必然需要。
同時(shí),從軟件的角度來(lái)看,可擴(kuò)展性作為軟件的非功能性屬性意義重大,它在一定程度上決定了軟件的生命力。可擴(kuò)展性好的軟件能夠適應(yīng)各種變化,能夠很快的響應(yīng)用戶的需求。因此,軟件開發(fā)者總是力求提高軟件的可擴(kuò)展性。良好的設(shè)計(jì)是可擴(kuò)展性的保障,插件式開發(fā)作為一種良好的設(shè)計(jì)得到了廣泛的應(yīng)用。Eclipse就是插件式開發(fā)的典型案例。Eclipse基于OSGi(Open Services Gateway Initiative,OSGi,開放服務(wù)網(wǎng)關(guān)協(xié)議),開發(fā)者按照其規(guī)范開發(fā)的插件能夠無(wú)縫集成到Eclipse軟件中。
戰(zhàn)場(chǎng)態(tài)勢(shì)總體分為兩大類:動(dòng)態(tài)目標(biāo)情報(bào)和靜態(tài)部署情報(bào)。其中動(dòng)態(tài)目標(biāo)情報(bào)包括:雷達(dá)情報(bào)、技偵情報(bào)、電抗情報(bào)等,靜態(tài)部署情報(bào)包括:機(jī)場(chǎng)、港口、兵力部署等軍事部署信息。此外,在綜合態(tài)勢(shì)之上還可根據(jù)實(shí)時(shí)態(tài)勢(shì)疊加作戰(zhàn)計(jì)劃等信息,進(jìn)行作戰(zhàn)推演評(píng)估,擬制修改作戰(zhàn)計(jì)劃。如圖1所示為戰(zhàn)場(chǎng)態(tài)勢(shì)綜合集成展現(xiàn)示意圖。
圖1 戰(zhàn)場(chǎng)態(tài)勢(shì)綜合集成展現(xiàn)
圖 1中,“原始態(tài)勢(shì)數(shù)據(jù)”來(lái)源有:雷達(dá)站、觀通站探測(cè)的實(shí)時(shí)目標(biāo)數(shù)據(jù),作戰(zhàn)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)的靜態(tài)部署數(shù)據(jù)、作戰(zhàn)計(jì)劃數(shù)據(jù)和評(píng)估模型數(shù)據(jù)等。這些數(shù)據(jù)都會(huì)通過(guò)“統(tǒng)一信息傳遞平臺(tái)”發(fā)送給綜合態(tài)勢(shì)展現(xiàn)終端,綜合態(tài)勢(shì)展現(xiàn)終端通過(guò)各處理模塊對(duì)這些數(shù)據(jù)進(jìn)行預(yù)處理,并通過(guò)統(tǒng)一圖形繪制命令進(jìn)行圖形繪制,將數(shù)據(jù)圖形化顯示。此外,綜合態(tài)勢(shì)展現(xiàn)終端具有與展現(xiàn)數(shù)據(jù)的干預(yù)交互能力,能夠在態(tài)勢(shì)圖上擬制修改作戰(zhàn)計(jì)劃。
如何對(duì)各處理模塊進(jìn)行有效的管理(加載、調(diào)用等)決定了綜合態(tài)勢(shì)展現(xiàn)終端的可擴(kuò)展性和實(shí)用性。好的模塊管理方法能夠按需集成多個(gè)數(shù)據(jù)處理模塊,又不增加軟件的復(fù)雜度,能夠提高軟件的穩(wěn)定性和展現(xiàn)的效果。
針對(duì)戰(zhàn)場(chǎng)綜合態(tài)勢(shì)展現(xiàn)的要求,本文提出了一種可擴(kuò)展開放圖形框架XOGF(eXtend Open Graphic Frame),用于有效管理和集成基于態(tài)勢(shì)圖的業(yè)務(wù)處理模塊。本節(jié)將對(duì)XOGF的主體思想和工作原理進(jìn)行介紹。
可擴(kuò)展開放圖形框架(以下簡(jiǎn)稱圖形框架)是一個(gè)提供圖形插件式開發(fā)的基礎(chǔ)平臺(tái),由一個(gè)核心部件和一系列管理部件組成,其體系結(jié)構(gòu)如圖 2所示。
圖2 可擴(kuò)展開放圖形框架體系結(jié)構(gòu)圖
從圖 2可以看出,基于圖形框架的應(yīng)用軟件有三個(gè)組成部分:
(1)核心部件
圖形框架核心部件的作用是:加載插件,調(diào)用插件的標(biāo)準(zhǔn)化響應(yīng)函數(shù),負(fù)責(zé)插件間信息交互。
(2)管理部件
圖形框架管理部件的作用是管理插件(增加、刪除、更改優(yōu)先級(jí)),分配命令碼和干預(yù)命令,管理操作對(duì)象。管理部件具有六個(gè)子部件:插件管理器、命令碼分配器、干預(yù)命令分配器、操作對(duì)象管理器、插件生成器和日志分析器。
(3)插件
插件是依據(jù)一定準(zhǔn)則開發(fā)的能夠應(yīng)用于圖形框架軟件以達(dá)到擴(kuò)充其能力的動(dòng)態(tài)庫(kù)。這些準(zhǔn)則由核心部分制定。
圖3 圖形框架組件關(guān)系圖
如圖 3所示為圖形框架組件關(guān)系圖。主程序通過(guò)插件表來(lái)加載插件,插件管理自己的菜單和工具欄。當(dāng)主程序觸發(fā)事件后,核心部件將其分發(fā)給各插件,各插件決定是否要響應(yīng)這一事件。然而,不同的事件會(huì)產(chǎn)生不同的狀態(tài),而不同的狀態(tài)會(huì)決定下一事件應(yīng)該由哪個(gè)插件響應(yīng)。由于各插件之間是自治的和自完備的,如何保證某一插件響應(yīng)事件后系統(tǒng)狀態(tài)的變化能夠被其他插件感知而又不破壞插件的自治性和完備性是圖形框架設(shè)計(jì)的重點(diǎn)和難點(diǎn)。我們將這一問(wèn)題分解為三個(gè)核心問(wèn)題:(1)插件間如何通信;(2)如何確定系統(tǒng)的唯一狀態(tài);(3)右鍵菜單如何組合。下面將分別討論這三個(gè)問(wèn)題。
2.2.1 插件間通信
XOGF有兩類插件通信問(wèn)題:(1)核心部件與插件間的通信問(wèn)題;(2)插件之間的通信問(wèn)題。
對(duì)于問(wèn)題(1),框架核心部件向插件傳輸信息的問(wèn)題已解決,如圖 4所示,通過(guò)調(diào)用插件的標(biāo)準(zhǔn)導(dǎo)出函數(shù)來(lái)實(shí)現(xiàn);而插件向框架核心部件的信息傳輸可通過(guò)向主程序發(fā)送消息,再由主程序轉(zhuǎn)發(fā)給框架核心部件。
圖4 核心部件與插件間的通信
對(duì)于問(wèn)題(2),插件通過(guò)核心部件中轉(zhuǎn)信息。插件間通信的方式有兩種:主動(dòng)獲取與被動(dòng)接收。無(wú)論是哪種模式,都需要一塊內(nèi)存區(qū)域來(lái)存儲(chǔ)通信的“信息”。圖 5示意了插件如何主動(dòng)獲取與被動(dòng)接收信息。
插件間的通信主要應(yīng)用于兩種場(chǎng)景:(1)某一插件狀態(tài)發(fā)生改變通知其他插件;(2)某插件選中了其導(dǎo)出對(duì)象,要將導(dǎo)出對(duì)象的信息傳給依賴于他的插件,這種情況主要應(yīng)用于右鍵菜單的合并。
圖5 插件間的通信
2.2.2 確定系統(tǒng)的唯一狀態(tài)
圖形操作交互式事件有三類:按鈕事件(菜單和工具欄產(chǎn)生的事件)、鼠標(biāo)事件和鍵盤事件。在程序中,一個(gè)動(dòng)作有可能由單個(gè)事件直接完成,也可能由事件引起,由隨后產(chǎn)生的若干個(gè)事件完成。對(duì)于由單個(gè)事件直接完成的動(dòng)作不會(huì)引起狀態(tài)的變化。由若干個(gè)事件完成的動(dòng)作在動(dòng)作發(fā)生時(shí)其它插件處于休眠狀態(tài)。為了更好地說(shuō)明事件、動(dòng)作與狀態(tài)變化的關(guān)系,下面對(duì)相關(guān)術(shù)語(yǔ)進(jìn)行定義:
(1)動(dòng)作
動(dòng)作指一個(gè)操作單元,如在要圖標(biāo)繪時(shí)繪制平行四邊形、折線,放大/縮小地圖,求地圖兩點(diǎn)距離,等等。動(dòng)作可以由“動(dòng)作事件”完成,也可以由“動(dòng)作觸發(fā)事件”引起,進(jìn)一步由鼠標(biāo)事件、鍵盤事件完成。
(2)狀態(tài)
我們將“動(dòng)作”視為“狀態(tài)”,狀態(tài)的變遷由按鈕事件(指動(dòng)作觸發(fā)事件)引起,但按鈕事件(指動(dòng)作事件)并不一定會(huì)引起狀態(tài)的變遷。我們用兩個(gè)元素來(lái)唯一確定一個(gè)狀態(tài):插件的激活狀態(tài)和插件內(nèi)部狀態(tài)。插件的激活狀態(tài)由圖形框架核心部件統(tǒng)一管理,而插件內(nèi)部狀態(tài)由插件自身進(jìn)行管理。插件的激活狀態(tài)通過(guò)為插件增加一個(gè)變量進(jìn)行標(biāo)識(shí)。我們認(rèn)為通常插件之間是互斥的,即當(dāng)一個(gè)插件被動(dòng)作觸發(fā)事件激活時(shí),其它插件應(yīng)被通知休眠。插件向核心部件通告其狀態(tài),核心部件據(jù)此決定其它插件的狀態(tài)。核心部件的處理流程如圖 6所示。
圖6 狀態(tài)切換處理流程
只有在“動(dòng)作觸發(fā)事件”發(fā)生時(shí)才需要確定插件的唯一狀態(tài),動(dòng)作觸發(fā)事件的事件爭(zhēng)用問(wèn)題可通過(guò)插件的狀態(tài)機(jī)制來(lái)解決。動(dòng)作觸發(fā)事件引起的動(dòng)作由若干鼠標(biāo)事件和鍵盤事件完成。在動(dòng)作發(fā)生時(shí),只有響應(yīng)了動(dòng)作觸發(fā)事件的插件處于激活狀態(tài),其它的插件處于休眠狀態(tài)。因此,插件中的鼠標(biāo)事件和鍵盤事件需要根據(jù)是否處于激活狀態(tài)來(lái)觸發(fā)。
2.2.3 右鍵菜單組合
在圖形界面上操作時(shí),有時(shí)會(huì)需要彈出右鍵菜單。右鍵菜單可能只來(lái)自于某個(gè)插件,也可能同時(shí)來(lái)自于某幾個(gè)插件,后者涉及到右鍵菜單組合的問(wèn)題。此問(wèn)題解決方法為:右鍵菜單的彈出需要指出“操作對(duì)象”,沒(méi)有操作對(duì)象就沒(méi)有右鍵菜單,對(duì)插件導(dǎo)出的右鍵菜單進(jìn)行組合。解決右鍵菜單組合問(wèn)題應(yīng)以“操作對(duì)象”(簡(jiǎn)稱“對(duì)象”)為中心,遵循三個(gè)原則:1)每個(gè)插件導(dǎo)出操作對(duì)象;2)每個(gè)插件給出要操作(依賴)的操作對(duì)象;3)對(duì)具有相同操作對(duì)象的插件定義其優(yōu)先級(jí)。此優(yōu)先級(jí)用于右鍵菜單組合時(shí)的前后順序。默認(rèn)的優(yōu)先級(jí)為插件加載的順序(越先加載優(yōu)先級(jí)越高)。插件的加載順序取決于插件的依賴關(guān)系,而插件的依賴關(guān)系則取決于對(duì)象的依賴關(guān)系?!安僮鲗?duì)象”是關(guān)系依賴的最小粒度。在插件描述文件中,給出了各插件的導(dǎo)出對(duì)象和導(dǎo)入(依賴)對(duì)象。在軟件形成前,先要根據(jù)導(dǎo)出對(duì)象和導(dǎo)入對(duì)象計(jì)算出插件的依賴關(guān)系,形成插件的優(yōu)先級(jí),并將優(yōu)先級(jí)寫到插件描述文件中。
右鍵菜單只有在多個(gè)插件要操作同一個(gè)對(duì)象時(shí)才要組合。因此,當(dāng)導(dǎo)出對(duì)象的插件要彈出與導(dǎo)出對(duì)象相關(guān)的菜單時(shí),該插件需要向其他依賴他的插件發(fā)送對(duì)象的相關(guān)消息。為每個(gè)對(duì)象開辟一個(gè)存儲(chǔ)空間,用于存儲(chǔ)對(duì)象的信息。插件根據(jù)對(duì)象的信息決定是否要?jiǎng)?chuàng)建并返回右鍵菜單,框架核心部件將多個(gè)右鍵菜單拼接起來(lái)。
圖7 多插件右鍵菜單組合流程示意圖
如圖 7所示,為兩個(gè)插件右鍵菜單組合流程的示意圖。當(dāng)主程序調(diào)用核心部件加載右鍵菜單時(shí),核心部件依據(jù)插件加載的順序獲得插件的右鍵菜單進(jìn)行組合。當(dāng)同一個(gè)對(duì)象有多個(gè)插件要對(duì)其進(jìn)行操作時(shí)(即多個(gè)插件要返回右鍵菜單),操作對(duì)象所在的插件將操作對(duì)象的數(shù)據(jù)寫到共享數(shù)據(jù)區(qū)中。依賴此對(duì)象的插件將根據(jù)共享區(qū)中的內(nèi)容決定創(chuàng)建何種右鍵菜單。
目前,已經(jīng)基于VC6.0和VS2008實(shí)現(xiàn)了XOGF,并已應(yīng)用到某一體化指揮平臺(tái)和某聯(lián)合情報(bào)處理系統(tǒng)中,兩個(gè)系統(tǒng)均已實(shí)裝,擔(dān)負(fù)部隊(duì)日常值班任務(wù)。本節(jié)將對(duì)XOGF實(shí)現(xiàn)的關(guān)鍵思路進(jìn)行描述。
XOGF核心部件的作用是:加載插件,調(diào)用插件的標(biāo)準(zhǔn)化響應(yīng)函數(shù),負(fù)責(zé)插件間信息交互。核心部件由插件表、插件標(biāo)準(zhǔn)函數(shù)抽象類和相關(guān)配置文件組成。
3.1.1 插件標(biāo)準(zhǔn)函數(shù)抽象類
核心部件需要定義插件標(biāo)準(zhǔn)函數(shù)抽象類作為插件的實(shí)現(xiàn)準(zhǔn)則和規(guī)范。類中的標(biāo)準(zhǔn)函數(shù)都是圖形操作常用函數(shù),并提供了擴(kuò)展能力的函數(shù)。這些函數(shù)接口包括:初始化插件、創(chuàng)建系統(tǒng)工具欄、創(chuàng)建系統(tǒng)菜單、執(zhí)行命令碼、更新菜單狀態(tài)、執(zhí)行干預(yù)命令、繪制圖形、彈出上下文菜單、定時(shí)器響應(yīng)、鼠標(biāo)按鍵、鼠標(biāo)移動(dòng)、鍵盤按鍵、處理報(bào)文、獲取插件信息、釋放插件。
插件標(biāo)準(zhǔn)函數(shù)抽象類還描述了插件信息,包括:插件名稱、動(dòng)態(tài)庫(kù)名稱、插件命令碼處理范圍、插件版本和開發(fā)者信息。
3.1.2 插件表
核心部件通過(guò)插件表來(lái)加載并調(diào)用插件的功能。插件表中每個(gè)插件元素包含的信息為:插件調(diào)入優(yōu)先級(jí)、插件信息表、插件句柄、插件接口指針等。
3.1.3 核心配置文件格式設(shè)計(jì)
核心部件依賴一系列的配置文件進(jìn)行工作,這些配置文件包括:1)插件描述文件;2)插件框架命令碼范圍定義文件。
插件描述文件描述了插件的信息,由插件生成器生成,由插件管理器進(jìn)行管理,程序員在開發(fā)插件前必須先獲得此文件。插件描述文件應(yīng)該包括以下信息:插件名稱、插件動(dòng)態(tài)庫(kù)名稱、優(yōu)先級(jí)、版本號(hào)、開發(fā)者信息、命令碼處理范圍、插件導(dǎo)入對(duì)象和插件導(dǎo)出對(duì)象。插件描述文件使用XML格式。
插件核心部件將會(huì)根據(jù)導(dǎo)出和依賴的對(duì)象決定插件的優(yōu)先級(jí)(第一級(jí)優(yōu)先級(jí)),然后根據(jù)配置文件中的“優(yōu)先級(jí)”決定第二級(jí)優(yōu)先級(jí)。由于同一插件導(dǎo)出和依賴的對(duì)象有多個(gè),因此由導(dǎo)出和依賴的對(duì)象計(jì)算出的插件優(yōu)先級(jí)有可能發(fā)生沖突。這種沖突在設(shè)計(jì)插件時(shí)是要避免的。在操作對(duì)象管理器中,將通過(guò)對(duì)象依賴圖的形式來(lái)查找這種沖突。
插件框架命令碼范圍定義文件使用XML格式,描述了插件框架中插件可分配使用的命令碼范圍,由命令碼分配器負(fù)責(zé)管理。
圖形框架管理部件的作用是管理插件(增加、刪除、更改優(yōu)先級(jí)),分配命令碼和干預(yù)命令,管理操作對(duì)象。管理部件的六個(gè)子部件為插件的生成和開發(fā)提供便利,其功能描述如下:
1)插件管理器
插件管理器是一個(gè)應(yīng)用程序,用于為一個(gè)應(yīng)用載入、刪除插件,調(diào)整插件的優(yōu)先級(jí)。插件管理器在應(yīng)用運(yùn)行前工作,應(yīng)用運(yùn)行時(shí)插件管理器產(chǎn)生的更改只有在應(yīng)用下次運(yùn)行時(shí)才生效。
2)命令碼分配器
因?yàn)槊總€(gè)插件可處理的命令碼不能重疊,因此需要統(tǒng)一分配各插件可使用的命令碼范圍。這項(xiàng)工作可由命令碼分配器來(lái)完成。
3)干預(yù)命令分配器
用于分配干預(yù)命令由哪個(gè)插件響應(yīng)。
(4)操作對(duì)象管理器
用于指定插件的導(dǎo)出對(duì)象、依賴對(duì)象,對(duì)象的優(yōu)先級(jí)。
(5)插件生成器
插件生成器是一個(gè)應(yīng)用程序,應(yīng)用于插件開發(fā)階段,用于生成插件原始必要代碼和插件描述文件。程序員要開發(fā)新插件時(shí)必須由插件生成器生成插件原始必要代碼和插件描述文件,并在此基礎(chǔ)上進(jìn)行二次開發(fā)。
插件生成器還依賴于命令碼分配器和操作對(duì)象管理器。
(6)日志分析器
日志分析器是一個(gè)獨(dú)立的應(yīng)用程序,用于控制日志打印,以便于軟件集成聯(lián)試。日志分析器支持文件打印和窗口打印,支持日志分類打印和單步打印。日志的單步打印指日志分析器收到日志消息后,將日志分析器程序掛起,直到某個(gè)事件觸發(fā)日志分析器,日志分析器繼續(xù)執(zhí)行。
XOGF解決了指揮信息系統(tǒng)中如何組合展現(xiàn)復(fù)雜戰(zhàn)場(chǎng)態(tài)勢(shì)的難題,提出了一種基于插件的模塊組裝機(jī)制,實(shí)現(xiàn)插件的即插即用,能夠綜合顯示多專業(yè)戰(zhàn)場(chǎng)態(tài)勢(shì)。但是,XOGF并沒(méi)有考慮如何有效組合軟件主菜單和工具欄,也沒(méi)有考慮如何將狀態(tài)欄的空間分配給各插件。在后續(xù)工作中,將對(duì)這兩個(gè)問(wèn)題進(jìn)行重點(diǎn)研究,設(shè)計(jì)一套規(guī)則和工具,用于編排主菜單、工具欄和狀態(tài)欄的內(nèi)容。
[1]鄧亞明,楊邦榮.基于ECLIPSE圖形插件開發(fā)的研究[J].電腦開發(fā)與應(yīng)用,2009.第22卷 第2期
[2]劉亞濱,楊紅.精通Eclipse[M].北京:電子工業(yè)出版社,2004
[3]劉俊平,鄒江南,賀玉寅.美軍戰(zhàn)場(chǎng)態(tài)勢(shì)感知能力分析[J].國(guó)防信息化,2007.第6期
[4]李蘇軍,吳玲達(dá),胡世才,寧漢辰.?dāng)?shù)字化海戰(zhàn)場(chǎng)態(tài)勢(shì)表現(xiàn)系統(tǒng)研究[M].系統(tǒng)仿真學(xué)報(bào),2009.第21卷 第19期
[5]蔡志浩,彭曉源.基于地理信息系統(tǒng)的虛擬戰(zhàn)場(chǎng)態(tài)勢(shì)顯示[J].系統(tǒng)仿真學(xué)報(bào),2003.第15卷 第7期
[6]楊沁梅,孫曉鳴.基于插件集成技術(shù)的通用陸戰(zhàn)場(chǎng)態(tài)勢(shì)圖,2012.第10期
[7]朱江,孫華,張華.基于插件的通用計(jì)劃作業(yè)框架[J].指揮信息系統(tǒng)與技術(shù),2013.第2期