国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

SQLite數(shù)據(jù)庫(kù)調(diào)用系統(tǒng)程序的實(shí)現(xiàn)與應(yīng)用

2016-06-06 13:22:40陳剛侯曉榮
電腦知識(shí)與技術(shù) 2016年6期
關(guān)鍵詞:監(jiān)控系統(tǒng)嵌入式數(shù)據(jù)庫(kù)

陳剛++侯曉榮

摘要:該文對(duì)SQLite數(shù)據(jù)庫(kù)源碼進(jìn)行了分析、修改和重新編譯,為SQLite數(shù)據(jù)庫(kù)增加了自定義的內(nèi)置函數(shù),實(shí)現(xiàn)了SQLite對(duì)系統(tǒng)程序的調(diào)用?;诖?,提出采用SQLite數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)進(jìn)行檢測(cè)并調(diào)用系統(tǒng)中的程序?qū)z測(cè)的問(wèn)題進(jìn)行處理,適用于嵌入式監(jiān)控系統(tǒng)中的數(shù)據(jù)檢測(cè)和報(bào)警問(wèn)題。該方法利用了數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)進(jìn)行檢測(cè)和處理,相比編程的方法,減少了程序員的工作量,方便了大批量數(shù)據(jù)的管理。

關(guān)鍵詞:嵌入式;SQLite;數(shù)據(jù)庫(kù);SQLite;內(nèi)置函數(shù);監(jiān)控系統(tǒng)

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)06-0001-02

Implementation and Application of SQLite Calling System Program

CHEN Gang, HOU Xiao-rong

(School of Energy Science and Engineering, University of Electronic Science and Technology of China, Chengdu 611731, China)

Abstract: In this paper,the source code of SQLite is analyzed, modified and recompiled. By this way, a new custom built-in function is added to the SQLite, which enable the SQLite database system to call the system programs. Based on this new function, this paper proposes to use SQLite database for data detection and invoking programs to dealing with detected problems, which is suitable for the data detection and alarm handling problems in the embedded monitoring system. This method utilizes the database technology to detect data and handle alarms, which reduces the workload of the programmer and facilitates large amounts of data management compared with the programming method.

Key words: Embedded System ; SQLite; Database; Built-in Function; Monitoring System

1 引言

在嵌入式數(shù)據(jù)采集與監(jiān)控系統(tǒng)中,需要對(duì)數(shù)據(jù)進(jìn)行定時(shí)檢測(cè),當(dāng)數(shù)據(jù)出現(xiàn)異常時(shí),調(diào)用程序進(jìn)行相應(yīng)的處理。比如,對(duì)一個(gè)溫度數(shù)據(jù)采集與監(jiān)控系統(tǒng)而言,當(dāng)檢測(cè)到溫度過(guò)高時(shí),需要調(diào)用系統(tǒng)控制程序降低溫度,或者調(diào)用程序觸發(fā)相關(guān)告警裝置,提醒工作人員處理。一般的,監(jiān)控系統(tǒng)中數(shù)據(jù)的檢測(cè)與處理,都是通過(guò)編寫(xiě)程序完成的。但是,當(dāng)數(shù)據(jù)量非常大的時(shí)候,程序的數(shù)據(jù)判斷和處理工作會(huì)非常多,代碼量巨大,不方便程序的開(kāi)發(fā)和管理。

針對(duì)以上問(wèn)題,本文通過(guò)對(duì)SQLite源碼進(jìn)行修改和重新編譯,實(shí)現(xiàn)了SQLite數(shù)據(jù)庫(kù)對(duì)系統(tǒng)程序的調(diào)用?;诖?,提出通過(guò)SQLite數(shù)據(jù)庫(kù)解決監(jiān)控系統(tǒng)中的數(shù)據(jù)檢測(cè)和處理問(wèn)題:如圖1所示,利用SQLite的觸發(fā)器對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行判斷,當(dāng)數(shù)據(jù)異常時(shí),觸發(fā)相關(guān)程序進(jìn)行處理。該方法通過(guò)設(shè)計(jì)數(shù)據(jù)庫(kù)觸發(fā)器檢測(cè)和處理數(shù)據(jù),相比編程的方法,不用編寫(xiě)繁雜的判斷處理代碼,可以方便大量數(shù)據(jù)的監(jiān)控管理。

2 SQLite的原理和開(kāi)發(fā)技術(shù)

