王宏強(qiáng),張航峰,李繼進(jìn),盛守照
(1.南京電子技術(shù)研究所,江蘇 南京 210039;2.南京航空航天大學(xué),江蘇 南京 210016)
戰(zhàn)術(shù)指揮情報(bào)終端(Tactical Command&Intelligence Terminal,TCIT)是現(xiàn)代C4ISR指揮信息系統(tǒng)的重要組成部分[1-2],其主要任務(wù)是通過向作戰(zhàn)單元提供實(shí)時(shí)的戰(zhàn)場(chǎng)態(tài)勢(shì)感知、戰(zhàn)術(shù)情報(bào)保障及指揮命令交互服務(wù),使作戰(zhàn)單元、作戰(zhàn)要素之間協(xié)同互補(bǔ),通過信息力、打擊力、機(jī)動(dòng)力的高度聚合與精確釋放,確保作戰(zhàn)單元信息優(yōu)勢(shì)的全程獲取和作戰(zhàn)效能的充分發(fā)揮[3]。
傳統(tǒng)的戰(zhàn)術(shù)指揮情報(bào)終端軟件通常針對(duì)特定兵種的特定軍事需求而設(shè)計(jì),系統(tǒng)所有功能統(tǒng)一編譯于一個(gè)可執(zhí)行文件中,具有功能明確、封閉性強(qiáng)、集成度高等特點(diǎn)[1]。隨著現(xiàn)代戰(zhàn)爭由機(jī)械化向信息化、智能化轉(zhuǎn)變,C4ISR系統(tǒng)越來越龐大和復(fù)雜,作戰(zhàn)單元時(shí)刻處于空、天、地、海、網(wǎng)絡(luò)、電磁的全方位包圍之下,應(yīng)用類型亦愈來愈多[3]。為了能夠快速適應(yīng)多變、異構(gòu)的現(xiàn)代戰(zhàn)場(chǎng)環(huán)境,戰(zhàn)術(shù)指揮情報(bào)終端必須能夠針對(duì)不同的作戰(zhàn)類型、作戰(zhàn)目標(biāo)、網(wǎng)絡(luò)環(huán)境對(duì)功能進(jìn)行快速定制與整合,以滿足特定的作戰(zhàn)應(yīng)用需求。
近年來,基于插件框架的軟件設(shè)計(jì)技術(shù)已成為解決軟件可擴(kuò)展性問題的有效方法,學(xué)界已開始深入研究。Sun等研究了基于.Net反射技術(shù)和數(shù)字驗(yàn)證技術(shù)的插件框架設(shè)計(jì)方法,增強(qiáng)了.Net插件框架的安全特性[4];Zhu等在研究Eclipse軟件的插件架構(gòu)的基礎(chǔ)上,提出了基于插件架構(gòu)的軟件生產(chǎn)線集成框架模型并對(duì)有效性進(jìn)行了驗(yàn)證[5];郭娜等研究了Jabber客戶端Jeti的軟件結(jié)構(gòu)并與Eclipse進(jìn)行了對(duì)比分析,提出了一種基于插件的動(dòng)態(tài)模塊框架[6],提高了軟件的可維護(hù)性和擴(kuò)展性。
針對(duì)現(xiàn)代戰(zhàn)爭條件下的新軍事需求,本文以開源跨平臺(tái)開發(fā)庫Qt為基礎(chǔ)平臺(tái)[7],提出了一種基于插件技術(shù)[6-8]的戰(zhàn)術(shù)指揮情報(bào)終端軟件應(yīng)用框架(Qt Plug-in based Application Framework,QPAF)設(shè)計(jì)方法。QPAF以插件管理引擎作為微內(nèi)核,提供了框架運(yùn)行所必須的插件接口契約、功能擴(kuò)展機(jī)制、插件間通信機(jī)制及對(duì)象管理機(jī)制;系統(tǒng)中數(shù)據(jù)層、業(yè)務(wù)層及表示層的功能則被上移,以插件式服務(wù)的方式來實(shí)現(xiàn),保證了對(duì)軍事需求中變化性特征的抽象、封裝和隔離,兼顧了系統(tǒng)框架的穩(wěn)定性和功能配置的靈活性,使軟件具備了較強(qiáng)的柔性。
常規(guī)的插件式應(yīng)用框架將應(yīng)用程序劃分為宿主程序與插件對(duì)象兩個(gè)部分。宿主程序以可執(zhí)行文件的形式存在,負(fù)責(zé)插件對(duì)象的解析并在插件對(duì)象控制下生成可視化界面對(duì)象;插件對(duì)象則保存在插件程序集中,通過宿主程序的加載和調(diào)用來實(shí)現(xiàn)具體功能應(yīng)用,是插件式框架具體功能的承載者。與常規(guī)插件式應(yīng)用框架不同,QFAP采用輕量級(jí)的微內(nèi)核結(jié)構(gòu),其組成架構(gòu)如圖1所示。
圖1 QPAF系統(tǒng)架構(gòu)
在組織結(jié)構(gòu)上,QPAF框架由微內(nèi)核microkernel、插件集plugins、公共擴(kuò)展庫utils及Qt支撐庫Qt-library四部分組成。微內(nèi)核與插件集構(gòu)成了應(yīng)用框架的主體,通過插件管理引擎對(duì)插件集的管理來實(shí)現(xiàn)框架的應(yīng)用擴(kuò)展,而公共擴(kuò)展庫及Qt支撐庫則為應(yīng)用軟件的開發(fā)、運(yùn)行及運(yùn)行時(shí)擴(kuò)展提供了基礎(chǔ)環(huán)境。
在QPAF框架下,微內(nèi)核僅封裝了程序入口及插件管理引擎,而負(fù)責(zé)可視化界面對(duì)象生成的部分(即表示層)則被提取出來成為核心插件corePlugin。表示層與微內(nèi)核的分離,使得微內(nèi)核有了更為廣泛的產(chǎn)品通用性,也有利于表示層的復(fù)用、替換與擴(kuò)展。
插件集由一系列插件組成,根據(jù)功能不同,可分為表示層插件、業(yè)務(wù)邏輯層插件及數(shù)據(jù)訪問層插件。其中,核心插件corePlugin為唯一的表示層插件,負(fù)責(zé)應(yīng)用軟件主窗口及界面元素的組織和管理,業(yè)務(wù)邏輯層插件可以通過對(duì)核心插件提供的擴(kuò)展點(diǎn)進(jìn)行擴(kuò)展來建立業(yè)務(wù)相關(guān)的界面元素,實(shí)現(xiàn)與用戶的交互。
業(yè)務(wù)邏輯層插件負(fù)責(zé)提供作戰(zhàn)相關(guān)的業(yè)務(wù)服務(wù),并可根據(jù)具體應(yīng)用需求對(duì)可提供的服務(wù)進(jìn)行定制。典型的業(yè)務(wù)邏輯層插件有態(tài)勢(shì)信息插件siPlugin、警務(wù)處理插件disposePlugin和情報(bào)處理插件intelligencePlugin等,分別提供戰(zhàn)場(chǎng)態(tài)勢(shì)信息服務(wù)、警情處理服務(wù)及戰(zhàn)場(chǎng)情報(bào)處理服務(wù)。
數(shù)據(jù)訪問層插件提供了對(duì)系統(tǒng)中業(yè)務(wù)信息數(shù)據(jù)的集中管理和對(duì)外數(shù)據(jù)交換服務(wù),包括數(shù)據(jù)管理與通信插件。數(shù)據(jù)訪問層插件處理的數(shù)據(jù)包括各種實(shí)時(shí)或非實(shí)時(shí)的業(yè)務(wù)數(shù)據(jù),如戰(zhàn)術(shù)任務(wù)報(bào)文、即時(shí)消息、動(dòng)目標(biāo)指示信息、統(tǒng)計(jì)信息、狀態(tài)信息、本地化的地理信息數(shù)據(jù)及歷史數(shù)據(jù)等。數(shù)據(jù)訪問層插件可從外界獲取數(shù)據(jù),按需分發(fā)給業(yè)務(wù)邏輯層插件以激活相應(yīng)的業(yè)務(wù),同時(shí)接收來自業(yè)務(wù)邏輯層插件的數(shù)據(jù),并對(duì)外發(fā)送給指揮中心或其它作戰(zhàn)單元。
2.1.1 插件構(gòu)成
在QPAF中,每個(gè)插件由兩部分組成——插件規(guī)范文件及插件庫文件。插件規(guī)范文件以XML格式存儲(chǔ)了插件加載所需的各種信息,包括插件名稱、版本、簡介、兼容性、依賴庫及版權(quán)信息等;插件庫則是具有統(tǒng)一的接口契約和擴(kuò)展規(guī)范、對(duì)具體軟件功能的動(dòng)態(tài)庫形式封裝。插件組成如圖2所示。
圖2 QPAF插件組成
插件規(guī)范文件的格式如下所示:
QPAF中的所有插件都繼承自接口類 IPlugin。IPlugin類中聲明了initialize()和extensionInitialized()兩個(gè)純虛函數(shù),所有插件類必須實(shí)現(xiàn)這兩個(gè)函數(shù)。initialize()在插件庫被載入且插件實(shí)例被創(chuàng)建后調(diào)用,其功能是完成插件內(nèi)部業(yè)務(wù)對(duì)象的創(chuàng)建及初始化;extensionInitialized()在插件及其依賴插件庫全部初始化完成并且依賴庫的extensionInitialized()方法被執(zhí)行后進(jìn)行調(diào)用,其功能是建立插件與其依賴插件之間的功能擴(kuò)展及通信連接。
2.1.2 插件擴(kuò)展
QPAF框架下,具體業(yè)務(wù)功能被封裝在繼承自QObject類的業(yè)務(wù)對(duì)象中,插件的實(shí)現(xiàn)類創(chuàng)建業(yè)務(wù)對(duì)象的實(shí)例,并通過IPlugin的addObject()方法將其注冊(cè)到插件管理引擎的對(duì)象池中,以共享插件的對(duì)象資源,實(shí)現(xiàn)插件功能的擴(kuò)展和插件間通信。以下代碼展示了ProviderPlugin插件對(duì)UserPlugin插件的功能擴(kuò)展。
ProviderPlugin插件在初始化時(shí)創(chuàng)建了一個(gè)實(shí)現(xiàn)extensionFun()功能的業(yè)務(wù)對(duì)象Provider,并將其注冊(cè)到對(duì)象池中。UserPlugin插件中則提供了requestSomeFun()擴(kuò)展點(diǎn),通過該擴(kuò)展點(diǎn)實(shí)現(xiàn)了對(duì)ProviderPlugin插件中擴(kuò)展功能的調(diào)用。具體地,requestSomeFun()擴(kuò)展點(diǎn)在對(duì)象池中查找業(yè)務(wù)對(duì)象Provider,當(dāng)業(yè)務(wù)對(duì)象存在時(shí),Provider的extensionFun()函數(shù)被調(diào)用,從而實(shí)現(xiàn)了UserPlugin插件功能的擴(kuò)展。采用類似方法并借助于Qt的信號(hào)/槽機(jī)制,也可在插件間進(jìn)行消息通信。
QPAF插件的擴(kuò)展及擴(kuò)展點(diǎn)機(jī)制實(shí)現(xiàn)了對(duì)插件功能的擴(kuò)充,帶來的副作用是插件間的依賴性。根據(jù)依賴性的不同,被依賴的插件可分為必需、可選兩種,必需插件會(huì)影響對(duì)其有依賴性的插件的正常運(yùn)行。QPAF的插件管理引擎在加載插件時(shí),將根據(jù)插件規(guī)范文件中的依賴性信息對(duì)所有待加載的插件的依賴性進(jìn)行解析和排序,優(yōu)先加載必需插件。
QPAF通過位于微內(nèi)核中的插件管理類PluginEngine對(duì)插件及其生命周期以及插件所注冊(cè)的對(duì)象進(jìn)行統(tǒng)一管理,相關(guān)的類圖如圖3所示。
圖3 QPAF插件管理
PluginEngine類采用單件模式實(shí)現(xiàn),在整個(gè)應(yīng)用程序級(jí)僅存在唯一的實(shí)例,該類提供了實(shí)例的全局訪問點(diǎn)PluginEngine::instance(),QPAF插件可通過此訪問點(diǎn)獲取PluginEngine實(shí)例,將創(chuàng)建的業(yè)務(wù)對(duì)象注冊(cè)到PluginEngine的對(duì)象池或從對(duì)象池中移除已注冊(cè)的對(duì)象。PluginEngine中維護(hù)著兩個(gè)重要的容器對(duì)象:pluginSpecs及 allObjects。pluginSpecs基于 Qt容器類QList實(shí)現(xiàn)了對(duì)插件規(guī)范類PluginSpec的鏈?zhǔn)酱鎯?chǔ),allObjects則是插件管理引擎中的對(duì)象池,存儲(chǔ)了所有的業(yè)務(wù)對(duì)象。
PluginEngine在讀取和解析每個(gè)插件所對(duì)應(yīng)的插件規(guī)范文件時(shí)都將創(chuàng)建一個(gè)PluginSpec實(shí)例。Plugin-Spec類是插件管理任務(wù)的具體實(shí)施者,不僅存儲(chǔ)了插件的名稱、依賴庫等信息,還存儲(chǔ)了一個(gè)插件實(shí)例的指針,負(fù)責(zé)對(duì)插件運(yùn)行狀態(tài)的維護(hù)。在PluginEngine的統(tǒng)一調(diào)度下,PluginSpec依次進(jìn)行插件規(guī)范文件的讀取、依賴性解析、插件庫加載、初始化及擴(kuò)展初始化,使插件進(jìn)入運(yùn)行態(tài);當(dāng)插件需要卸載時(shí),也由PluginSpec停止插件并清理相關(guān)對(duì)象。
QPAF的運(yùn)行機(jī)理如圖4的運(yùn)行序列圖及圖5的插件生命周期狀態(tài)圖所示。QPAF框架啟動(dòng)時(shí),插件管理引擎PluginEngine首先在預(yù)定目錄中搜索所有的插件規(guī)范文件,通過插件規(guī)范類PlugSpec對(duì)插件信息進(jìn)行讀取,并對(duì)插件的合法性和依賴性進(jìn)行檢查和解析,然后按照插件的依賴性由QPlugin-Loader類依次對(duì)插件庫進(jìn)行載入。相應(yīng)地,插件生命周期分為解析、裝載、卸載三個(gè)階段:解析段完成插件規(guī)范信息的讀取及依賴性的解析;裝載段完成插件庫的載入、初始化及擴(kuò)展初始化,插件進(jìn)入正常工作狀態(tài);卸載段則完成插件的停止及刪除工作。
圖4 QPAF運(yùn)行序列圖
2.4.1 核心插件corePlugin
corePlugin是QPAF框架中的核心插件,其中封裝了應(yīng)用程序主界面窗口類,提供了針對(duì)主窗口關(guān)鍵窗口部件的擴(kuò)展點(diǎn),其它業(yè)務(wù)邏輯插件通過對(duì)這些擴(kuò)展點(diǎn)進(jìn)行調(diào)用來實(shí)現(xiàn)應(yīng)用程序具體的業(yè)務(wù)應(yīng)用及用戶交互。核心插件的類圖如圖6所示。
圖5 插件生命周期狀態(tài)圖
核心插件類CorePlugin繼承自插件接口類IPlugin,在CorePlugin類構(gòu)造時(shí)將創(chuàng)建應(yīng)用程序主窗口類MainWindow,并對(duì)外提供對(duì)主窗口的擴(kuò)展點(diǎn) ICore。ICore采用單件模式,其實(shí)現(xiàn)CoreImpl是核心插件的業(yè)務(wù)對(duì)象類,采用委托的方式向其它插件提供對(duì)主窗口中各部件管理類的訪問,包括PanelManager、WorkbenchManager、ActionManger及 StatusBarManager,業(yè)務(wù)邏輯插件可通過這些窗口部件管理類對(duì)主窗口進(jìn)行功能擴(kuò)展。
對(duì)于戰(zhàn)術(shù)情報(bào)指揮終端軟件,主要窗口部件包括導(dǎo)航面板、工作區(qū)、菜單欄、工具欄及狀態(tài)欄。其中,導(dǎo)航面板由PanelManager類管理,其內(nèi)部封裝了QTool-Box類,可為業(yè)務(wù)邏輯插件在導(dǎo)航面板中創(chuàng)建一欄,并設(shè)置欄目的子功能窗口部件,對(duì)業(yè)務(wù)進(jìn)行分類管理;工作區(qū)由WorkbenchManager類負(fù)責(zé)管理,其內(nèi)部封裝了QTabWidget標(biāo)簽頁容器類,可為每種作戰(zhàn)業(yè)務(wù)分配一個(gè)Tab頁面,點(diǎn)選導(dǎo)航面板中的一欄將在工作區(qū)打開對(duì)應(yīng)的Tab頁,供用戶進(jìn)行具體業(yè)務(wù)操作;菜單欄、工具欄等用戶操作界面由ActionManger類實(shí)施創(chuàng)建與集中管理;狀態(tài)欄的管理則由StatusBarManager完成。
2.4.2 其它插件
在QPAF框架下,具體的作戰(zhàn)應(yīng)用由各種業(yè)務(wù)邏輯插件來實(shí)現(xiàn),如態(tài)勢(shì)信息顯示、指揮控制、現(xiàn)場(chǎng)辦公等;對(duì)外數(shù)據(jù)交換接口服務(wù)由數(shù)據(jù)訪問層插件提供。以態(tài)勢(shì)信息插件siPlugin為例。
圖6 核心插件corePlugin
siPlugin插件的基本功能是負(fù)責(zé)地理信息等靜態(tài)數(shù)據(jù)及系統(tǒng)接收到的動(dòng)態(tài)目標(biāo)信息的顯示,并提供圖層及目標(biāo)的顯示控制。為此,siPlugin插件通過Panel-Manager創(chuàng)建了Situation導(dǎo)航面板并使用繼承自QTreeWidget的樹形部件SiPanelWidget對(duì)圖層及目標(biāo)進(jìn)行顯控,對(duì)應(yīng)的工作區(qū)則為基于QGraphicsView機(jī)制實(shí)現(xiàn)的地圖部件SituationMap。以下代碼展示了siPlugin插件對(duì)其相應(yīng)的窗口部件的創(chuàng)建過程。
siPlugin插件通過數(shù)據(jù)訪問層的commPlugin插件進(jìn)行對(duì)動(dòng)態(tài)目標(biāo)數(shù)據(jù)的接收。以AIS數(shù)據(jù)報(bào)文的接收為例。commPlugin插件中創(chuàng)建了數(shù)據(jù)分發(fā)對(duì)象AisDisperser,當(dāng)其接收到AIS數(shù)據(jù)時(shí)將發(fā)出aisReceived()信號(hào)。commPlugin初始化時(shí),AisDisperser被注冊(cè)到對(duì)象池中。siPlugin插件擴(kuò)展初始化時(shí)從數(shù)據(jù)池中查找該數(shù)據(jù)分發(fā)對(duì)象,并將其targetReceived()信號(hào)與自身的procAisReceived()槽函數(shù)相連接,在該槽函數(shù)中進(jìn)行AIS報(bào)文的接收、解析及顯示。相應(yīng)的代碼如下所示。
圖7為采用QPAF框架開發(fā)的某邊境防務(wù)戰(zhàn)術(shù)指揮情報(bào)終端界面。系統(tǒng)基于微內(nèi)核架構(gòu),除插件管理之外的所有功能均采用插件實(shí)現(xiàn)。除表示層的核心插件外,業(yè)務(wù)層包括態(tài)勢(shì)顯示、警務(wù)處理、情報(bào)處理、系統(tǒng)設(shè)置四個(gè)插件,數(shù)據(jù)訪問層包括AIS報(bào)文接收、GPS報(bào)文接收、單雷達(dá)報(bào)文接收、融合航跡報(bào)接收、指控收發(fā)五個(gè)插件。
當(dāng)系統(tǒng)的應(yīng)用需求發(fā)生變化時(shí),無需對(duì)系統(tǒng)框架及核心插件進(jìn)行修改,只需對(duì)業(yè)務(wù)層插件或數(shù)據(jù)訪問層的插件進(jìn)行配置即可實(shí)現(xiàn)應(yīng)用功能的擴(kuò)展或裁減。例如,在海防應(yīng)用時(shí),態(tài)勢(shì)顯示采用基于海圖的插件,而在空防應(yīng)用時(shí),只需要將態(tài)勢(shì)顯示部分替換為基于航圖的插件,無需對(duì)其它的業(yè)務(wù)插件及框架進(jìn)行修改,使系統(tǒng)具有了很強(qiáng)的柔性。
圖7 戰(zhàn)術(shù)情報(bào)指揮終端主界面
復(fù)雜多變的現(xiàn)代戰(zhàn)場(chǎng)環(huán)境對(duì)C4ISR指揮信息系統(tǒng)的建設(shè)提出了更高的軍事需求,要求指揮信息系統(tǒng)不僅要滿足基本作戰(zhàn)需求,還應(yīng)具備對(duì)各種業(yè)務(wù)功能的快速整合與定制的能力?;谶@種新的需求,本文提出了一種以開源跨平臺(tái)開發(fā)庫Qt為基礎(chǔ)平臺(tái)的、基于微內(nèi)核思想的QPAF插件式軟件框架設(shè)計(jì)方法,對(duì)QPAF的系統(tǒng)架構(gòu)、插件擴(kuò)展及管理機(jī)制、框架運(yùn)行機(jī)理進(jìn)行了深入闡述,對(duì)主要插件的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)介紹。某邊境防務(wù)戰(zhàn)術(shù)指揮情報(bào)終端的應(yīng)用表明,基于QPAF方法設(shè)計(jì)的軟件同時(shí)兼顧了系統(tǒng)的穩(wěn)定性和靈活性,使軟件具備了很強(qiáng)的動(dòng)態(tài)演化能力,具有較高的應(yīng)用價(jià)值。
[1]張樂鋒,虞華,胡衛(wèi)東,等.信息化雷達(dá)顯控終端的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代雷達(dá),2009,31(8):33-38.
[2]周任飛.基于TD-SCDMA的雷達(dá)情報(bào)數(shù)據(jù)無線傳輸研究[J].信息系統(tǒng)工程,2009,22(9):70-73.
[3]王書滿,焦綱領(lǐng),馬穎亮.信息優(yōu)勢(shì)在C4ISR系統(tǒng)需求論證中的應(yīng)用研究[J].指揮控制與仿真,2011,33(3):31-34.
[4]Sun Y,Liang H,Kuo Z.A Study and Design of Plug-in Framework Based on.Net Component Technology[C].The 14th International Conference on Computer supported cooperative work in Design,Shanghai,China,Apr.14-16,2010:178-183.
[5]Zhu J,Yin Q,Zhu R,et al.A Plug-in Based Software Production Line Integrated Framework[C].International Conference on Computer Science and Software Engineering,Wuhan,Dec.12-14,2008(2):562-565.
[6]郭娜,黃永平,吳學(xué)義,等.基于插件的動(dòng)態(tài)模塊框架研究[J].吉林大學(xué)學(xué)報(bào)(信息科學(xué)版),2008,26(1):69-75.
[7]Ezust A,Ezust P.An Introduction to Design Patterns in C++with Qt 4[M].MA,US:Pearson Education Inc.,2006.
[8]Clayberg E,Rubel D.Eclipse Plug-ins,Third Edition[M].Boston,MA 02116:Addison-Wesley,2009.