劉峰 陳福良
摘? 要: 為了解決指控系統(tǒng)中對實時目標歷史航跡的顯示需求,設計了一種基于SQLite數據庫的歷史航跡管理系統(tǒng)。結合當前指控系統(tǒng)的實際情況,將歷史航跡管理系統(tǒng)劃分為系統(tǒng)外部通信模塊、態(tài)勢處理模塊、存儲處理模塊和人機交互模塊。在商用計算機上對系統(tǒng)存儲和查詢性能進行了測試,測試結果滿足指控系統(tǒng)的實際使用需求。
關鍵詞: 指控系統(tǒng); 歷史航跡; 數據庫; SQLite
中圖分類號:TP311.1? ? ? ? ? 文獻標識碼:A? ? ?文章編號:1006-8228(2020)11-58-05
Abstract: In order to solve the requirement of displaying the real-time target historical voyage track in the Command and Control System, this paper designs a historical track management system by using SQLite database. Combining with the actual situation of the current Command and Control System, the historical track management system is divided into external communication module, situation processing module, storage processing module and human-computer interaction module. The system is implemented on a commercial computer,and its storage and query performance are tested, the test results meet the actual requirements of the Command and Control System.
Key words: Command and Control System; historical track; database; SQLite
0 引言
隨著艦船裝備雷達系統(tǒng)的快速發(fā)展,在對目標定位過程中,產生海量的航跡數據,而現(xiàn)有的指控系統(tǒng)中,為了保證實時目標的響應時間,一般只支持目標少量歷史航跡點的顯示。但是在實際指揮引導的過程中,指揮員需要對目標的歷史軌跡數據與實時航跡進行對比分析,特別是對一些重點關注的目標進行分析,以確定目標的威脅等級、具體型號。因此需要存儲海量歷史航跡數據,并支持指揮人員快速查詢某批目標的歷史航跡數據。
然而,現(xiàn)階段歷史軌跡存儲管理技術不夠完善[2],并且現(xiàn)有的航跡存儲系統(tǒng)往往基于Hadoop、HBase等分布式計算存儲框架[3],對整個指控系統(tǒng)的軟件架構和資源占用要求比較高,因此如何適配指控系統(tǒng),并做到高效地存儲和查詢歷史航跡數據,成為本系統(tǒng)設計的重點和難點。
本文從此實際需求出發(fā),設計了基于SQLite數據庫的歷史航跡管理系統(tǒng),并采用Qt進行開發(fā),以適配不同的操作系統(tǒng)。
1 系統(tǒng)架構
歷史航跡管理系統(tǒng)接收指控系統(tǒng)內的實時態(tài)勢報文和指揮人員的查詢輸入,按照輸入的查詢規(guī)則,從數據庫中查詢符合輸入條件的數據,并將查詢結果打包發(fā)送出去,將整個系統(tǒng)劃分為外部通信模塊、態(tài)勢處理模塊、存儲處理模塊、人機交互模塊四個部分(見圖1),其中外部通信模塊采用接口適配的開發(fā)思想,適配整個系統(tǒng)與外部指控系統(tǒng)之間的通信協(xié)議,系統(tǒng)內部各個模塊之間通過消息隊列機制來進行數據同步。
外部通信模塊把從指控系統(tǒng)獲取到的目標態(tài)勢數據轉換為內部消息格式發(fā)送到態(tài)勢處理模塊,態(tài)勢處理模塊接收到內部消息數據,提取其中的位置信息,建立數據緩存隊列,當隊列長度到達一定閾值后,將隊列中的數據發(fā)送至存儲處理模塊進行入庫處理。存儲處理模塊負責對接收到的數據入庫保存,同時,響應人機交互模塊的查詢請求,從本地SQLITE數據文件中載入符合條件的航跡數據信息。
人機交互模塊接收人機交互界面的查詢請求,調用存儲處理模塊提供的查詢接口,返回滿足用戶查詢請求的數據。
2 外部通信模塊
外部通信模塊目前采用服務總線(DDS)的方式獲取數據,它是現(xiàn)階段指控系統(tǒng)常用的信息傳輸的架構,用來完成指控系統(tǒng)內不同應用軟件之間的信息交互。具體方式如圖2所示,通過DDS歷史航跡管理系統(tǒng)可以訂閱系統(tǒng)內的實時態(tài)勢情報態(tài)勢,并轉換為內部的信息格式發(fā)送給態(tài)勢處理模塊。
外部通信模塊作為本系統(tǒng)與外部指控系統(tǒng)之間的通信協(xié)議轉換中間層,可以將歷史航跡管理系統(tǒng)與外部指控系統(tǒng)解耦,并且通過修改此模塊可以達到適配采用不同通信架構的指控系統(tǒng)。
3 態(tài)勢處理模塊
態(tài)勢處理模塊將從外部通信模塊接收到的數據發(fā)送至存儲處理模塊。SQLite數據庫作為一種文件數據庫,存儲數據操作相當于文件操作,而態(tài)勢數據通過網絡進行接收,因此為了解決數據接收與數據庫文件讀寫速度不匹配的問題,采用數據緩存隊列對態(tài)勢數據進行預先保存,整個運行流程如圖3所示。
態(tài)勢處理模塊創(chuàng)建態(tài)勢數據接收線程,對接收到的態(tài)勢數據,提取其中的位置信息,緩存到內部數據隊列中,當隊列中的數據達到一定數量(此閾值可根據實際每秒中接收到的報文數量進行設置,目前設置為1000)時,將整個數據隊列,通過事件的方式發(fā)送到數據庫處理模塊,進行入庫保存,程序流程圖如圖4所示。
4 存儲處理模塊
4.1 模塊設計
存儲處理模塊采用SQLite數據庫進行航跡數據存儲,SQLite作為一種輕量級數據庫,支持單生產者多消費者的設計模式,因此存儲處理模塊在初始化時,預先創(chuàng)建數據庫寫入線程以及數據庫查詢線程。
數據寫入線程通過Qt事件消息隊列接收態(tài)勢處理模塊打包發(fā)送的態(tài)勢數據,數據讀取線程則響應人機交互模塊轉發(fā)的外部查詢請求,采用多線程處理模式,創(chuàng)建數據存儲和數據查詢線程,提升系統(tǒng)對外部查詢請求的響應,具體結構如圖5所示。
4.2 庫表設計
本系統(tǒng)主要提供單批目標在一段時間內的航跡位置數據,為了提高查詢的效率,每批目標單獨建立庫表,單個批號表中包含時間、經度、緯度、目標類型、航速、航向等列,用來存儲目標的位置數據,并以時間順序進行保存,目標庫表如圖6所示。
目前指控系統(tǒng)單日接收的態(tài)勢數據量在千萬級,單個目標表日增加數據在5萬行左右的,隨著時間積累,如果不對時間進行處理的話,存儲的數據量將逐漸增加,導致整個數據庫查詢性能的下降。為了解決此問題,存儲目標航跡數據時,使用多個數據庫文件來保存歷史航跡數據,具體做法為:以天為周期,使用當前日期為名稱,每天自動建立對應日期的數據庫文件。減少庫表中目標記錄,顯著提升查詢的時間性能。
4.3 數據寫入線程
數據寫入線程初始化時,將根據當前系統(tǒng)時間,創(chuàng)建對應日期的db文件,通過事務方式將從態(tài)勢處理模塊接收到的數據寫入數據庫,具體的偽代碼如下:
Begin
CreateSQLITEFile(time)
ConnectDB()
Transction() //開啟事務
For(int i=0; i bool isCreate=JugeTime if isCreate CreateSQLITEFile(time) ConnectDB() Insert_sql() Commit() //提交事務 End 其中,函數CreateSQLITEFile(time)根據傳入的1970s的絕對時間,生成相應日期的數據庫文件;ConnectDB()函數的作用是連接本機的SQLite數據庫文件,采用QSqlDatabase類來進行數據庫操作;函數JugeTime()用來判斷態(tài)勢數據的時間是否超過今天日期,如果超過,則需要重新建立新的日期的數據庫文件;函數Transction()設置開始事務,采用事務方式的原因是當SQLite插入數據時,默認將單條Insert語句作為事務進行操作,有多少條數據就會產生多少次磁盤操作,而循環(huán)使用Insert語句插入數據庫的效率遠低于通過事務方式插入[4];函數Commit()提交事務,完成整個寫入數據庫操作。具體流程圖如圖7所示。 4.4 數據讀取線程 數據讀取線程接收人機交互模塊發(fā)送的查詢請求,定義查詢請求結構如圖8所示。 其中uIP表示查詢請求方的IP地址,iBatch表示查詢的目標批號,dfStartTime,dfEndTime表示航跡數據的起始時間。當接收到查詢請求時,數據讀取線程首先根據查詢的起始時間,生成需要讀取的數據庫文件列表,按照查詢的時間順序,依次打開數據庫文件,調用SQLite查詢接口,查詢目標批號的航跡數據,對查詢到的數據,分包發(fā)送至人機交互模塊,由人機交互模塊將查詢數據發(fā)送給查詢方,偽代碼如下: Beigin sql_query=CreateSql(QueryCtrl) namelist=GetSQLITEDBfileName(start, end) For(int i=0; i OpenDBFile(filename) data=Query_sql(sql_query) Package(data) End 其中,函數CreateSql(QueryCtrl),根據接收到的查詢請求,生成相應的sql語句;函數GetSQLITEDBfileName(start,end),根據查詢請求中的起始時間,生成需要讀取db文件列表;函數OpenDBFile(filename)根據輸入的文件名稱,連接數據庫db文件;函數Query_sql(querystring)執(zhí)行生成的sql查詢語句,返回從SQLite數據庫查詢到的歷史航跡數據;函數Package(data)將查詢到的航跡數據打包,并將打包后的查詢結果通過數據服務總線發(fā)送至請求方,具體流程圖如圖9所示。 5 人機交互模塊 主要響應外部其他應用軟件的查詢指令,由于態(tài)勢處理模塊設計緩存隊列緩存數據,為了保證查詢結果的時效性,接收到查詢指令后,人機交互模塊發(fā)送更新指令到態(tài)勢處理模塊,接收到更新指令后,態(tài)勢處理模塊會將當前緩存隊列中的所有數據發(fā)送到存儲處理模塊進行入庫保存,存儲處理模塊寫入線程完成后將通過Qt事件,傳遞信號給人機交互模塊,當收到數據寫入完成信號時,再將查詢請求轉發(fā)至存儲處理模塊,此時存儲模塊再處理數據查詢請求,整個時序如圖10所示。 6 試驗測試 6.1 試驗測試環(huán)境 在商用計算機上測試軟件性能,測試環(huán)境如下。 ⑴ 硬件環(huán)境:處理器:Intel(R)Core(TM)i7-7700K CPU@4.2GHz,內存:16GB。 ⑵ 軟件環(huán)境:Win7 64位操作系統(tǒng)。 6.2 試驗測試結果分析 ⑴ 數據寫入性能測試 每隔2s發(fā)送1000批航跡點,并將緩存隊列閾值設置為1000,共進行5組測試,取10次試驗的平均耗時為測試結果,記錄時間性能測試結果如表1所示。 ⑵ 數據查詢性能測試 查詢符合時間范圍的航跡數據,共進行5組測試,取10次試驗的平均耗時為測試結果,數據查詢性能測試結果如表2所示。 根據實際測試結果,系統(tǒng)平均寫入時間為197.2ms,平均讀取時間為49.2ms,遠低于航跡發(fā)送周期2s,滿足指控系統(tǒng)對歷史航跡存儲和查詢的需求。 7 結束語 本文針對指控系統(tǒng)中對目標歷史航跡數據存儲和查詢的需求,設計了系統(tǒng)的總體框架,明確了系統(tǒng)內部的信息流程以及和外部指控系統(tǒng)間的通信方式,并在此基礎上劃分了具體工作的各個功能模塊,采用Qt對各個功能模塊進行開發(fā)實現(xiàn)。通過對軟件存儲數據和查詢數據的時間性能進行測試,本系統(tǒng)符合歷史航跡存儲量大、查詢性能高和跨平臺的要求,可以滿足指控系統(tǒng)對實時目標歷史航跡顯示的需求。 參考文獻(References): [1] Sunny Kumar Aditya & Vikash KumarKarn.Android SQLite Essentials[M].Packt Publishing Limited,2014.8.26. [2] 格蘭特·艾倫,邁克·歐文斯.SQLite 權威指南(第2版)[M].電子工業(yè)出版社,2012. [3] 程棟.SQLite數據庫在數據分發(fā)服務中的應用[J].信息技術,2014.6. [4] 盛凱,劉忠,周德超.基于PostGIS的歷史航跡重演分析系統(tǒng)設計與開發(fā)[J].海軍工程大學學報,2017.10. [5] 孟凡君,曹偉,管志強.海量雷達數據異常軌跡分析[J].電子科技,2017(30)-1. [6] 孫曉全,熊永嶺,張艷娜.Android系統(tǒng)中SQLite數據庫使用效率研究[J].電子設計工程,2015.4. [7] 林培杰,朱安南,程樹英.Android數據庫SQLite性能優(yōu)化[J].計算機系統(tǒng)應用,2014.23. [8] 王丹,孔祥偉,何良.SQLite輕型數據庫在試飛領域的應用[J].中國科技信息.2019.9. [9] 孫成.基于智能設備的嵌入式數據庫安全性研究[D].吉林大學,2015.