SQLite是針對(duì)嵌入式系統(tǒng)采用ANSIC C語(yǔ)言開(kāi)發(fā)的輕量級(jí)開(kāi)源數(shù)據(jù)庫(kù)[1],可以在Windows/Linux/Unix等主流操作系統(tǒng)上穩(wěn)定運(yùn)行。SQLite可以支持多種語(yǔ)言對(duì)其進(jìn)行數(shù)據(jù)操作,比如C/C++語(yǔ)言、Java、PHP等,相對(duì)MySQL等著名的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)而言,它的處理速度更快[2]。SQLite第一個(gè)Alpha版本最早由D. Richard Hipp在2000年發(fā)布。自發(fā)布以來(lái),SQLite不斷更新,目前已經(jīng)更新到SQLite3.11.0版本。SQLite是一個(gè)基于文件的數(shù)據(jù)庫(kù),它可以處理所有類型的數(shù)據(jù),支持多數(shù)的 SQL92 標(biāo)準(zhǔn)。SQLite是一個(gè)自包含、零配置的數(shù)據(jù)庫(kù)[3]:一個(gè)應(yīng)用程序在使用SQLite的過(guò)程中,SQLite功能會(huì)被集成在其中,應(yīng)用程序和SQLite共用相同的進(jìn)程,而不是單獨(dú)的一個(gè)進(jìn)程;應(yīng)用程序會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù)文件,而不是通過(guò)套接字來(lái)交互,這使得SQLite快速和高效。由于SQLite可移植性好,體積小且高效的特性,自發(fā)布以來(lái),SQLite逐步受到關(guān)注,在嵌入式、Android、IOS系統(tǒng)中得到廣泛應(yīng)用。

2.1 SQLite的實(shí)現(xiàn)原理

SQLite采用模塊化的設(shè)計(jì), 主要由四個(gè)部分組成:即內(nèi)核、SQL 編譯器、后端以及附件。其中內(nèi)核和SQL編譯器完成SQL語(yǔ)句的接收、提取、執(zhí)行;而后端負(fù)責(zé)完成SQL指令與系統(tǒng)的對(duì)接進(jìn)而執(zhí)行這些指令;附件用于SQLite的附加功能實(shí)現(xiàn)[4]。

2.2 SQLite的內(nèi)置函數(shù)

SQLite 有許多內(nèi)置函數(shù)用于數(shù)據(jù)的處理,所有函數(shù)都是大小寫(xiě)不敏感的,可以使用這些函數(shù)的小寫(xiě)形式、大寫(xiě)形式或混合形式來(lái)調(diào)用它們。目前,官方發(fā)布的SQLite內(nèi)置函數(shù)一般是用于處理字符串或數(shù)字?jǐn)?shù)據(jù)的,但是,內(nèi)置函數(shù)的功能不局限于此。我們可以通過(guò)增加一個(gè)自定義的SQLite的內(nèi)置函數(shù),使SQLite能夠通過(guò)該內(nèi)置函數(shù)實(shí)現(xiàn)對(duì)系統(tǒng)程序的調(diào)用。

SQLite內(nèi)置函數(shù)是采用回調(diào)的方式實(shí)現(xiàn)的:所有內(nèi)置函數(shù)都通過(guò)回調(diào)函數(shù)[5]的定義和注冊(cè)實(shí)現(xiàn)。在SQLite源碼中,func.c模塊是負(fù)責(zé)實(shí)現(xiàn)內(nèi)置函數(shù)的。SQLite的內(nèi)置函數(shù)(例如count(),substr()函數(shù)),都可以在func.c中找到。因此,可以通過(guò)在func.c中增加SQLite的回調(diào)函數(shù),實(shí)現(xiàn)SQLite對(duì)外部程序的調(diào)用。

3 SQLite實(shí)現(xiàn)系統(tǒng)程序調(diào)用

目前,官方發(fā)布的SQLite數(shù)據(jù)庫(kù)不支持對(duì)系統(tǒng)程序的調(diào)用,這限制了SQLite的使用。因此,本節(jié)將根據(jù)上述原理,通過(guò)在SQLite的func.c模塊中定義和注冊(cè)回調(diào)函數(shù),并重新編譯SQLite,實(shí)現(xiàn)SQLite對(duì)系統(tǒng)程序的調(diào)用,具體步驟如下所述。

3.1 為SQLite添加內(nèi)置函數(shù)

