《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 嵌入式數(shù)據(jù)庫SQLite在電梯B/S監(jiān)控中的應(yīng)用

嵌入式數(shù)據(jù)庫SQLite在電梯B/S監(jiān)控中的應(yīng)用

2008-05-29
作者:陳 新,高鳳梅,曹玲芝,石 軍,

  摘 要: 提出了在電梯嵌入式監(jiān)控中使用SQLite數(shù)據(jù)庫的方案。在介紹SQLite的特點(diǎn)及監(jiān)控方案整體結(jié)構(gòu)的基礎(chǔ)上,以電梯B/S" title="B/S">B/S監(jiān)控CGI程序訪問數(shù)據(jù)庫為例,著重介紹了SQLite的用法,最后介紹了基于三星2410的監(jiān)控終端硬件平臺(tái)。
  關(guān)鍵詞: 嵌入式數(shù)據(jù)庫" title="嵌入式數(shù)據(jù)庫">嵌入式數(shù)據(jù)庫 SQLite B/S監(jiān)控 S3C2410


  基于嵌入式的B/S監(jiān)控方案由于其成本低、體積小、使用方便,越來越受到工程技術(shù)人員的關(guān)注。與此同時(shí),在設(shè)備的嵌入式" title="的嵌入式">的嵌入式B/S遠(yuǎn)程監(jiān)控" title="遠(yuǎn)程監(jiān)控">遠(yuǎn)程監(jiān)控、故障診斷中需交換的數(shù)據(jù)越來越多,對(duì)數(shù)據(jù)庫的要求越來越高。傳統(tǒng)的桌面數(shù)據(jù)庫建立的開發(fā)模型是數(shù)據(jù)庫控制應(yīng)用程序,需要專門的管理和配置,使用復(fù)雜、體積大、不便于移植。因此,對(duì)適合嵌入式的數(shù)據(jù)庫的研究已成為數(shù)據(jù)庫領(lǐng)域一個(gè)新的研究方向。
  在小區(qū)或樓宇的電梯監(jiān)控中,大多是基于PC機(jī)的C/S或B/S監(jiān)控。一種是利用CAN總線或電話網(wǎng)絡(luò)接入PC機(jī),采用電梯監(jiān)控采集卡向下通過CAN總線與電梯通信,向上通過RS232接口接入PC機(jī)。一種是采用以太網(wǎng)的SOCKET方式,由PC機(jī)實(shí)現(xiàn)B/S或C/S監(jiān)控。這些方案運(yùn)用傳統(tǒng)的桌面數(shù)據(jù)庫來實(shí)現(xiàn)基于PC機(jī)的C/S或B/S監(jiān)控,功能相對(duì)強(qiáng)大,但成本較高。在智能下移、以太網(wǎng)應(yīng)用到設(shè)備層的趨勢下,研究嵌入式數(shù)據(jù)庫在電梯B/S監(jiān)控中的應(yīng)用是非常有意義的。
