张华坤 刘力力 卜伟华 唐冠杰 汪潮
(博微太赫兹信息科技有限公司 安徽省合肥市 230088)
太赫兹人体安检系统采用被动式实时成像太赫兹人体安检技术,利用人体自身热辐射产生的太赫兹波,通过一定的准光系统将这些辐射收集到探测焦平面上,在焦平面上使用太赫兹探测器阵列完成对信号的采集。之后通过对信号的处理,可以形成人体辐射的太赫兹波强度图,由于人身携带的物品对太赫兹波的遮挡和吸收,在太赫兹强度图上这些物品所在的位置就会显示出阴影轮廓,通过这个原理可以实时探测到人身携带物品的位置、大小和形状,解决大客流场景下快速人体安检的难题。[1]
随着各安检场所对通行安全和通行效率的要求不断提升,系统的应用场景也越来越复杂多样。为了能够适应快速多变的用户需求,系统必须能针对不同的安检场所、安检级别对功能进行快速定制和整合,因此对软件框架的可扩展性提出了很高的要求。
如图1 所示,Common Toolkits(以下简称CTK)插件框架是面向C++语言的动态组件系统,它直接基于OSGI 规范。该系统由许多可重用的不同组件动态地组成,并允许各组件之间通过服务进行通信。官方提供了框架的分层模型包括:
(1)插件(Plugins)--由开发人员创建的CTK 组件。
(2)服务层(Services Layer)--通过为C++对象提供一个“发布-发现-绑定”模型来动态连接插件。
(3)生命周期层(Life Cycle Layer)--用于安装、启动、停止、更新和卸载插件的API。
(4)安全性(Security)--处理安全方面的内容(尚未实现)。
使用CTK 插件框架开发就代表开发插件,各插件之间互相隐藏了内部实现,并通过良好的服务和其它插件进行通信。内部隐藏机制表明可以自由地更改本插件而不影响其它插件,面向服务的通信机制可以将插件之间的耦合性降到最低,大大提高系统的模块化程度,使得代码更加灵活,能够更好地适应变化。
CTK 插件框架的使用主要分为以下几个步骤:
(1)初始化CTK 插件框架。
(2)安装并启动插件。
(3)获取并调用服务。
2.2.1 初始化CTK 插件框架
图1:CTK 插件框架的分层模型[2]
图2:框架初始化
图3:插件初始化
如图2所示,CTK插件框架(ctkFramework)进行初始化(ctkPluginFramework::init) 时,首先对插件框架上下文(ctkPluginFrameworkContext) 进 行 初 始 化(ctkPluginFra meworkContext::init),插件框架上下文则调用插件上下文(ctkPluginContext)的构造函数进行初始化。然后,启动CTK 插件框架(ctkPluginFramework::start),根据插件框架的id 号获取框架的指针(ctkPlugin::getPlugin),通过指针调用插件类(ctkPlugin)的启动函数(ctkPlugin::start),完成插件框架的启动工作。由此可以看出,CTK 插件框架本质上也是一个CTK 插件,只不过插件框架对该框架内的所有插件(ctkPlugins)和服务(ctkServices)进行了管理。
表1:日志服务定义表
表2:主机交互插件事件定义
表3:状态监控插件事件定义
2.2.2 安装并启动插件
如图3 所示,插件框架初始化时获取了插件上下文(ctkFrame work::getPluginContext),根据插件上下文安装插件(ctkPluginCon text::installPlugin),安装插件成功后返回该插件的指针,再通过指针调用插件类(ctkPlugin)的启动函数(ctkPlugin::start),完成插件的启动工作。
2.2.3 获取并调用服务
仍然通过插件上下文获取插件提供的服务(ctkPluginContext:: getService),getService 函数返回了服务的指针,其他插件可通过该指针调用服务。调用该函数时需要传入服务的引用(ctkServiceReference),该引用同样通过插件上下文进行获取(ct kPluginContext::getServiceReference)。
2.2.4 事件管理服务
图4:软件插件化示意图
事件管理服务是CTK 插件框架提供的一种特殊的服务,它采用了消息发布/订阅模式,消息的发送者将消息分为不同的主题(Topic),消息的接收者只根据Topic 来接收感兴趣的消息,两者之间通过EventAdmin 插件(由CTK 官方提供)进行通信,这极大地降低了插件之间的耦合性,使得多人并行开发成为可能。EventAdmin 插件实现了多线程并行发送事件、事件处理黑名单等诸多功能,开发人员也可按照插件框架的规范对EventAdmin 进行定制开发。
图5:软件参数设置界面
太赫兹人体安检系统集成了太赫兹成像主机、光学摄像头、电源模块等硬件设备,在不同的安检场景下需要增加或减少某些设备,甚至可能需要集成新的设备。因此,硬件可配置、可扩展成为软件最主要的需求。
针对硬件可配置、可扩展的要求,将每种硬件的功能以CTK插件的形式进行封装,在实际使用时,根据具体的硬件配置选择加载相应的插件。将软件分为四层架构(如图4 所示),从上往下分别为:信息展示层、业务逻辑层、硬件代理层、基础设施层,底层提供服务,上层进行调用。当需要增加新的硬件时,只需在硬件代理层中添加相应功能的插件,并对业务逻辑层和信息展示层中的某些相关插件进行修改即可,最大程度地减小对软件其他模块的影响。
3.3.1 日志管理插件
日志管理插件用于记录软件运行过程中产生的日志信息,日志信息共分为4 级:调试、普通、警告和错误。作为基础设施层中的模块,该插件为软件中的其他插件提供日志服务,服务共提供9 项功能,具体信息如表1 所示。
3.3.2 太赫兹主机交互插件
太赫兹主机交互插件(以下简称主机交互插件)用于和太赫兹主机(以下简称主机)进行交互,包括接收太赫兹图像数据、接收状态信息、转发主机控制命令、转发参数设置命令等。主机交互插件提供服务SERVICE_DCHOST,SERVIC_DCHOST 可以有n 个实例,视硬件配置参数而定。主机交互插件内部维护和主机的连接:在插件初始化时,连接到主机;当和主机的连接断开时,定时尝试重新连接到主机;当重新设置了主机的连接参数时,定时尝试重新连接到主机。
主机交互插件的服务以事件的形式提供,如表2 所示。
3.3.3 状态监控插接件
状态监控插件用于管理系统内各硬件设备的工作状态,该插件收到其他模块发送的状态信息后,先进行缓存,然后每2 秒向其他插件发送系统状态信息更新。
状态监控插件的服务以事件的形式提供,如表3 所示。
图5 为基于CTK 插件框架设计的太赫兹人体安检系统软件的设置界面。在系统内部硬件发生变化时,不必对系统框架和核心插件进行修改,仅对与硬件交互的插件进行配置即可实现功能的扩展和裁剪。例如,在单机系统中只需要启用1 个主机交互插件和1 个光学摄像头交互插件即可,而在双机通道式系统中可以同时开启2个主机插件和2 个光学摄像头交互插件。
太赫兹人体安检系统是一种人体安检领域的新产品,代表了下一代人体安检安防产品的发展方向[3]。在新产品的使用过程中,快速多变的用户需求给软件提出了更高的要求。为此,本文提出了以QT 为基础平台,基于CTK 插件框架的软件设计方法,对CTK 插件框架的运行机理进行了深入阐述,详细描述了太赫兹人体安检系统软件的插件化分层框架,并举例说明软件中核心插件的设计方案。实际应用表明,采用CTK 插件框架进行软件开发,不但令软件的结构更清晰,模块间的耦合性更低,开发难度更低,还极大地提高了软件的复用性,降低了开发成本,具有较高的实用价值。