在SQLite官網(wǎng)上下載sqlite-amalgamation-3090200.zip壓縮包,解壓后得到shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h四個(gè)文件。在Windows下使用Visual Studio 2013修改SQLite源碼:

1)在Visual Studio 2013中新建一個(gè)空的C++控制臺(tái)工程,命名為SQLite;依次添加shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h四個(gè)文件到SQLite工程中。

2)在SQLite的func.c模塊,按照回調(diào)接口定義:void (*xFunc)(sqlite3_context*,int,sqlite3_value **),在lowerFunc函數(shù)下方,增加回調(diào)函數(shù)sys_execFunc,實(shí)現(xiàn)SQLite對(duì)系統(tǒng)程序的調(diào)用,具體代碼為:

static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){[…]};//lowerFunc定義

static void sys_execFunc(sqlite3_context *context, int argc, sqlite3_value **argv){

const char *c = (char*)sqlite3_value_text(argv[0]); //獲取用戶輸入的系統(tǒng)命令

if (c){system(c); //執(zhí)行系統(tǒng)命令

}

3)在lowerFunc函數(shù)的注冊(cè)代碼下方,將新增的sys_execFun函數(shù)注冊(cè)為sys_exec。注冊(cè)代碼為: FUNCTION(lower, 1, 0, 0, lowerFunc ) //lowerFunc注冊(cè)

FUNCTION(sys_exec,1, 0, 0, sys_execFun)

4)至此,如果沒(méi)有語(yǔ)法錯(cuò)誤,項(xiàng)目可以直接編譯成功,則代碼修改完畢。

3.2 Linux下代碼編譯及測(cè)試

代碼修改完成后,可以在Linux系統(tǒng)中對(duì)SQLite進(jìn)行重新編譯,實(shí)現(xiàn)SQLite對(duì)系統(tǒng)程序的調(diào)用。實(shí)驗(yàn)環(huán)境可以為SQLite支持的任意Linux操作系統(tǒng)。為了將問(wèn)題具體化,這里采用樹(shù)莓派2代主板(Debian Linux系統(tǒng))作為實(shí)驗(yàn)環(huán)境,該主板采用Broadcom BCM2836 900MHz ARM Cortex-A7 四核處理器,具有1G的運(yùn)行內(nèi)存,可以滿足實(shí)驗(yàn)要求。

參考SQLite官網(wǎng)和文獻(xiàn)[6],對(duì)修改后的代碼在Linux下重新編譯。首先,在SQLite官網(wǎng)上下載sqlite-autoconf-3090200.tar.gz壓縮包,Linux下解壓后得到sqlite3.c、sqlite3.h等一系列文件。將其中的sqlite3.c文件替換為之前修改過(guò)的sqlite3.c文件。然后依次按照如下的步驟,在Linux系統(tǒng)中編譯程序:

1)進(jìn)入SQLite源碼目錄,對(duì)軟件進(jìn)行系統(tǒng)配置,即運(yùn)行命令:

~$ sudo ./configure

2)編譯程序,等待程序生成,即運(yùn)行命令:

~$ sudo make

3)程序編譯完成后,安裝生成的sqlite3程序,即運(yùn)行命令:

~$ sudo make install

最后,通過(guò)以上操作,SQLite新增了一個(gè)名為sys_exec的內(nèi)置函數(shù)。我們可以對(duì)新增的sys_exec內(nèi)置函數(shù)進(jìn)行測(cè)試。例如:輸入命令select sys_exec(‘pwd),控制臺(tái)將輸出當(dāng)前目錄;輸入命令select sys_exec(‘ls),控制臺(tái)將輸出當(dāng)前目錄下的文件夾和文件。

4 SQLite實(shí)現(xiàn)數(shù)據(jù)自檢與處理

SQLite的數(shù)據(jù)自檢與處理可以通過(guò)觸發(fā)器實(shí)現(xiàn)。SQLite的觸發(fā)器是數(shù)據(jù)庫(kù)的回調(diào)函數(shù),它會(huì)在指定的數(shù)據(jù)庫(kù)事件發(fā)生時(shí)自動(dòng)執(zhí)行。SQLite觸發(fā)器支持的觸發(fā)操作有:DELETE(刪除)、INSERT(插入) 和 UPDATE(更新),即SQLite支持在數(shù)據(jù)庫(kù)表發(fā)生刪除、插入和更新操作之前或之后,觸發(fā)事先定義的操作。