1 SQLite數(shù)據(jù)庫簡介
  SQLite是由D.Richard Hipp于2000年編寫的執(zhí)行自容納、可嵌入、零配置數(shù)據(jù)庫引擎的小型C庫。它支持多數(shù)SQL92標(biāo)準(zhǔn),可以在所有主要的操作系統(tǒng)上運(yùn)行,并且支持大多數(shù)計(jì)算機(jī)語言。其作為PHP V4.3中的一個(gè)選項(xiàng)引入,已構(gòu)建在PHP V5中,比MySQL快2倍以上,且完全開放。SQLite雖然比Berkeley DB功能稍弱,但是Berkeley DB不支持SQL,體積比SQLite大,在某些商業(yè)應(yīng)用上不是免費(fèi)的,況且在開源社區(qū)的推動(dòng)下SQLite的功能在增強(qiáng),因此SQLite正在成為受歡迎的開源數(shù)據(jù)庫之一。
  嵌入式數(shù)據(jù)庫來自于其嵌入式運(yùn)行模式,它使用精簡代碼編寫,零配置,直接在應(yīng)用程序進(jìn)程中運(yùn)行,并且占用資源非常少。嵌入式數(shù)據(jù)庫系統(tǒng)沒有管理員,具有自調(diào)節(jié)和自適應(yīng)能力,能夠“無處不在”。SQLite是一個(gè)非常適合嵌入式應(yīng)用的數(shù)據(jù)庫,這可以從其設(shè)計(jì)的目的和獨(dú)特的特點(diǎn)看出。SQLite設(shè)計(jì)的主要目的是簡單:簡單的管理、簡單的操作、簡單地嵌入、簡單的維護(hù)。SQLite的特征如下:
  (1)零配置。SQLite在使用前不需要安裝設(shè)置,不需要進(jìn)程來啟動(dòng)、停止或配置,不需要管理員去創(chuàng)建新數(shù)據(jù)庫或分配用戶權(quán)限,在系統(tǒng)崩潰或失電之后自動(dòng)恢復(fù)。
  (2)無服務(wù)器。大多數(shù)SQL數(shù)據(jù)庫引擎是作為一個(gè)單獨(dú)的服務(wù)器進(jìn)程被執(zhí)行。訪問數(shù)據(jù)庫的程序使用某種內(nèi)部進(jìn)程通信(典型的是TCP/IP)與服務(wù)器通信,完成發(fā)送請(qǐng)求到服務(wù)器和接收查詢結(jié)果的工作。SQLite不采用這種工作方式。使用SQLite時(shí),訪問數(shù)據(jù)庫的程序直接從磁盤上的數(shù)據(jù)庫文件讀寫,沒有中間的服務(wù)器進(jìn)程。
  (3)精簡性。當(dāng)尺寸優(yōu)化后,在不減少功能的情況下,整個(gè)SQLite庫小于225KB。如果在編譯時(shí)去掉一些不需要的特性,庫的大小能被減小到170KB。IBM最新發(fā)行的CloudScape數(shù)據(jù)庫引擎是2MB的罐文件,壓縮后仍比SQLite大10倍;Firefox宣稱其客戶訂制的庫只有350KB,但是不包括數(shù)據(jù)庫引擎;來自Sleepycat的Berkeley DB庫是450KB,并且刪去了SQL支持。通過比較可知:SQLite非常小。
  (4)簡單的訪問。一個(gè)SQLite數(shù)據(jù)庫是一個(gè)單獨(dú)的普通磁盤文件,能夠被定位在路徑層次的任何地方。如果SQLite能讀寫磁盤文件,則它也能訪問數(shù)據(jù)庫。大多數(shù)SQL數(shù)據(jù)庫引擎趨向于把數(shù)據(jù)存為一個(gè)大的文件集合,通常這些文件在一個(gè)標(biāo)準(zhǔn)的定位中,只有數(shù)據(jù)庫引擎本身能訪問它。
  (5)可變長度的記錄。一般的SQL數(shù)據(jù)庫引擎在表中為每一個(gè)記錄分配一個(gè)固定的磁盤空間數(shù),SQLite只使用一個(gè)記錄中實(shí)際存儲(chǔ)信息的磁盤空間數(shù)。顯然,這會(huì)使數(shù)據(jù)庫非常小,同時(shí),由于在磁盤上移動(dòng)的信息很少,也使數(shù)據(jù)庫很快。
  SQLite不僅小、快,而且簡單、可靠,這是它受歡迎的主要原因。對(duì)于嵌入式場合,管理、執(zhí)行、維護(hù)的簡單化比企業(yè)數(shù)據(jù)庫引擎提供的許多復(fù)雜應(yīng)用更重要,因此SQLite數(shù)據(jù)庫是一個(gè)很好的選擇。
2 電梯嵌入式B/S監(jiān)控系統(tǒng)" title="監(jiān)控系統(tǒng)">監(jiān)控系統(tǒng)的整體結(jié)構(gòu)
  本監(jiān)控系統(tǒng)分為兩層:嵌入式終端、遠(yuǎn)方樓宇中心或電梯公司的監(jiān)測中心。監(jiān)控軟件的主要功能是:與電梯通信接口通信,采集電梯運(yùn)行狀態(tài)和故障數(shù)據(jù)并存入數(shù)據(jù)庫;對(duì)故障報(bào)警優(yōu)先處理,自動(dòng)發(fā)短信至維保人員手機(jī),并將現(xiàn)場數(shù)據(jù)實(shí)時(shí)存入數(shù)據(jù)庫,以便進(jìn)一步故障分析和統(tǒng)計(jì)。數(shù)據(jù)庫成為連接前后臺(tái)的中間件,存儲(chǔ)狀態(tài)數(shù)據(jù)供B/S遠(yuǎn)程監(jiān)控和本地LCD顯示,同時(shí)接收瀏覽器和本地鍵盤輸入,由通信程序、CGI程序完成控制命令的下傳及運(yùn)行狀態(tài)的上傳;同時(shí)數(shù)據(jù)庫還實(shí)現(xiàn)故障的分析統(tǒng)計(jì)和查詢。軟件程序主要分為四個(gè)模塊:與電梯接口的CAN/RS485通信程序,GPRS故障報(bào)警程序,本地的人機(jī)交互程序,遠(yuǎn)程B/S監(jiān)控程序。
