鮑 婧 葉 樺 孫曉潔 厲 劍
(東南大學自動化學院,南京210096)(東南大學復雜工程系統(tǒng)測量與控制教育部重點實驗室,南京210096)
Berkeley DB在家庭能源監(jiān)控系統(tǒng)中的應用
鮑 婧 葉 樺 孫曉潔 厲 劍
(東南大學自動化學院,南京210096)(東南大學復雜工程系統(tǒng)測量與控制教育部重點實驗室,南京210096)
為了實現(xiàn)嵌入式系統(tǒng)下的數(shù)據(jù)統(tǒng)計和管理任務,同時考慮嵌入式微處理器自身的處理速度和內(nèi)存容量,引入嵌入式數(shù)據(jù)庫.嵌入式數(shù)據(jù)庫具有體積小、功能齊備、可移植性、高效穩(wěn)定的特點.以家庭能源開發(fā)系統(tǒng)中遇到的數(shù)據(jù)管理問題為例,提出一種分時統(tǒng)計的方法,移植嵌入式數(shù)據(jù)庫Berkeley DB,比較使用Berkeley DB前后系統(tǒng)的資源占用情況和響應速度.測試數(shù)據(jù)顯示:Berkeley DB的引入占用了系統(tǒng)更多的存儲資源,但為嵌入式系統(tǒng)提供了高效的數(shù)據(jù)管理性能.Berkeley DB的應用提高了系統(tǒng)響應速度,為用戶提供良好的人機交互.在設(shè)備的硬件資源允許的情況下,這種用空間換性能的做法是可取的.
嵌入式數(shù)據(jù)庫;嵌入式系統(tǒng);家庭能源監(jiān)控系統(tǒng);Berkeley DB;數(shù)據(jù)統(tǒng)計
家庭能源監(jiān)控系統(tǒng)作為一個監(jiān)控終端[1],用于家庭中對所有在線家電以及太陽能逆變器的監(jiān)控管理,有友好的操作界面.用戶可以隨時查詢在線所有家電或逆變器設(shè)備的實時和歷史用電情況,并畫出統(tǒng)計曲線.系統(tǒng)至少能保存兩年內(nèi)的數(shù)據(jù).由于是嵌入式平臺開發(fā),系統(tǒng)的處理器速度和文件系統(tǒng)存儲空間均受到限制.而系統(tǒng)除了保存大量數(shù)據(jù)外,還需要快速查詢和統(tǒng)計所有在線設(shè)備的長期用電信息,進行數(shù)據(jù)管理.若采用文件系統(tǒng)的方式,需要反復進行文件的打開、讀、寫、關(guān)閉的操作,響應慢效率低.數(shù)據(jù)獨立性差,任何對字段的擴充修改都會影響到整個應用程序.并且文件系統(tǒng)不支持文件的并發(fā)訪問.
所以,引入一個小巧、穩(wěn)定、高效的嵌入式數(shù)據(jù)庫Berkeley DB來幫助實現(xiàn)大量數(shù)據(jù)的管理功能.Berkeley DB不是基于C/S結(jié)構(gòu)的關(guān)系型數(shù)據(jù)庫,程序通過直接調(diào)用API實現(xiàn)對數(shù)據(jù)庫的所有操作.Berkeley DB作為一種嵌入式數(shù)據(jù)庫系統(tǒng)在許多方面有著獨特的優(yōu)勢[2]:首先,應用程序和數(shù)據(jù)庫管理系統(tǒng)運行在相同的進程空間中,進行數(shù)據(jù)操作時可以避免繁瑣的進程間通信;其次,Berkeley DB使用簡單的函數(shù)調(diào)用接口來完成所有的數(shù)據(jù)庫操作,而不是SQL語言,避免了對結(jié)構(gòu)化查詢語言進行解析和處理所需的開銷.
Berkeley DB由5個主要子系統(tǒng)構(gòu)成,包括:存取管理子系統(tǒng)、事物子系統(tǒng)、鎖子系統(tǒng)、內(nèi)存池管理子系統(tǒng)和日志子系統(tǒng)[3].圖1是應用程序和各子系統(tǒng)之間的調(diào)用關(guān)系.
1)存取管理子系統(tǒng)是Berkeley DB的核心組件,它為創(chuàng)建和房屋數(shù)據(jù)庫文件提供基本的支持.
2)內(nèi)存池管理子系統(tǒng)是Berkeley DB所使用的通用共享內(nèi)存緩沖區(qū),適用于靈活的機遇頁面的、帶緩沖的文件共享訪問的應用.
3)事物子系統(tǒng)提供事物管理功能,保證操作的原子性、一致性和孤立性.適用于對需要食物保證的數(shù)據(jù)進行修改的場所.
4)鎖子系統(tǒng)提供進程之間以及進程內(nèi)部的并發(fā)管理機制,為系統(tǒng)提供多用戶讀取和單用戶修改同一對象的共享控制.
5)日志子系統(tǒng)采用先寫日志的策略來支持事物子系統(tǒng)進行數(shù)據(jù)恢復,保證數(shù)據(jù)一致性.
圖1 Berkeley DB體系結(jié)構(gòu)
在Berkeley DB術(shù)語中,數(shù)據(jù)庫是記錄的集合,也就是SQL中表的概念[4].數(shù)據(jù)庫的每一條記錄由主鍵/數(shù)據(jù)(key/data)對組成.數(shù)據(jù)的內(nèi)容可以是簡單的數(shù)據(jù)類型,也可以是復雜的結(jié)構(gòu)體.DB數(shù)據(jù)訪問算法[5]有BTree算法、Hash算法、Queue算法、Recno算法等.在數(shù)據(jù)庫打開時需設(shè)定數(shù)據(jù)訪問算法.
在相同的數(shù)據(jù)庫環(huán)境下打開多個數(shù)據(jù)庫,進行任務子系統(tǒng)、鎖子系統(tǒng)、內(nèi)存池管理子系統(tǒng)的配置,能實現(xiàn)強大的數(shù)據(jù)庫管理功能.但嵌入式平臺下使用數(shù)據(jù)庫環(huán)境的管理功能會消耗CPU大量資源,導致系統(tǒng)響應緩慢,無法正常工作.所以,嵌入式平臺下的數(shù)據(jù)庫通常不使用數(shù)據(jù)庫環(huán)境.
家庭能源監(jiān)控系統(tǒng)采用三星S3C2440微處理器,配置64MB NANDFLASH和64MB SDRAM,移植Linux系統(tǒng)[6].數(shù)據(jù)庫文件存放在外設(shè)SD卡中.系統(tǒng)通過485總線與家用電器、電網(wǎng)電表以及太陽能逆變器進行數(shù)據(jù)通信,協(xié)議采用Modbus-RTU方式.
系統(tǒng)的軟件體系結(jié)構(gòu)如圖2所示.數(shù)據(jù)鏈路層主要實現(xiàn)Modbus主站的通信協(xié)議.設(shè)備抽象層為系統(tǒng)內(nèi)存劃分了一塊專用緩存空間,存放485總線上掛接的所有家電、太陽能逆變器、電網(wǎng)電表的信息抽象.這些設(shè)備共用同一個C結(jié)構(gòu)體facilitytype作為抽象數(shù)據(jù)類型.其中,結(jié)構(gòu)體中的paras長整型數(shù)組用于存放各種設(shè)備的電參數(shù),是數(shù)據(jù)庫記錄的主體內(nèi)容.
圖2 系統(tǒng)軟件體系結(jié)構(gòu)
監(jiān)控模塊和數(shù)據(jù)管理模塊是后臺應用層程序的主體部分.監(jiān)控模塊發(fā)起Modbus協(xié)議通信,輪詢每個家電、逆變器和電網(wǎng)電表,采集電參數(shù)到設(shè)備抽象層.數(shù)據(jù)管理模塊定時把設(shè)備抽象層的電參數(shù)存儲到數(shù)據(jù)庫文件.當用戶通過GUI發(fā)出統(tǒng)計用電信息的請求時,數(shù)據(jù)管理模塊查詢數(shù)據(jù)庫文件中的相關(guān)記錄,進行數(shù)據(jù)處理后交給GUI供數(shù)據(jù)顯示或繪制曲線.GUI是系統(tǒng)的圖形用戶界面,由液晶屏和觸摸屏組成,作為系統(tǒng)的人機交互界面[7].
按原始的基于文件系統(tǒng)的原始數(shù)據(jù)管理方式,若用戶要查詢家電設(shè)備當月的用電情況,需要讀取文件中一個月的所有記錄條目,進行累加、求平均、最大值等操作.若用戶要查詢當年的用電情況,則需要讀取文件中一年的記錄條目,進行計算.這樣系統(tǒng)忙于對文件的反復定位、讀取工作,使得處理器、內(nèi)存在統(tǒng)計頁面的跳轉(zhuǎn)響應時刻超負荷工作.系統(tǒng)響應遲緩.同時,統(tǒng)計當年的用電量必然包含了當月的數(shù)據(jù),統(tǒng)計內(nèi)容重復,浪費系統(tǒng)資源.
運用Berkeley DB后,通過配置數(shù)據(jù)訪問算法加速了數(shù)據(jù)庫記錄查詢.同時采用分時統(tǒng)計的做法,處理器在空閑時刻統(tǒng)計出各個單位時間內(nèi)的各種用電參數(shù)信息,存放在數(shù)據(jù)庫文件中.這樣做使得處理器的工作量化整為零.
根據(jù)上文的描述,系統(tǒng)的數(shù)據(jù)庫概念設(shè)計十分簡單.系統(tǒng)共創(chuàng)建了5個數(shù)據(jù)庫.原始數(shù)據(jù)庫(db_raw.db)存放電網(wǎng)電表、家電、太陽能逆變器的原始電參數(shù).這些參數(shù)直接來自設(shè)備抽象層中的facilitytype結(jié)構(gòu)體對所有設(shè)備的抽象.表1是原始數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu).
表1 原始數(shù)據(jù)庫(db_raw.db)數(shù)據(jù)結(jié)構(gòu)
此外,為方便數(shù)據(jù)統(tǒng)計,又設(shè)計了4個數(shù)據(jù)庫:小時統(tǒng)計數(shù)據(jù)庫(db_hour.db),天統(tǒng)計數(shù)據(jù)庫(db_day.db),周統(tǒng)計數(shù)據(jù)庫(db_week.db),月統(tǒng)計數(shù)據(jù)庫(db_month.db).分別存放電網(wǎng)電表、家電、太陽能逆變器以小時、天、周、月為單位的用電參數(shù)統(tǒng)計.表2~表5是各統(tǒng)計數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu).
表2 小時統(tǒng)計數(shù)據(jù)庫(db_hour.db)數(shù)據(jù)結(jié)構(gòu)
表3 天統(tǒng)計數(shù)據(jù)庫(db_day.db)數(shù)據(jù)結(jié)構(gòu)
表4 周統(tǒng)計數(shù)據(jù)庫(db_week.db)數(shù)據(jù)結(jié)構(gòu)
表5 月統(tǒng)計數(shù)據(jù)庫(db_month.db)數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)存儲和統(tǒng)計工作由一個獨立線程在后臺應用程序中單獨實現(xiàn).軟件流程圖見圖3.具體做法是:程序輪詢RS485總線上每個設(shè)備的電參數(shù)到硬件抽象層緩存.每5 min添加所有設(shè)備的電參數(shù)信息到原始數(shù)據(jù)庫.再根據(jù)當前時間,若是一整小時、一天、一周或者一個月剛結(jié)束,則統(tǒng)計該小時、該日、該星期或該月的信息.小時統(tǒng)計數(shù)據(jù)庫的記錄通過查詢原始數(shù)據(jù)庫產(chǎn)生;天統(tǒng)計數(shù)據(jù)庫的記錄通過查詢小時數(shù)據(jù)庫產(chǎn)生;周統(tǒng)計數(shù)據(jù)庫和月統(tǒng)計數(shù)據(jù)庫的記錄通過查詢天統(tǒng)計數(shù)據(jù)庫產(chǎn)生.
每次對數(shù)據(jù)庫的操作都需要先創(chuàng)建一個DB句柄,再用句柄的DB->open()函數(shù)打開數(shù)據(jù)庫.然后進行數(shù)據(jù)庫的插入、查詢、刪除記錄等操作.最后關(guān)閉數(shù)據(jù)庫.現(xiàn)將用到的數(shù)據(jù)庫基本操作列舉如下:
1)創(chuàng)建數(shù)據(jù)庫句柄:ret=db_create(&energy_dbs.db_raw,NULL,0);
2)打開數(shù)據(jù)庫:ret=energy_dbs.db_raw->open(energy_dbs.db_raw, //DB pointer
3)查詢記錄:ret=energy_dbs.db_raw - > get(energy_dbs.db_raw,NULL,& key,& data,0);
4)添加記錄:ret=energy_dbs.db_raw - > put(energy_dbs.db_raw,NULL,& key,& data,0);
5)關(guān)閉數(shù)據(jù)庫:ret=energy_dbs.db_raw - > close(energy_dbs.db_raw,0);
6)數(shù)據(jù)庫同步:ret=energy_dbs.db_raw->sync(energy_dbs.db_raw,0);sync()函數(shù)用來把緩存中的數(shù)據(jù)庫數(shù)據(jù)寫到flash文件上,以防止系統(tǒng)突然掉電.數(shù)據(jù)庫調(diào)用close()函數(shù)時會首先自動調(diào)用sync()函數(shù)同步數(shù)據(jù)庫.
圖3 數(shù)據(jù)存儲統(tǒng)計流程圖
以小時統(tǒng)計數(shù)據(jù)庫為例,查詢某設(shè)備在原始數(shù)據(jù)庫中2009年12月10日10時0分到2009年12月10日10時59分的用電參數(shù),統(tǒng)計2009年12月10日10時的電參數(shù),寫入小時統(tǒng)計數(shù)據(jù)庫.用Berkeley DB光標實現(xiàn)數(shù)據(jù)庫的快速搜索,pcursor->get()函數(shù)的標識DB_SET_RANGE用于搜索主鍵大于等于某設(shè)定值的記錄.
GUI需要查詢2009年12月10日10時的統(tǒng)計結(jié)果時,通過讀取小時統(tǒng)計數(shù)據(jù)庫文件的形式直接獲得結(jié)果.文件讀取語句只有 1 條:ret=energy_dbs.db_hour- > get(energy_dbs.db_hour,NULL,&key,&data,0).
Berkeley DB比文件系統(tǒng)記錄方式要增加很多資源開銷.現(xiàn)就從應用程序大小、有無靜態(tài)鏈接庫、數(shù)據(jù)庫文件大小3方面,比較使用Berkeley DB和文件系統(tǒng)2種方式的資源占用情況,見表6.以下數(shù)據(jù)與家庭能源監(jiān)控系統(tǒng)的實現(xiàn)功能相關(guān),也與程序員的代碼質(zhì)量相關(guān).
表6 Berkeley DB與文件系統(tǒng)方式下的資源對比
實驗測試了連續(xù)添加10 000條記錄,耗時13.4 s.查詢一條記錄耗時0.8 ms;連續(xù)查詢500條記錄耗時0.55 s.測試用戶點擊進入GUI的統(tǒng)計頁面時,背景頁面跳轉(zhuǎn)響應時間 <0.1 s,統(tǒng)計圖表繪制時間<0.4 s.文件系統(tǒng)方式下,用戶點擊進入統(tǒng)計頁面,頁面背景跳轉(zhuǎn)響應時間 <0.1 s,統(tǒng)計圖表繪制時間<1 s,肉眼可以明顯看到統(tǒng)計圖表在頁面打開后經(jīng)短暫延時才顯示在畫面上.統(tǒng)計頁面效果如圖4所示.
由以上數(shù)據(jù)可以看出,Berkeley DB的引入占用了系統(tǒng)更多的flash資源.但Berkeley DB為嵌入式系統(tǒng)提供了高效的數(shù)據(jù)管理性能.在設(shè)備的硬件資源允許的情況下,這種用空間換性能的做法是可取的.
圖4 家庭能源監(jiān)控系統(tǒng)統(tǒng)計頁面
本文以家庭能源監(jiān)控系統(tǒng)為背景,給出了一種基于嵌入式數(shù)據(jù)庫的數(shù)據(jù)管理方法.家庭用電監(jiān)控系統(tǒng)中的數(shù)據(jù)庫設(shè)計并不復雜.數(shù)據(jù)管理的難點主要體現(xiàn)在:數(shù)據(jù)量大、統(tǒng)計內(nèi)容多、響應快速的要求上.嵌入式數(shù)據(jù)庫Berkeley DB解決了嵌入式設(shè)備的數(shù)據(jù)管理問題,優(yōu)化了存儲的數(shù)據(jù)結(jié)構(gòu),使用更好的數(shù)據(jù)搜索算法,從而能夠提高系統(tǒng)的響應性能,實現(xiàn)數(shù)據(jù)的可靠存儲.最后與文件系統(tǒng)存儲數(shù)據(jù)方式的實驗比較,體現(xiàn)了嵌入式數(shù)據(jù)庫的優(yōu)越性.
References)
[1]劉智,付保川,奚雪峰.基于Berkeley DB的監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].科技廣場,2007(1):82-84.Liu Zhi,F(xiàn)u Baochuan,Xi Xuefeng.Design and implementation of supervisory system based on Berkeley DB[J].Science Mosaic,2007(1):82-84.(in Chinese)
[2]王京謙,萬蒞新.開源嵌入式數(shù)據(jù)庫BerkeleyDB和SQLite的比較[J].單片機與嵌入式系統(tǒng)應用,2005(2):5-7.Wang Jingqian,Wan Lixin.Comparison between open source database BerkeleyDB and SQLite[J].Microcontroller&Embedded System,2005(2):5-7.(in Chinese)
[3]劉巍巍,徐成,李仁發(fā).嵌入式數(shù)據(jù)庫Berkeley DB的原理和應用[J].科學技術(shù)與工程,2005,5(2):86-90.Liu Weiwei,Xu Cheng,Li Renfa.The mechanism and applications of Berkeley DB[J].Science Technology and Engineer,2005(2):86-90.(in Chinese)
[4]Oracle Berkeley DB.Getting started with Berkeley DB for C,release 4.6[EB/OL].(2007-06)[2010-04-30].www.oracle.com.
[5]施聰.嵌入式數(shù)據(jù)庫系統(tǒng) Berkeley DB[EB/OL].(2005-04-01)[2010-04-30].http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html#author.
[6]孫繼坤,張小全.嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解——基于ARM[M].北京:人民郵電出版社,2006:8-27
[7]萬威,葉樺.一種嵌入式微型可配置GUI的設(shè)計及實現(xiàn)[J].東南大學學報:自然科學版,2008,38(增刊Ⅱ):115-118.Wan Wei,Ye Hua.Design and realization of a micro configurable embedded GUI[J].Journal of Southeast University:Natural Science Edition,2008,38(SupⅡ):115-118.(in Chinese)
Applications of Berkeley DB in home energy monitor system
Bao Jing Ye Hua Sun Xiaojie Li Jian
(School of Automation,Southeast University,Nanjing 210096,China)(Key Laboratory of Measurement and Control of Complex Systems of Engineering of Ministry of Education,Southeast University,Nanjing 210096,China)
In order to achieve the goal of data statistic and task management under the embedded systems,together with the consideration of processing speed and the internal storage capacity,the embedded database is introduced.The features of embedded database are small in size,multi-functional,portable,highly efficient and stable.Taking the data management in the home energy monitor system as an example,a statistical method of time sharing is proposed.The embedded database Berkeley DB is transplanted,and the resource occupancy and response speed before and after using Berkeley DB are compared.Testing data show that although taking up more storage resources,the use of Berkeley DB provides more efficient data management capabilities.The application of Berkeley DB improves the system response,and provides a better human-computer interaction.Under the allowance of the hardware resources of device,this practice of using space for performance is feasible.
embedded database;embedded system;home energy monitor system;Berkeley DB;data statistics
TP274
A
1001-0505(2010)增刊(I)-0092-06
2010-05-18. 作者簡介:鮑婧(1986—),女,碩士生;葉樺(聯(lián)系人),男,博士,教授,博士生導師,zhineng@seu.edu.cn.
國家自然科學基金資助項目(60904020).