利用SQLite實(shí)現(xiàn)數(shù)據(jù)自檢和處理的一般方法為:為數(shù)據(jù)庫(kù)表創(chuàng)建一個(gè)UPDATE觸發(fā)器,通過(guò)SELECT語(yǔ)句和WHERE語(yǔ)句結(jié)合使用,實(shí)現(xiàn)對(duì)數(shù)據(jù)表的自檢和處理。這樣,當(dāng)數(shù)據(jù)更新后,觸發(fā)器通過(guò)WHERE子句定位到更新的數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行判斷,如果監(jiān)測(cè)到異常,然后通過(guò)SELECT語(yǔ)句調(diào)用SYS_EXEC內(nèi)置函數(shù)執(zhí)行指定的外部程序,從而實(shí)現(xiàn)SQLite對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的自檢和處理。

5 結(jié)束語(yǔ)

本文提出使用SQLite數(shù)據(jù)庫(kù)對(duì)監(jiān)控系統(tǒng)的數(shù)據(jù)進(jìn)行檢測(cè)和處理。相比編程的方法,該方法利用了數(shù)據(jù)庫(kù)檢測(cè)異常數(shù)據(jù)并調(diào)用相關(guān)程序進(jìn)行處理,可以完成很繁重的任務(wù),而不必編寫(xiě)繁雜的算法。

參考文獻(xiàn):

[1] 蔡勇,王勇. 嵌入式數(shù)據(jù)庫(kù)SQLite在測(cè)控系統(tǒng)設(shè)計(jì)中的應(yīng)用[J]. 電子測(cè)試,2011(10):89-93.

[2] 韓善鋒,曹鳳海,易昌華. SQLite數(shù)據(jù)庫(kù)在嵌入式程序開(kāi)發(fā)中的應(yīng)用[J]. 物探裝備,2011(3):170173+178.

[3] 梁永恩,萬(wàn)世明,翟敏換. SQLite數(shù)據(jù)庫(kù)在嵌入式系統(tǒng)中的應(yīng)用研究[J]. 現(xiàn)代計(jì)算機(jī)(專版),2015(10):60-62.

[4] 黨玉春,翟秀云,陳明通. SQLite系統(tǒng)構(gòu)架及虛擬機(jī)分析[J]. 微型機(jī)與應(yīng)用,2012(10):67-70.

[5] 張海平. C/C++語(yǔ)言中函數(shù)指針的深入分析與應(yīng)用[J]. 電腦編程技巧與維護(hù),2009(22):17-18.

[6] 楊洋. SQLite數(shù)據(jù)庫(kù)在嵌入式系統(tǒng)中的應(yīng)用實(shí)踐[J]. 柳鋼科技,2013(5):41-43.

猜你喜歡
監(jiān)控系統(tǒng)嵌入式數(shù)據(jù)庫(kù)
搭建基于Qt的嵌入式開(kāi)發(fā)平臺(tái)
數(shù)據(jù)庫(kù)
嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
無(wú)線廣播電視安全優(yōu)質(zhì)播出的技術(shù)分析
中央電視臺(tái)高端島3后期制作網(wǎng)絡(luò)監(jiān)控系統(tǒng)的實(shí)現(xiàn)
演藝科技(2016年4期)2016-11-16 08:18:32
縣級(jí)區(qū)域雨量站觀測(cè)設(shè)備監(jiān)控系統(tǒng)的研究與設(shè)計(jì)
科技視界(2016年18期)2016-11-03 23:18:30
基于Zigbee技術(shù)的煤礦井下通風(fēng)機(jī)監(jiān)控系統(tǒng)設(shè)計(jì)
科技視界(2016年20期)2016-09-29 11:41:51
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
山西省| 商南县| 克东县| 富阳市| 浑源县| 南部县| 民权县| 宁陵县| 定陶县| 抚顺市| 宁强县| 淮阳县| 离岛区| 远安县| 正宁县| 平阴县| 鄱阳县| 洛扎县| 德化县| 通城县| 竹溪县| 剑阁县| 湛江市| 江川县| 屏东市| 思茅市| 郸城县| 克山县| 大名县| 灵武市| 昌平区| 临高县| 惠安县| 土默特左旗| 岫岩| 辽源市| 丹江口市| 六盘水市| 陈巴尔虎旗| 青冈县| 乌审旗|