3 嵌入式數(shù)據(jù)庫SQLite的應(yīng)用
3.1 SQLite的C語言API函數(shù)

  嵌入式數(shù)據(jù)庫SQLite的C語言API以下面三個(gè)核心函數(shù)為基礎(chǔ):
  sqlite*sqlite_open(const char*dbname,int mode,char**errmsg);
  void sqlite_close(sqlite*db);
  int sqlite_exec(sqlite*db,char*sql,int(*Callback)(void*,int,char**,char**),void*parg,char**errmsg);
  其中,前兩個(gè)函數(shù)用于打開與關(guān)閉數(shù)據(jù)庫,sqlite_exec函數(shù)用來處理SQL查詢,它含有五個(gè)參數(shù):
  (1)調(diào)用sqlite_open函數(shù)獲得的數(shù)據(jù)庫結(jié)構(gòu)的指針。
  (2)容納了一個(gè)或更多SQL語句的字符串。
  (3)指向Callback函數(shù)的指針,查詢結(jié)果的每一條記錄都調(diào)用該函數(shù)。
  (4)成為Callback函數(shù)第一個(gè)參數(shù)的指針。
  (5)指向錯(cuò)誤串的指針。
  其中,Callback函數(shù)由用戶編寫,用來接收查詢結(jié)果,查詢結(jié)果的每一條記錄都會(huì)調(diào)用Callback函數(shù)一次,其原型為:
  int Callback(void*pArg,int argc,char**argv,char**
  columnNames)
  {return 0;
  }
  其中,第一個(gè)參數(shù)接收客戶代碼的任意信息;第二個(gè)參數(shù)是字段數(shù);第三個(gè)參數(shù)是一個(gè)字符串?dāng)?shù)組,每一個(gè)串是記錄的一個(gè)字段值;第四個(gè)參數(shù)是字段名。Callback函數(shù)是用戶根據(jù)應(yīng)用編寫的,正常應(yīng)返回0。如果Callback函數(shù)非0,則查詢失敗。
  此外,一些擴(kuò)展的API提供了有用的接口函數(shù)。這里著重介紹sqlite_exec_printf( )。
  int sqlite_exec_printf(sqlite*,char*sql,int(*)(void*,
  int,char**,char**),void*,char**errmsg,……);
  它與sqlite_exe一樣執(zhí)行同樣的查詢功能,但采用printf-style格式的字符串代替完整的SQL語句。作為第二個(gè)參數(shù),這個(gè)格式串產(chǎn)生SQL語句,并且在函數(shù)結(jié)尾可以綁定任意參數(shù)。使用sqlite_exec_printf函數(shù)的好處是:(1)sqlite_exec_printf為了容納產(chǎn)生的SQL語句,通常會(huì)分配足夠的緩存,因此不會(huì)產(chǎn)生靜態(tài)緩存溢出的危險(xiǎn);(2)擴(kuò)展了%Q和%q兩個(gè)新格式以支持SQL中的串值。
3.2 SQLite在電梯監(jiān)控中的應(yīng)用
  在電梯的B/S監(jiān)控中,電梯的運(yùn)行狀態(tài)需要在瀏覽器端實(shí)時(shí)顯示,實(shí)時(shí)記錄故障信息,并能統(tǒng)計(jì)查詢,同時(shí)通過客戶瀏覽器進(jìn)行一些控制和參數(shù)設(shè)置。因此對(duì)數(shù)據(jù)庫的訪問有上端的以太網(wǎng)通信程序和下端的CAN/RS485通信程序。這里著重討論以太網(wǎng)通信程序。下面以電梯故障查詢中CGI程序訪問數(shù)據(jù)庫為例說明SQLite數(shù)據(jù)庫Callback函數(shù)、API函數(shù)的用法。Callback函數(shù)編寫如下:
  int fault_dis(void*p_data,int fields_count,char**
  p_fields,char**p_columnN)
  {
  int *p=malloc(sizeof(int));
  p=(int*)p_data;(*p)++;
  printf(″<tr>n″);
  printf(″<td><div align=″center″><span class=″style7″> %s </span></div></td>n″,p_fields[0]);
  printf(″<td class=″style7″><div align=″center″>%s</div></td>n″,p_fields[1]);
  printf(″<td height=″58″><div align=″center″ class=″style7″>%s</div></td>n″,p_fields[2]);
  printf(″<td><div align=″center″class=″style7″>%s</div></td>n″,p_fields[3]);
  printf(″<td><div align=″center″class=″style7″>%s</div></td>n″,p_fields[4]);
  printf(″</tr>n″);
  return 0;
  }
  C語言編制的CGI程序中用SQLite的API函數(shù)調(diào)用Callback函數(shù)的關(guān)鍵語句為:
  int*precs=malloc(sizeof(int));
  char**errmsg=malloc(100);
  char*q0=malloc(10);
  ……
  sqlite*p_elevator=sqlite_open(″e(cuò)levator″,777,0);
  /*打開數(shù)據(jù)庫*/
  sqlite_exec_printf(p_elevator,″select*from faultinfo where 電梯號(hào)=′%s′;″,fault_dis,precs,errmsg,q0);
  /*調(diào)用Callback函數(shù)fault_dis,*/
  ……
  sqlite_close(p_elevator)/*關(guān)閉數(shù)據(jù)庫*/
  free(precs);
  free(errmsg);
  free(q0);
