基于插件的可扩展战场态势展现框架的设计与实现
2013-08-20李祥吴瑞祥薛雯
李祥 吴瑞祥 薛雯
(中国电子科技集团公司第二十八研究所 江苏 210007)
0 前言
随着信息技术的发展,战场信息的探测和收集手段越来越多,这对信息的处理与展现提出了很大的挑战。人对信息最直观的认识来源于视觉和听觉。而对于战场综合情报而言,最直观的表现方式是图形。由于战场态势复杂多变,需要各专业人员进行分析与处理。处理完后,如何以一种统一的方式展现在很大程度上决定了情报的效用。因此,构建一个可扩展的开放式图形展现框架是指挥信息系统的必然需要。
同时,从软件的角度来看,可扩展性作为软件的非功能性属性意义重大,它在一定程度上决定了软件的生命力。可扩展性好的软件能够适应各种变化,能够很快的响应用户的需求。因此,软件开发者总是力求提高软件的可扩展性。良好的设计是可扩展性的保障,插件式开发作为一种良好的设计得到了广泛的应用。Eclipse就是插件式开发的典型案例。Eclipse基于OSGi(Open Services Gateway Initiative,OSGi,开放服务网关协议),开发者按照其规范开发的插件能够无缝集成到Eclipse软件中。
1 战场态势展现要素分析
战场态势总体分为两大类:动态目标情报和静态部署情报。其中动态目标情报包括:雷达情报、技侦情报、电抗情报等,静态部署情报包括:机场、港口、兵力部署等军事部署信息。此外,在综合态势之上还可根据实时态势叠加作战计划等信息,进行作战推演评估,拟制修改作战计划。如图1所示为战场态势综合集成展现示意图。
图1 战场态势综合集成展现
图 1中,“原始态势数据”来源有:雷达站、观通站探测的实时目标数据,作战标准数据库的静态部署数据、作战计划数据和评估模型数据等。这些数据都会通过“统一信息传递平台”发送给综合态势展现终端,综合态势展现终端通过各处理模块对这些数据进行预处理,并通过统一图形绘制命令进行图形绘制,将数据图形化显示。此外,综合态势展现终端具有与展现数据的干预交互能力,能够在态势图上拟制修改作战计划。
如何对各处理模块进行有效的管理(加载、调用等)决定了综合态势展现终端的可扩展性和实用性。好的模块管理方法能够按需集成多个数据处理模块,又不增加软件的复杂度,能够提高软件的稳定性和展现的效果。
2 可扩展开放图形框架XOGF
针对战场综合态势展现的要求,本文提出了一种可扩展开放图形框架XOGF(eXtend Open Graphic Frame),用于有效管理和集成基于态势图的业务处理模块。本节将对XOGF的主体思想和工作原理进行介绍。
2.1 系统组成
可扩展开放图形框架(以下简称图形框架)是一个提供图形插件式开发的基础平台,由一个核心部件和一系列管理部件组成,其体系结构如图 2所示。
图2 可扩展开放图形框架体系结构图
从图 2可以看出,基于图形框架的应用软件有三个组成部分:
(1)核心部件
图形框架核心部件的作用是:加载插件,调用插件的标准化响应函数,负责插件间信息交互。
(2)管理部件
图形框架管理部件的作用是管理插件(增加、删除、更改优先级),分配命令码和干预命令,管理操作对象。管理部件具有六个子部件:插件管理器、命令码分配器、干预命令分配器、操作对象管理器、插件生成器和日志分析器。
(3)插件
插件是依据一定准则开发的能够应用于图形框架软件以达到扩充其能力的动态库。这些准则由核心部分制定。
2.2 工作原理
图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所示,为两个插件右键菜单组合流程的示意图。当主程序调用核心部件加载右键菜单时,核心部件依据插件加载的顺序获得插件的右键菜单进行组合。当同一个对象有多个插件要对其进行操作时(即多个插件要返回右键菜单),操作对象所在的插件将操作对象的数据写到共享数据区中。依赖此对象的插件将根据共享区中的内容决定创建何种右键菜单。
3 XOGF的实现及应用
目前,已经基于VC6.0和VS2008实现了XOGF,并已应用到某一体化指挥平台和某联合情报处理系统中,两个系统均已实装,担负部队日常值班任务。本节将对XOGF实现的关键思路进行描述。
3.1 核心部件
XOGF核心部件的作用是:加载插件,调用插件的标准化响应函数,负责插件间信息交互。核心部件由插件表、插件标准函数抽象类和相关配置文件组成。
3.1.1 插件标准函数抽象类
核心部件需要定义插件标准函数抽象类作为插件的实现准则和规范。类中的标准函数都是图形操作常用函数,并提供了扩展能力的函数。这些函数接口包括:初始化插件、创建系统工具栏、创建系统菜单、执行命令码、更新菜单状态、执行干预命令、绘制图形、弹出上下文菜单、定时器响应、鼠标按键、鼠标移动、键盘按键、处理报文、获取插件信息、释放插件。
插件标准函数抽象类还描述了插件信息,包括:插件名称、动态库名称、插件命令码处理范围、插件版本和开发者信息。
3.1.2 插件表
核心部件通过插件表来加载并调用插件的功能。插件表中每个插件元素包含的信息为:插件调入优先级、插件信息表、插件句柄、插件接口指针等。
3.1.3 核心配置文件格式设计
核心部件依赖一系列的配置文件进行工作,这些配置文件包括:1)插件描述文件;2)插件框架命令码范围定义文件。
插件描述文件描述了插件的信息,由插件生成器生成,由插件管理器进行管理,程序员在开发插件前必须先获得此文件。插件描述文件应该包括以下信息:插件名称、插件动态库名称、优先级、版本号、开发者信息、命令码处理范围、插件导入对象和插件导出对象。插件描述文件使用XML格式。
插件核心部件将会根据导出和依赖的对象决定插件的优先级(第一级优先级),然后根据配置文件中的“优先级”决定第二级优先级。由于同一插件导出和依赖的对象有多个,因此由导出和依赖的对象计算出的插件优先级有可能发生冲突。这种冲突在设计插件时是要避免的。在操作对象管理器中,将通过对象依赖图的形式来查找这种冲突。
插件框架命令码范围定义文件使用XML格式,描述了插件框架中插件可分配使用的命令码范围,由命令码分配器负责管理。
3.2 管理部件
图形框架管理部件的作用是管理插件(增加、删除、更改优先级),分配命令码和干预命令,管理操作对象。管理部件的六个子部件为插件的生成和开发提供便利,其功能描述如下:
1)插件管理器
插件管理器是一个应用程序,用于为一个应用载入、删除插件,调整插件的优先级。插件管理器在应用运行前工作,应用运行时插件管理器产生的更改只有在应用下次运行时才生效。
2)命令码分配器
因为每个插件可处理的命令码不能重叠,因此需要统一分配各插件可使用的命令码范围。这项工作可由命令码分配器来完成。
3)干预命令分配器
用于分配干预命令由哪个插件响应。
(4)操作对象管理器
用于指定插件的导出对象、依赖对象,对象的优先级。
(5)插件生成器
插件生成器是一个应用程序,应用于插件开发阶段,用于生成插件原始必要代码和插件描述文件。程序员要开发新插件时必须由插件生成器生成插件原始必要代码和插件描述文件,并在此基础上进行二次开发。
插件生成器还依赖于命令码分配器和操作对象管理器。
(6)日志分析器
日志分析器是一个独立的应用程序,用于控制日志打印,以便于软件集成联试。日志分析器支持文件打印和窗口打印,支持日志分类打印和单步打印。日志的单步打印指日志分析器收到日志消息后,将日志分析器程序挂起,直到某个事件触发日志分析器,日志分析器继续执行。
4 总结
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期