(中國電子科技集團(tuán)公司第三十八研究所,安徽合肥230088)
軍事雷達(dá)作為戰(zhàn)爭的產(chǎn)物和軍中“千里眼”,從出現(xiàn)至今,已經(jīng)成為各軍事大國不遺余力地競相發(fā)展的裝備設(shè)施。隨著技術(shù)的發(fā)展,現(xiàn)代雷達(dá)系統(tǒng)越來越復(fù)雜,這給雷達(dá)狀態(tài)監(jiān)視及使用維護(hù)提出了新的挑戰(zhàn)。日志管理功能可以記錄并管理雷達(dá)生命周期內(nèi)的工作過程狀態(tài),包括雷達(dá)的控制、狀態(tài)參數(shù)、故障信息、設(shè)備壽命等重要信息,這為裝備的維護(hù)保障提供了科學(xué)的數(shù)據(jù),本文主要介紹SQLite數(shù)據(jù)庫在雷達(dá)日志管理中的設(shè)計及應(yīng)用。
與傳統(tǒng)C/S結(jié)構(gòu)的各種大型關(guān)系數(shù)據(jù)庫(如Oracle,SQL Server,MySQL等)相比,SQLite是一個輕量級的關(guān)系數(shù)據(jù)庫,具有三級模式的結(jié)構(gòu)體系,即用戶模式、邏輯模式和存儲模式[1]。相對于傳統(tǒng)數(shù)據(jù)庫,SQLite具有更好的實時性、系統(tǒng)開銷小、底層控制能力強。SQLite能夠高效地利用有限資源、提高數(shù)據(jù)的存取速度、增強系統(tǒng)的安全性,并具有如下關(guān)鍵特點[2]:
1)零配置。SQLite在使用前不需要安裝設(shè)置,不需要進(jìn)程來啟動、停止或配置,不需要管理員去創(chuàng)建新數(shù)據(jù)庫或分配用戶權(quán)限,在系統(tǒng)崩潰或失電之后自動恢復(fù)。
2)支持絕大多數(shù)SQL-92標(biāo)準(zhǔn)的SQL命令,支持視圖、觸發(fā)器,支持嵌套SQL,具有事務(wù)處理功能,自動維護(hù)事務(wù)的完整性、原子性等特性,支持實體完整性和參照完整性。
3)無需安裝數(shù)據(jù)庫引擎。使用SQLite時,訪問數(shù)據(jù)庫的程序直接從磁盤上的數(shù)據(jù)庫文件讀寫,沒有中間的服務(wù)器進(jìn)程。
4)支持多種開發(fā)語言和數(shù)據(jù)庫平臺無關(guān)性,支持大多數(shù)計算機(jī)語言,支持 Windows/Linux/Unix/Mac OS等主流的操作系統(tǒng),可實現(xiàn)數(shù)據(jù)庫文件在機(jī)器之間自由共享。
5)精簡性與簡單訪問。優(yōu)化后整個SQLite庫小于225 KB。一個SQLite數(shù)據(jù)庫是一個單獨的普通磁盤文件,能夠被定位在路徑層次的任何地方。
6)數(shù)據(jù)存儲量大。數(shù)據(jù)存儲在單個物理文件中,支持2 TB的數(shù)據(jù)存儲。
7)源碼完全開放。使用者可用于任何非商業(yè)和商業(yè)用途。
SQLite數(shù)據(jù)庫主要由4部分組成:內(nèi)核(Core)、SQL編譯器(SQL Compiler)、后端(Backend)以及附件(Accessories),內(nèi)部結(jié)構(gòu)如圖1所示[3]。
最后,本文存在兩個問題可以進(jìn)一步改進(jìn):第一,使用跨越時間更長的面板數(shù)據(jù)得到的兩步估計值更加穩(wěn)健,但由于數(shù)據(jù)局限,目前無法實施;第二,其他因素,如預(yù)期、相對收入等對主觀幸福感的影響在整個分布上的變化如何,以及中國其他群體,如農(nóng)村居民、城市移民、老年人等主觀幸福感的決定因素用面板分位數(shù)回歸方法分析后得到的結(jié)論又有何異同,需要更深一步地研究。
圖1 SQLite的內(nèi)部結(jié)構(gòu)
SQLite的接口是一些已經(jīng)編寫好的C庫,即使使用不同語言的API,在底層仍然使用C庫執(zhí)行。SQL語句通過接口進(jìn)入到高效的SQL編譯器,由標(biāo)記處理器(Tokenizer)分解成分析器(Parser)可以識別的各個標(biāo)志符,然后由分析器重新組合標(biāo)志符并調(diào)用代碼生成器(Code Generator)生成虛擬機(jī)器碼,交由虛擬機(jī)(Virtual Machine)去執(zhí)行,最終完成SQL語句指定的任務(wù)。虛擬機(jī)是SQLite內(nèi)部結(jié)構(gòu)的核心,不僅完成與數(shù)據(jù)操作相關(guān)的全部操作,而且還是客戶和存儲之間信息進(jìn)行交換的中間單元。數(shù)據(jù)庫按照B樹(B-tree)的形式存儲在磁盤上,通過可調(diào)整的頁面緩沖(Pager)獲得對數(shù)據(jù)的快速查找和存儲。為了方便移植,SQLite使用一個抽象層接口(OS Interface)與不同操作系統(tǒng)進(jìn)行對接。
SQLite數(shù)據(jù)庫在雷達(dá)中的部署如圖2所示。雷達(dá)綜合監(jiān)控計算機(jī)作為雷達(dá)監(jiān)控系統(tǒng)的“中樞神經(jīng)”,實現(xiàn)發(fā)射監(jiān)控、接收監(jiān)控、伺服監(jiān)控、信號監(jiān)控、終端監(jiān)控的狀態(tài)信息采集、識別、分類與處理,通過以太網(wǎng)發(fā)送給雷達(dá)顯控計算機(jī),雷達(dá)顯控軟件對各分系統(tǒng)的狀態(tài)進(jìn)行識別、分類、編碼后,錄入嵌入式數(shù)據(jù)庫SQLite中,完成系統(tǒng)狀態(tài)的日志記錄;雷達(dá)顯控接收操縱員的控制命令,完成雷達(dá)整機(jī)的工作狀態(tài)控制,這些控制命令進(jìn)行分類編碼后通過內(nèi)部以太網(wǎng)發(fā)送到綜合監(jiān)控,由綜合監(jiān)控完成控制日志的統(tǒng)一管理;操縱員通過雷達(dá)顯控發(fā)出日志查詢指令時,由綜合監(jiān)控通過SQLite數(shù)據(jù)庫接口實現(xiàn)日志的快速檢索,把結(jié)果返回給雷達(dá)顯控進(jìn)行實時顯示。
圖2 SQLite數(shù)據(jù)庫部署圖
SQLite數(shù)據(jù)庫創(chuàng)建及連接接口函數(shù)為sqlite3_open,在綜合監(jiān)控中的實現(xiàn)如下:
所謂日志,是指系統(tǒng)或設(shè)備所指定對象的某些操作及其操作結(jié)果按時間有序的集合[4]。日志由日志記錄組成,每條日志記錄描述了一次單獨的事件。與一般的原始數(shù)據(jù)相比,日志通常是一種半結(jié)構(gòu)化的數(shù)據(jù),它包含了一個時間戳和一個消息或者系統(tǒng)所特有的其他信息。日志是系統(tǒng)狀態(tài)變化的反映,是對系統(tǒng)的狀態(tài)和活動的流水記錄[5]。
雷達(dá)日志可分為操作日志、故障日志、狀態(tài)日志、告警日志,如圖3所示。對日志進(jìn)行分類記錄有利于操縱員按類型進(jìn)行查詢檢索,方便系統(tǒng)維護(hù)管理。操作日志記錄雷達(dá)操縱員控制輸入指令信息,用于完整記錄雷達(dá)的控制流程,包括操縱員信息、控制對象、控制指令、控制參數(shù)、時間等;故障日志記錄雷達(dá)的故障信息,用于分析雷達(dá)故障發(fā)生的背景及故障原因,包括故障名稱、所屬分系統(tǒng)、故障時間;狀態(tài)日志記錄雷達(dá)工作狀態(tài)參數(shù)信息,包括天線轉(zhuǎn)速、工作頻率、信號處理參數(shù)、發(fā)射機(jī)功率參數(shù)、定北參數(shù)等;告警日志記錄雷達(dá)的異常信息、嚴(yán)重故障的重要信息。
圖3 SQLite的內(nèi)部結(jié)構(gòu)
根據(jù)雷達(dá)日志的分類及特點,需要創(chuàng)建3張表,分別是日志類別表、日志類型表、日志記錄表,SQL語句的接口函數(shù)為SQLITE_API int sqlite3_exec(sqlite3?,const char?sql,int(?callback)(void?,int,char??,char??),void?,char??errmsg)。
1)日志類別表
日志類別表用于存放4種類日志的結(jié)構(gòu)信息,其結(jié)構(gòu)如表1所示。
表1 日志類別表
添加日志類別的SQL語句為:“INSERT INTO TABLE_LOG_KIND(Log KindID,Log Kind-Name)VALUES(%d,′%s′);”。
2)日志類型表
日志類型表用于存放雷達(dá)日志詳細(xì)分類的結(jié)構(gòu)信息,包括類型編號、所屬類別、類型代碼、類型名稱,其結(jié)構(gòu)如表2所示。
創(chuàng)建日志類型表的SQL語句為:“CREATE TABLE IF NOT EXISTS TABLE_LOG_TYPE(Log TypeID INTEGER PRIMARY KEY AUTOINCREMENT,Log KindID INTEGER,Log-TypeCode VARCHAR(20),Log Type Name VARCHAR(50));”。
添加日志類型的SQL語句為:“INSERT INTO TABLE_LOG_TYPE(Log KindID,Log TypeCode,Log TypeName)VALUES(%d,′%s′,′%s′);”。
3) 日志記錄表
日志記錄表用于記錄雷達(dá)運行過程的操作及狀態(tài)的真實信息,包括日志編號、所屬日志類型、日志參數(shù)、用戶名、日志產(chǎn)生時間,其結(jié)構(gòu)如表3所示。
表3 日志記錄表
創(chuàng)建日志記錄表的SQL語句為:“CREATE TABLE IF NOT EXISTS TABLE_LOG_RECORD(RecordID INTEGER PRIMARY KEY AUTOINCREMENT,Log TypeID INTEGER,LogPara BLOB,User Name VARCHAR(20),Record Time REAL);”。
添加雷達(dá)日志記錄的SQL語句為:“INSERT INTO TABLE_LOG_RECORD(Log TypeID,LogPara,User Name,Record Time)VALUES(%d,′%s′,′%s′,%f);”。
檢索雷達(dá)日志的SQL語句為:“SELECT RecordID,TABLE_LOG_RECORD.Log TypeID,LogPara,User Name,Record Time FROM TABLE_LOG_RECORD,TABLE_LOG_TYPE”。
數(shù)據(jù)庫的記錄主要用于對事件及行為的實時存儲,而數(shù)據(jù)庫的檢索則用于業(yè)務(wù)的分析及事務(wù)的處理,也是日志管理最終的結(jié)果體現(xiàn)。在SQLite中,數(shù)據(jù)庫的檢索包括如下接口函數(shù):
數(shù)據(jù)庫檢索結(jié)果的人機(jī)界面顯示如圖4所示。
圖4 數(shù)據(jù)庫檢索及顯示
SQLite以體積小巧、快速高效、穩(wěn)定可靠、易移植性好等優(yōu)勢成為嵌入式數(shù)據(jù)庫領(lǐng)域的新寵。本文介紹了SQLite數(shù)據(jù)庫在雷達(dá)系統(tǒng)中的部署、數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計,以及日志的記錄與檢索方法。工程實踐表明,SQLite數(shù)據(jù)庫具有存儲量大、性能高和跨平臺的特點,能夠滿足雷達(dá)系統(tǒng)中對日志數(shù)據(jù)存儲和管理的功能需求。
[1]ALLEN G,OWENS M.SQLite權(quán)威指南[M].2版.楊謙,劉義宣,謝志強,譯.北京:電子工業(yè)出版社,2012.
[2]王春艷,李帥.SQLite在飛艇監(jiān)控中的應(yīng)用與優(yōu)化[J].雷達(dá)科學(xué)與技術(shù),2014,12(6):609-612.WANG Chunyan,LI Shuai.Optimization and Appli-cation of SQLite in Monitoring and Control System of Airship[J].Radar Science and Technology,2014,12(6):609-612.(in Chinese)
[3]SQLite.The Architecture of SQLite[EB/OL].[2015-06-21].http://www.sqlite.org/arch.html.
[4]林曉東,劉心松.文件系統(tǒng)中日志技術(shù)的研究[J].計算機(jī)應(yīng)用,1998,18(1):28-30.
[5]羅自立,薛質(zhì),李建華.基于Linux環(huán)境的主機(jī)日志自動審計技術(shù)[J].信息安全與通信保密,2004(7):43-45.