4 運(yùn)行測試
  本監(jiān)控終端的硬件核心板采用華恒公司的HHARM2410-K1,包括CPU模塊、Flash、SDRAM存儲(chǔ)部分。底板主要包括LCD及鍵盤、CAN/RS485通信模塊、以太網(wǎng)控制芯片、GPRS模塊等。核心板CPU采用三星公司2410芯片。2410芯片基于ARM920T內(nèi)核,ARM920T核由ARM9TDMI、存儲(chǔ)管理單元MMU和高速緩存三部分組成,運(yùn)行頻率可達(dá)203MHz。MMU管理虛擬內(nèi)存,實(shí)現(xiàn)虛擬地址物理地址的轉(zhuǎn)換。與μCLinux相比, 在ARM-Linux下可簡單地開發(fā)更強(qiáng)大的嵌入式程序。CAN總線通信芯片采用Microchip公司的MCP2510。它支持CAN2.0A、CAN2.0B兩種模式,與CAN總線通信能力更強(qiáng)。與國內(nèi)常用的SJA1000相比,MCP2510數(shù)據(jù)吞吐率高,使用簡單。
  從www.sqlite.org下載源代碼包,本文選擇sqlite-2.8.16并移植到ARM平臺(tái)。移植時(shí)采用armv4l-unknown-linux編譯工具。移植時(shí),在環(huán)境變量中要加入工具鏈的路徑,否則,即使Makefile文件指定絕對(duì)路徑,make時(shí)也會(huì)報(bào)錯(cuò)。若采用靜態(tài)鏈接,strip過的庫,也可以使一個(gè)CGI程序達(dá)600KB,而采用動(dòng)態(tài)鏈接只有十幾KB。為了使CGI程序不太大,采用了動(dòng)態(tài)鏈接。Web Server選用boa,它支持認(rèn)證及CGI,源碼開放易于移植,適合嵌入式應(yīng)用。用CGI應(yīng)用程序制作ramdisks映像,通過tftp下載燒寫到板子上,設(shè)置目標(biāo)板的靜態(tài)IP為202.196.9.16,在宿主機(jī)上通過瀏覽器訪問目標(biāo)板,CGI程序能正常訪問數(shù)據(jù)庫,監(jiān)控界面運(yùn)行正常。調(diào)試時(shí)要注意幾個(gè)問題:(1)庫要燒寫到板子上,否則即使調(diào)試好的程序在用nfs調(diào)試時(shí),瀏覽器仍會(huì)報(bào)錯(cuò);(2)要根據(jù)boa.conf文件放置好CGI程序和HTML文件路徑;(3)調(diào)試時(shí)注意權(quán)限;(4)sqlite.so、sqlite.so.0、sqlite.so.0.8.6要放入板子/lib目錄。
  嵌入式數(shù)據(jù)庫SQLite在電梯遠(yuǎn)程監(jiān)控中的應(yīng)用,實(shí)現(xiàn)了電梯的嵌入式B/S監(jiān)控,符合監(jiān)控系統(tǒng)e網(wǎng)到底、成本低廉、界面友好、升級(jí)維護(hù)方便的趨勢,對(duì)于設(shè)備的嵌入式網(wǎng)絡(luò)化遠(yuǎn)程監(jiān)控和故障診斷具有重要的意義。同時(shí)為Web Services技術(shù)在工控領(lǐng)域的應(yīng)用奠定了基礎(chǔ)。
參考文獻(xiàn)
1 李建中.日新月異的數(shù)據(jù)庫研究領(lǐng)域——數(shù)據(jù)庫技術(shù)的回顧與展望[J].計(jì)算機(jī)應(yīng)用與軟件,2003;(11)
2 宗 群,王宇波,李愛國.CAN總線在電梯遠(yuǎn)程監(jiān)控中的應(yīng)用[J].制造業(yè)自動(dòng)化,2004;26(7)
3 周文瑜.基于網(wǎng)絡(luò)技術(shù)的電梯遠(yuǎn)程監(jiān)測系統(tǒng)——監(jiān)測中心及樓宇子系統(tǒng)軟件設(shè)計(jì).中國優(yōu)秀碩博論文全文數(shù)據(jù)庫.北京:清華大學(xué),2004
4 Edmund X..Dejesus/蘇欣.嵌入式數(shù)據(jù)庫[J].中文信息,1999;Z1:90~94

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。