張華坤 劉力力 卜偉華 唐冠杰 汪潮
(博微太赫茲信息科技有限公司 安徽省合肥市 230088)
太赫茲人體安檢系統(tǒng)采用被動式實時成像太赫茲人體安檢技術(shù),利用人體自身熱輻射產(chǎn)生的太赫茲波,通過一定的準(zhǔn)光系統(tǒng)將這些輻射收集到探測焦平面上,在焦平面上使用太赫茲探測器陣列完成對信號的采集。之后通過對信號的處理,可以形成人體輻射的太赫茲波強度圖,由于人身攜帶的物品對太赫茲波的遮擋和吸收,在太赫茲強度圖上這些物品所在的位置就會顯示出陰影輪廓,通過這個原理可以實時探測到人身攜帶物品的位置、大小和形狀,解決大客流場景下快速人體安檢的難題。[1]
隨著各安檢場所對通行安全和通行效率的要求不斷提升,系統(tǒng)的應(yīng)用場景也越來越復(fù)雜多樣。為了能夠適應(yīng)快速多變的用戶需求,系統(tǒng)必須能針對不同的安檢場所、安檢級別對功能進行快速定制和整合,因此對軟件框架的可擴展性提出了很高的要求。
如圖1 所示,Common Toolkits(以下簡稱CTK)插件框架是面向C++語言的動態(tài)組件系統(tǒng),它直接基于OSGI 規(guī)范。該系統(tǒng)由許多可重用的不同組件動態(tài)地組成,并允許各組件之間通過服務(wù)進行通信。官方提供了框架的分層模型包括:
(1)插件(Plugins)--由開發(fā)人員創(chuàng)建的CTK 組件。
(2)服務(wù)層(Services Layer)--通過為C++對象提供一個“發(fā)布-發(fā)現(xiàn)-綁定”模型來動態(tài)連接插件。
(3)生命周期層(Life Cycle Layer)--用于安裝、啟動、停止、更新和卸載插件的API。
(4)安全性(Security)--處理安全方面的內(nèi)容(尚未實現(xiàn))。
使用CTK 插件框架開發(fā)就代表開發(fā)插件,各插件之間互相隱藏了內(nèi)部實現(xiàn),并通過良好的服務(wù)和其它插件進行通信。內(nèi)部隱藏機制表明可以自由地更改本插件而不影響其它插件,面向服務(wù)的通信機制可以將插件之間的耦合性降到最低,大大提高系統(tǒng)的模塊化程度,使得代碼更加靈活,能夠更好地適應(yīng)變化。
CTK 插件框架的使用主要分為以下幾個步驟:
(1)初始化CTK 插件框架。
(2)安裝并啟動插件。
(3)獲取并調(diào)用服務(wù)。
2.2.1 初始化CTK 插件框架
圖1:CTK 插件框架的分層模型[2]
圖2:框架初始化
圖3:插件初始化
如圖2所示,CTK插件框架(ctkFramework)進行初始化(ctkPluginFramework::init) 時,首先對插件框架上下文(ctkPluginFrameworkContext) 進 行 初 始 化(ctkPluginFra meworkContext::init),插件框架上下文則調(diào)用插件上下文(ctkPluginContext)的構(gòu)造函數(shù)進行初始化。然后,啟動CTK 插件框架(ctkPluginFramework::start),根據(jù)插件框架的id 號獲取框架的指針(ctkPlugin::getPlugin),通過指針調(diào)用插件類(ctkPlugin)的啟動函數(shù)(ctkPlugin::start),完成插件框架的啟動工作。由此可以看出,CTK 插件框架本質(zhì)上也是一個CTK 插件,只不過插件框架對該框架內(nèi)的所有插件(ctkPlugins)和服務(wù)(ctkServices)進行了管理。
表1:日志服務(wù)定義表
表2:主機交互插件事件定義
表3:狀態(tài)監(jiān)控插件事件定義
2.2.2 安裝并啟動插件
如圖3 所示,插件框架初始化時獲取了插件上下文(ctkFrame work::getPluginContext),根據(jù)插件上下文安裝插件(ctkPluginCon text::installPlugin),安裝插件成功后返回該插件的指針,再通過指針調(diào)用插件類(ctkPlugin)的啟動函數(shù)(ctkPlugin::start),完成插件的啟動工作。
2.2.3 獲取并調(diào)用服務(wù)
仍然通過插件上下文獲取插件提供的服務(wù)(ctkPluginContext:: getService),getService 函數(shù)返回了服務(wù)的指針,其他插件可通過該指針調(diào)用服務(wù)。調(diào)用該函數(shù)時需要傳入服務(wù)的引用(ctkServiceReference),該引用同樣通過插件上下文進行獲?。╟t kPluginContext::getServiceReference)。
2.2.4 事件管理服務(wù)
圖4:軟件插件化示意圖
事件管理服務(wù)是CTK 插件框架提供的一種特殊的服務(wù),它采用了消息發(fā)布/訂閱模式,消息的發(fā)送者將消息分為不同的主題(Topic),消息的接收者只根據(jù)Topic 來接收感興趣的消息,兩者之間通過EventAdmin 插件(由CTK 官方提供)進行通信,這極大地降低了插件之間的耦合性,使得多人并行開發(fā)成為可能。EventAdmin 插件實現(xiàn)了多線程并行發(fā)送事件、事件處理黑名單等諸多功能,開發(fā)人員也可按照插件框架的規(guī)范對EventAdmin 進行定制開發(fā)。
圖5:軟件參數(shù)設(shè)置界面
太赫茲人體安檢系統(tǒng)集成了太赫茲成像主機、光學(xué)攝像頭、電源模塊等硬件設(shè)備,在不同的安檢場景下需要增加或減少某些設(shè)備,甚至可能需要集成新的設(shè)備。因此,硬件可配置、可擴展成為軟件最主要的需求。
針對硬件可配置、可擴展的要求,將每種硬件的功能以CTK插件的形式進行封裝,在實際使用時,根據(jù)具體的硬件配置選擇加載相應(yīng)的插件。將軟件分為四層架構(gòu)(如圖4 所示),從上往下分別為:信息展示層、業(yè)務(wù)邏輯層、硬件代理層、基礎(chǔ)設(shè)施層,底層提供服務(wù),上層進行調(diào)用。當(dāng)需要增加新的硬件時,只需在硬件代理層中添加相應(yīng)功能的插件,并對業(yè)務(wù)邏輯層和信息展示層中的某些相關(guān)插件進行修改即可,最大程度地減小對軟件其他模塊的影響。
3.3.1 日志管理插件
日志管理插件用于記錄軟件運行過程中產(chǎn)生的日志信息,日志信息共分為4 級:調(diào)試、普通、警告和錯誤。作為基礎(chǔ)設(shè)施層中的模塊,該插件為軟件中的其他插件提供日志服務(wù),服務(wù)共提供9 項功能,具體信息如表1 所示。
3.3.2 太赫茲主機交互插件
太赫茲主機交互插件(以下簡稱主機交互插件)用于和太赫茲主機(以下簡稱主機)進行交互,包括接收太赫茲圖像數(shù)據(jù)、接收狀態(tài)信息、轉(zhuǎn)發(fā)主機控制命令、轉(zhuǎn)發(fā)參數(shù)設(shè)置命令等。主機交互插件提供服務(wù)SERVICE_DCHOST,SERVIC_DCHOST 可以有n 個實例,視硬件配置參數(shù)而定。主機交互插件內(nèi)部維護和主機的連接:在插件初始化時,連接到主機;當(dāng)和主機的連接斷開時,定時嘗試重新連接到主機;當(dāng)重新設(shè)置了主機的連接參數(shù)時,定時嘗試重新連接到主機。
主機交互插件的服務(wù)以事件的形式提供,如表2 所示。
3.3.3 狀態(tài)監(jiān)控插接件
狀態(tài)監(jiān)控插件用于管理系統(tǒng)內(nèi)各硬件設(shè)備的工作狀態(tài),該插件收到其他模塊發(fā)送的狀態(tài)信息后,先進行緩存,然后每2 秒向其他插件發(fā)送系統(tǒng)狀態(tài)信息更新。
狀態(tài)監(jiān)控插件的服務(wù)以事件的形式提供,如表3 所示。
圖5 為基于CTK 插件框架設(shè)計的太赫茲人體安檢系統(tǒng)軟件的設(shè)置界面。在系統(tǒng)內(nèi)部硬件發(fā)生變化時,不必對系統(tǒng)框架和核心插件進行修改,僅對與硬件交互的插件進行配置即可實現(xiàn)功能的擴展和裁剪。例如,在單機系統(tǒng)中只需要啟用1 個主機交互插件和1 個光學(xué)攝像頭交互插件即可,而在雙機通道式系統(tǒng)中可以同時開啟2個主機插件和2 個光學(xué)攝像頭交互插件。
太赫茲人體安檢系統(tǒng)是一種人體安檢領(lǐng)域的新產(chǎn)品,代表了下一代人體安檢安防產(chǎn)品的發(fā)展方向[3]。在新產(chǎn)品的使用過程中,快速多變的用戶需求給軟件提出了更高的要求。為此,本文提出了以QT 為基礎(chǔ)平臺,基于CTK 插件框架的軟件設(shè)計方法,對CTK 插件框架的運行機理進行了深入闡述,詳細描述了太赫茲人體安檢系統(tǒng)軟件的插件化分層框架,并舉例說明軟件中核心插件的設(shè)計方案。實際應(yīng)用表明,采用CTK 插件框架進行軟件開發(fā),不但令軟件的結(jié)構(gòu)更清晰,模塊間的耦合性更低,開發(fā)難度更低,還極大地提高了軟件的復(fù)用性,降低了開發(fā)成本,具有較高的實用價值。