战术指挥情报终端的插件式软件框架设计*
2012-09-02王宏强张航峰李继进盛守照
王宏强,张航峰,李继进,盛守照
(1.南京电子技术研究所,江苏 南京 210039;2.南京航空航天大学,江苏 南京 210016)
战术指挥情报终端(Tactical Command&Intelligence Terminal,TCIT)是现代C4ISR指挥信息系统的重要组成部分[1-2],其主要任务是通过向作战单元提供实时的战场态势感知、战术情报保障及指挥命令交互服务,使作战单元、作战要素之间协同互补,通过信息力、打击力、机动力的高度聚合与精确释放,确保作战单元信息优势的全程获取和作战效能的充分发挥[3]。
传统的战术指挥情报终端软件通常针对特定兵种的特定军事需求而设计,系统所有功能统一编译于一个可执行文件中,具有功能明确、封闭性强、集成度高等特点[1]。随着现代战争由机械化向信息化、智能化转变,C4ISR系统越来越庞大和复杂,作战单元时刻处于空、天、地、海、网络、电磁的全方位包围之下,应用类型亦愈来愈多[3]。为了能够快速适应多变、异构的现代战场环境,战术指挥情报终端必须能够针对不同的作战类型、作战目标、网络环境对功能进行快速定制与整合,以满足特定的作战应用需求。
近年来,基于插件框架的软件设计技术已成为解决软件可扩展性问题的有效方法,学界已开始深入研究。Sun等研究了基于.Net反射技术和数字验证技术的插件框架设计方法,增强了.Net插件框架的安全特性[4];Zhu等在研究Eclipse软件的插件架构的基础上,提出了基于插件架构的软件生产线集成框架模型并对有效性进行了验证[5];郭娜等研究了Jabber客户端Jeti的软件结构并与Eclipse进行了对比分析,提出了一种基于插件的动态模块框架[6],提高了软件的可维护性和扩展性。
针对现代战争条件下的新军事需求,本文以开源跨平台开发库Qt为基础平台[7],提出了一种基于插件技术[6-8]的战术指挥情报终端软件应用框架(Qt Plug-in based Application Framework,QPAF)设计方法。QPAF以插件管理引擎作为微内核,提供了框架运行所必须的插件接口契约、功能扩展机制、插件间通信机制及对象管理机制;系统中数据层、业务层及表示层的功能则被上移,以插件式服务的方式来实现,保证了对军事需求中变化性特征的抽象、封装和隔离,兼顾了系统框架的稳定性和功能配置的灵活性,使软件具备了较强的柔性。
1 QPAF系统架构
常规的插件式应用框架将应用程序划分为宿主程序与插件对象两个部分。宿主程序以可执行文件的形式存在,负责插件对象的解析并在插件对象控制下生成可视化界面对象;插件对象则保存在插件程序集中,通过宿主程序的加载和调用来实现具体功能应用,是插件式框架具体功能的承载者。与常规插件式应用框架不同,QFAP采用轻量级的微内核结构,其组成架构如图1所示。
图1 QPAF系统架构
在组织结构上,QPAF框架由微内核microkernel、插件集plugins、公共扩展库utils及Qt支撑库Qt-library四部分组成。微内核与插件集构成了应用框架的主体,通过插件管理引擎对插件集的管理来实现框架的应用扩展,而公共扩展库及Qt支撑库则为应用软件的开发、运行及运行时扩展提供了基础环境。
在QPAF框架下,微内核仅封装了程序入口及插件管理引擎,而负责可视化界面对象生成的部分(即表示层)则被提取出来成为核心插件corePlugin。表示层与微内核的分离,使得微内核有了更为广泛的产品通用性,也有利于表示层的复用、替换与扩展。
插件集由一系列插件组成,根据功能不同,可分为表示层插件、业务逻辑层插件及数据访问层插件。其中,核心插件corePlugin为唯一的表示层插件,负责应用软件主窗口及界面元素的组织和管理,业务逻辑层插件可以通过对核心插件提供的扩展点进行扩展来建立业务相关的界面元素,实现与用户的交互。
业务逻辑层插件负责提供作战相关的业务服务,并可根据具体应用需求对可提供的服务进行定制。典型的业务逻辑层插件有态势信息插件siPlugin、警务处理插件disposePlugin和情报处理插件intelligencePlugin等,分别提供战场态势信息服务、警情处理服务及战场情报处理服务。
数据访问层插件提供了对系统中业务信息数据的集中管理和对外数据交换服务,包括数据管理与通信插件。数据访问层插件处理的数据包括各种实时或非实时的业务数据,如战术任务报文、即时消息、动目标指示信息、统计信息、状态信息、本地化的地理信息数据及历史数据等。数据访问层插件可从外界获取数据,按需分发给业务逻辑层插件以激活相应的业务,同时接收来自业务逻辑层插件的数据,并对外发送给指挥中心或其它作战单元。
2 QPAF的设计与实现
2.1 QPAF 插件
2.1.1 插件构成
在QPAF中,每个插件由两部分组成——插件规范文件及插件库文件。插件规范文件以XML格式存储了插件加载所需的各种信息,包括插件名称、版本、简介、兼容性、依赖库及版权信息等;插件库则是具有统一的接口契约和扩展规范、对具体软件功能的动态库形式封装。插件组成如图2所示。
图2 QPAF插件组成
插件规范文件的格式如下所示:
QPAF中的所有插件都继承自接口类 IPlugin。IPlugin类中声明了initialize()和extensionInitialized()两个纯虚函数,所有插件类必须实现这两个函数。initialize()在插件库被载入且插件实例被创建后调用,其功能是完成插件内部业务对象的创建及初始化;extensionInitialized()在插件及其依赖插件库全部初始化完成并且依赖库的extensionInitialized()方法被执行后进行调用,其功能是建立插件与其依赖插件之间的功能扩展及通信连接。
2.1.2 插件扩展
QPAF框架下,具体业务功能被封装在继承自QObject类的业务对象中,插件的实现类创建业务对象的实例,并通过IPlugin的addObject()方法将其注册到插件管理引擎的对象池中,以共享插件的对象资源,实现插件功能的扩展和插件间通信。以下代码展示了ProviderPlugin插件对UserPlugin插件的功能扩展。
ProviderPlugin插件在初始化时创建了一个实现extensionFun()功能的业务对象Provider,并将其注册到对象池中。UserPlugin插件中则提供了requestSomeFun()扩展点,通过该扩展点实现了对ProviderPlugin插件中扩展功能的调用。具体地,requestSomeFun()扩展点在对象池中查找业务对象Provider,当业务对象存在时,Provider的extensionFun()函数被调用,从而实现了UserPlugin插件功能的扩展。采用类似方法并借助于Qt的信号/槽机制,也可在插件间进行消息通信。
QPAF插件的扩展及扩展点机制实现了对插件功能的扩充,带来的副作用是插件间的依赖性。根据依赖性的不同,被依赖的插件可分为必需、可选两种,必需插件会影响对其有依赖性的插件的正常运行。QPAF的插件管理引擎在加载插件时,将根据插件规范文件中的依赖性信息对所有待加载的插件的依赖性进行解析和排序,优先加载必需插件。
2.2 插件管理
QPAF通过位于微内核中的插件管理类PluginEngine对插件及其生命周期以及插件所注册的对象进行统一管理,相关的类图如图3所示。
图3 QPAF插件管理
PluginEngine类采用单件模式实现,在整个应用程序级仅存在唯一的实例,该类提供了实例的全局访问点PluginEngine::instance(),QPAF插件可通过此访问点获取PluginEngine实例,将创建的业务对象注册到PluginEngine的对象池或从对象池中移除已注册的对象。PluginEngine中维护着两个重要的容器对象:pluginSpecs及 allObjects。pluginSpecs基于 Qt容器类QList实现了对插件规范类PluginSpec的链式存储,allObjects则是插件管理引擎中的对象池,存储了所有的业务对象。
PluginEngine在读取和解析每个插件所对应的插件规范文件时都将创建一个PluginSpec实例。Plugin-Spec类是插件管理任务的具体实施者,不仅存储了插件的名称、依赖库等信息,还存储了一个插件实例的指针,负责对插件运行状态的维护。在PluginEngine的统一调度下,PluginSpec依次进行插件规范文件的读取、依赖性解析、插件库加载、初始化及扩展初始化,使插件进入运行态;当插件需要卸载时,也由PluginSpec停止插件并清理相关对象。
2.3 框架运行机理
QPAF的运行机理如图4的运行序列图及图5的插件生命周期状态图所示。QPAF框架启动时,插件管理引擎PluginEngine首先在预定目录中搜索所有的插件规范文件,通过插件规范类PlugSpec对插件信息进行读取,并对插件的合法性和依赖性进行检查和解析,然后按照插件的依赖性由QPlugin-Loader类依次对插件库进行载入。相应地,插件生命周期分为解析、装载、卸载三个阶段:解析段完成插件规范信息的读取及依赖性的解析;装载段完成插件库的载入、初始化及扩展初始化,插件进入正常工作状态;卸载段则完成插件的停止及删除工作。
图4 QPAF运行序列图
2.4 主要插件
2.4.1 核心插件corePlugin
corePlugin是QPAF框架中的核心插件,其中封装了应用程序主界面窗口类,提供了针对主窗口关键窗口部件的扩展点,其它业务逻辑插件通过对这些扩展点进行调用来实现应用程序具体的业务应用及用户交互。核心插件的类图如图6所示。
图5 插件生命周期状态图
核心插件类CorePlugin继承自插件接口类IPlugin,在CorePlugin类构造时将创建应用程序主窗口类MainWindow,并对外提供对主窗口的扩展点 ICore。ICore采用单件模式,其实现CoreImpl是核心插件的业务对象类,采用委托的方式向其它插件提供对主窗口中各部件管理类的访问,包括PanelManager、WorkbenchManager、ActionManger及 StatusBarManager,业务逻辑插件可通过这些窗口部件管理类对主窗口进行功能扩展。
对于战术情报指挥终端软件,主要窗口部件包括导航面板、工作区、菜单栏、工具栏及状态栏。其中,导航面板由PanelManager类管理,其内部封装了QTool-Box类,可为业务逻辑插件在导航面板中创建一栏,并设置栏目的子功能窗口部件,对业务进行分类管理;工作区由WorkbenchManager类负责管理,其内部封装了QTabWidget标签页容器类,可为每种作战业务分配一个Tab页面,点选导航面板中的一栏将在工作区打开对应的Tab页,供用户进行具体业务操作;菜单栏、工具栏等用户操作界面由ActionManger类实施创建与集中管理;状态栏的管理则由StatusBarManager完成。
2.4.2 其它插件
在QPAF框架下,具体的作战应用由各种业务逻辑插件来实现,如态势信息显示、指挥控制、现场办公等;对外数据交换接口服务由数据访问层插件提供。以态势信息插件siPlugin为例。
图6 核心插件corePlugin
siPlugin插件的基本功能是负责地理信息等静态数据及系统接收到的动态目标信息的显示,并提供图层及目标的显示控制。为此,siPlugin插件通过Panel-Manager创建了Situation导航面板并使用继承自QTreeWidget的树形部件SiPanelWidget对图层及目标进行显控,对应的工作区则为基于QGraphicsView机制实现的地图部件SituationMap。以下代码展示了siPlugin插件对其相应的窗口部件的创建过程。
siPlugin插件通过数据访问层的commPlugin插件进行对动态目标数据的接收。以AIS数据报文的接收为例。commPlugin插件中创建了数据分发对象AisDisperser,当其接收到AIS数据时将发出aisReceived()信号。commPlugin初始化时,AisDisperser被注册到对象池中。siPlugin插件扩展初始化时从数据池中查找该数据分发对象,并将其targetReceived()信号与自身的procAisReceived()槽函数相连接,在该槽函数中进行AIS报文的接收、解析及显示。相应的代码如下所示。
3 应用实例
图7为采用QPAF框架开发的某边境防务战术指挥情报终端界面。系统基于微内核架构,除插件管理之外的所有功能均采用插件实现。除表示层的核心插件外,业务层包括态势显示、警务处理、情报处理、系统设置四个插件,数据访问层包括AIS报文接收、GPS报文接收、单雷达报文接收、融合航迹报接收、指控收发五个插件。
当系统的应用需求发生变化时,无需对系统框架及核心插件进行修改,只需对业务层插件或数据访问层的插件进行配置即可实现应用功能的扩展或裁减。例如,在海防应用时,态势显示采用基于海图的插件,而在空防应用时,只需要将态势显示部分替换为基于航图的插件,无需对其它的业务插件及框架进行修改,使系统具有了很强的柔性。
图7 战术情报指挥终端主界面
4 结束语
复杂多变的现代战场环境对C4ISR指挥信息系统的建设提出了更高的军事需求,要求指挥信息系统不仅要满足基本作战需求,还应具备对各种业务功能的快速整合与定制的能力。基于这种新的需求,本文提出了一种以开源跨平台开发库Qt为基础平台的、基于微内核思想的QPAF插件式软件框架设计方法,对QPAF的系统架构、插件扩展及管理机制、框架运行机理进行了深入阐述,对主要插件的实现方法进行了详细介绍。某边境防务战术指挥情报终端的应用表明,基于QPAF方法设计的软件同时兼顾了系统的稳定性和灵活性,使软件具备了很强的动态演化能力,具有较高的应用价值。
[1]张乐锋,虞华,胡卫东,等.信息化雷达显控终端的设计与实现[J].现代雷达,2009,31(8):33-38.
[2]周任飞.基于TD-SCDMA的雷达情报数据无线传输研究[J].信息系统工程,2009,22(9):70-73.
[3]王书满,焦纲领,马颖亮.信息优势在C4ISR系统需求论证中的应用研究[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]郭娜,黄永平,吴学义,等.基于插件的动态模块框架研究[J].吉林大学学报(信息科学版),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.