武寧寧,鮑玉琦
(1.青島理工大學臨沂校區(qū) 山東 臨沂 273400;2.江蘇科技大學 江蘇 鎮(zhèn)江 212003)
溫濕度是工業(yè)現場最常見的監(jiān)測參數。在許多場合,溫濕度是重要的監(jiān)測參數和故障判斷的首要依據,因此,溫濕度的實時存儲具有十分重要的實用價值。
溫濕度的實時存儲很早就受到工程師們的重視,最早的溫濕度實時存儲是通過數據的遠傳,存儲在電腦上,現場的溫濕度傳感器只是負責數據的采集,數據的實時存儲和管理完全是由上層的PC機來完成。后來,現場的傳感器不斷升級換代,逐漸具有了實時存儲的功能,但是那是的存儲器空間比較小,只能存儲十分有限的數據。
近年來,隨著存儲器和嵌入式技術的飛速發(fā)展,現在的存儲器可以存儲大量的數據,甚至有的存儲器可以保持數年的不斷存儲[1],而且嵌入式技術可以有效的管理這部分存儲數據,從而實現數據的科學存儲和管理。
文中重點介紹了基于SQLite數據庫的溫濕度實時存儲系統(tǒng),該系統(tǒng)充分利用SQLite數據庫的優(yōu)點和嵌入式系統(tǒng)的管理功能,實現了溫濕度的實時存儲和科學管理。
SQLITE數據庫采用的是模塊化的設計,主要有內核、SQL處理器、后端和附件4部分組成[2],其體系結構如圖1所示。
圖1 SQLITE的體系結構Fig.1 The architecture of SQLite
1)接口(Interface)。SQLite的接口是一些已經編寫好的C庫,雖然使用不同語言的API,但在底層仍然使用C庫執(zhí)行。
2)編譯器(SQL Compiler)。 SQL語句通過接口后進入SQL編譯器,SQL處理器主要有標志處理器、分析器和代碼生成器3個部分組成。接口程序接收字符串之后,首先將其傳給標志處理器,標志處理器的主要任務是把這些字符串分成一個個標識符,把這些標識符傳給分析器。然后分析器在收集完標識符,把它轉換成完整的SQL語句,并且調用代碼生成器來產生虛擬的機器代碼,其中這些機器代碼是按照SQL語句的要求來工作。最后代碼生成器產生的程序送給虛擬機器來運行。
3)虛擬機(VirtualMachine)。虛擬機是 SQLITE數據庫體系結構中十分核心的部分,它位于SQLITE數據庫后端的上一層,通常被稱之為虛擬數據庫引擎。它不僅會完成與數據相關的全部操作,而且還是客戶和存儲信息之間進行信息交換的中間單元。操作具體過程是用戶發(fā)出SQL語句請求,先由前端編譯器處理,生產專門的字節(jié)代碼程序,其中這些字節(jié)代碼程序可以執(zhí)行查詢、讀取和修改數據庫等操作,然后由VM解釋執(zhí)行,通常會調用B-tree模塊相關的接口,最后輸出執(zhí)行結果。
4)后端(Backend)。后端的第一層是 B-tree,SQLITE 數據庫中的每個目錄和表格都是使用一個單獨的 B-tree,并且所有的 B-tree都被儲存在同一個磁盤文件里。因此可以通過可調整的頁面緩沖獲得對數據的快速查找和存儲。
SQLITE數據庫獨特的體系結構,使得它具有更好的實時性,并且系統(tǒng)開銷小,底層控制能力很強,能夠高效的利用系統(tǒng)有限資源,可大大提高數據庫的存取速度,增強系統(tǒng)的安全性[3-8]。
本系統(tǒng)是將嵌入式SQLITE數據庫應用到S3C2440+Linux環(huán)境中,首先下載 sqlite-3.5.6.tar.gz,然后在在宿主機的交叉編譯環(huán)境下,編譯生成SQLITE的可執(zhí)行文件,最后將其下載到ARM板的相關目錄下。移植SQLITE的主要步驟如下:
1)解壓sqlite-3.5.6.tar.gz工具包,命令為 tar-zxvf sqlite-3.5.6.tar.gz。
2)解壓完成之后進入sqlite-3.5.6目錄下新建一個文件夾build。
3)進入build文件夾,執(zhí)行./configure--host=arm-linuxprefix=/opt/sqlite-3.5.6/build,其中host是指定進行編譯的交叉編譯器,prefix是編譯后目標存放的路徑。
4)執(zhí)行 make和 make install命令,在新建的 build目錄下生成 bin、lib、include、share 4 個文件夾。
5)將build/bin目錄下的文件拷貝到ARM板的/usr/bin中,將build/lib目錄下的文件拷貝到ARM板的lib文件夾下。
6)修改ARM板/usr/bin/sqlite3的權限,命令為chmod 755 sqlite3。
完成上述6步后,可以在ARM板的終端輸入:sqlite3 test.db來驗證SQLITE數據庫是否移植成功。如果SQLITE數據庫成功移植,將在終端出現圖2所示的畫面。
圖2 SQLITE數據庫成功移植畫面Fig.2 The successful transplanted picture of SQLITE database
SQLITE數據庫提供了許多C語言的API接口,這些接口使得對數據庫的操作變得十分的方便。下面主要介紹SQLITE常用的API函數。
1)打開數據庫:
int sqlite3_open(
const char*filename, //filename是數據庫的文件名
sqlite3**db //輸出SQLITE數據庫的句柄
);
2)運行SQL函數:
int sqlite3_exec(
sqlite3*, //打開的數據庫句柄
const char**sql, //要執(zhí)行的 SQL語句
sqlite3_callback, //回調函數
void*, //回調函數的第一個參數
char**errmsg //返回錯誤信息
);
3)查詢數據:
int sqlite3_get_table(
sqlite3*, //打開的數據庫句柄
const char*sql, //要執(zhí)行的 SQL 語句
char***result,
int*nrow,int*ncolumn, //返回結果的行數和列數
char**errmsg //返回錯誤信息
);
4)關閉數據庫:
int sqlite3_close(sqlite3*);
溫濕度存儲程序主要是對采集的溫、濕度數據進行實時存儲,在存儲程序的設計過程中要考慮上層用戶的方便查看,下面將對溫濕度存儲程序設計過程中數據庫的創(chuàng)建、帶有系統(tǒng)時間的表的創(chuàng)建和SQLITE數據庫動態(tài)數據的插入3個方面進行詳細介紹。
1)創(chuàng)建數據庫。數據庫的創(chuàng)建可以在程序中完成,也可以在終端上直接輸入相關的命令來完成,這里采用后一種方法,直接在終端輸入:mkdir/sbin/dht11.db命令來創(chuàng)建數據庫。
2)創(chuàng)建帶有系統(tǒng)時間的表。創(chuàng)建的表帶有時間信息可以方便后續(xù)的查看和管理,而且從某種程度上說,采集的溫、濕度數據只有與采集時間結合起來才有意義。同樣,創(chuàng)建表也有兩種方式,這里我們也是采用在終端輸入命令的方式來創(chuàng)建表,具體命令如下:
Create table dht11 (timestamp not null default(datetime(‘now’,‘localtime’)),ID integer,humidity integer,temperature integer);
上述命令的功能是創(chuàng)建一個帶有當地時間、序列號、濕度、溫度4個參數的表。
3)數據庫動態(tài)數據插入。溫濕度存儲程序是實現對不斷更新變化的數據進行實時存儲,這里是通過下面的sqlite3_mprintf()函數來實現的。
sqlite3_mprintf (“insert into dht11 (ID,humidity,temperature) values (‘%d’, ‘%d’, ‘%d’)”,m,result1,result2);
上述程序語句中,m表示一個自增的變量,result1代表緩存區(qū)的濕度變量,result2代表緩存區(qū)的溫度變量。
圖3 溫濕度存儲程序流程圖Fig.3 Flow diagram of temperature and humidity storage program
上面介紹了溫濕度程序中建立系統(tǒng)時間和插入動態(tài)數據的實現方式,下面將對整個程序的結構進行分析。其中圖3是溫濕度存儲程序的流程圖。
從上面的流程圖可以看出,整個程序主要包括3個部分:打開設備、打開數據庫、插入動態(tài)數據。實現這3個部分功能的程序如下:
intmain(void)
{
int fd ,m;
m=0;
int retval;
char buf[5];
fd=open ( “/dev/dht11”, O_RDONLY); //以只讀方式打開設備
if(fd==-1)
{
perror("open dht11 error "); //打開失敗
exit(-1);
}
printf( “open/dev/dht11 successfully ” ) ;
while(1)
{
sleep(1);
retval=read(fd,buf,5);
if(retval==-1)
{
perror ( “read dht11 error” ) ;
printf( “read dht11 error” ) ;
exit(-1);
}
char*errmsg;
int ret,result,result1,result2,m;
m++;
result1=buf[0];
result2=buf[2];
sqlite3*db=NULL;
result=sqlite3_open(“/sbin/dht11.db”,&db); //打開數據庫
if(result!=SQLITE_OK)
{
fprintf(stderr,“Could notopen database:%s ”,errmsg);
sqlite3_close(db); //關閉數據庫
exit(1);
}
printf(“open databases successfully ”);
char*value=sqlite3_mprintf (“insert into dht11 (ID,humidity,temperature)value( ‘%d’,‘%d’,‘%d’)”,m,result1,result2); //插入動態(tài)溫、濕度數據
ret=sqlite3_exec(db,value,0,0,&errmsg);
if(ret!=SQLITE_OK)
{
fprintf(stderr,"SQL error:%s ",errmsg);
sqlite3_close(db); //關閉數據庫
exit(1);
}
printf (“insert into dht11 successfully ”); //數據成功插入數據庫
sqlite3_close(db);
sleep(10); //延時 10 s
}
close(fd); //關閉設備
}
將上述程序編寫完成后,保存為time_sqlite3.c,然后利用交叉編譯工具對其進行編譯。具體命令如下:
[root@localhost home]# arm-linux-gcc -I?/opt/build/include-L/opt/build/lib-o time_sqlite3 time_sqlite3.c-lsqlite3其中參數-I?/opt/build/include表示頭文件,參數-L/opt/build/lib表示編譯鏈接庫,編譯完成后,會在home目錄下生成time_sqlite3二進制文件。
將該文件下載到開發(fā)板的相關目錄下,并將其權限修改為可執(zhí)行文件,然后在終端輸入./time_sqlite3,將出現圖4所示的畫面。
圖4 溫濕度存儲程序執(zhí)行畫面Fig.4 Implementalpictureof temperature and humidity storage program
從上面圖4可知,溫濕度采集數據被成功的插入的數據庫中,經過多次重復實驗,程序未出現“跑飛”現象,說明編寫的溫濕度存儲程序可以完成對采集數據的實時存儲。
文中首先介紹了SQLite3數據庫的體系結構,然后介紹了在嵌入式系統(tǒng)下構建SQLite數據開發(fā)平臺,最后設計了溫濕度實時存儲的程序,并進行了試驗驗證。從試驗的結果可以看出,設計的溫濕度實時存儲程序能夠滿足實時性的要求,并且能夠長時間的穩(wěn)定工作。
[1]趙彩云.內存數據庫性能分析及優(yōu)化[D].天津:南開大學,2008.
[2]楊柳,龐和明,姜琳穎,等.嵌入式Linux及SQLite數據庫在智能監(jiān)控中的應用研究[J].微計算機信息,2010,26(12):65-67.YANG Liu,PANG He-wei,JIANG Lin-ying,et al.Application research of embedded Linux and SQLite database in the intelligentmonitoring system[J].Micro computer information,2010,26(12):65-67.
[3]謝輝.嵌入式數據庫的設計與實現[D].太原:太原科技大學,2008.
[4]張媛媛.嵌入式數據庫管理系統(tǒng)的研究與實現 [D].上海:華東師范大學,2007.
[5]陸堅毅.網絡應用監(jiān)控系統(tǒng)設計與實現[D].武漢:華中科技大學,2012.
[6]解輝,徐玉斌,李建偉,等.基于SQLite的嵌入式數據采集系統(tǒng)的研究[J].計算機與數字工程,2008(6):91-94.XIE Hui,XU Yu-bin,LI Jian-wei,et al.The research of embedded data acquisition system based on SQLite[J].Computer and Digital Engineering,2008(6):91-94.
[7]高凱武,任傳勝.基于嵌入式linux網頁服務器的大壩安全監(jiān)測數據采集[J].工業(yè)儀表與自動化裝置,2013(6):95-98.GAO Kai-wu,REN Chuan-sheng.Dam safetymonitoring data collected based on embedded linux web server[J].Industrial Instrumentation&Automation,2013(6):95-98.
[8]趙俊生.嵌入式Linux系統(tǒng)及其構造[J].工業(yè)儀表與自動化裝置,2013(3):16-19.ZHAO Jun-sheng.The embedded Linux system and its structure[J].Industrial Instrumentation&Automation,2013(3):16-19.