馮 冬 陳俊杰
(東南大學(xué)儀器科學(xué)與工程學(xué)院 南京 210096)
智能家居是一種基于家庭設(shè)備的自動(dòng)化與通信完成對環(huán)境監(jiān)測和設(shè)備自動(dòng)控制的一項(xiàng)技術(shù)[1]。它正給人們的生活帶來前所未有的舒適與便利。在不久的將來,智能家居將進(jìn)入每個(gè)家庭,成為人們生活必不可少的一部分。
無線傳感器網(wǎng)絡(luò)極大地拓展了人們的感知范圍,通過將由家庭設(shè)備組成的無線傳感器網(wǎng)絡(luò)與GPRS結(jié)合,可以讓人們隨時(shí)隨地監(jiān)測和控制家庭設(shè)備的工作?;谏鲜黾夹g(shù)的智能家居系統(tǒng)具有對家庭設(shè)備遠(yuǎn)程控制、監(jiān)測、集中管理的功能。家庭中包括4表、安防、空調(diào)、熱水器在內(nèi)的眾多設(shè)備通過內(nèi)置的通信與控制裝置,形成一個(gè)無線傳感器網(wǎng)絡(luò),這個(gè)網(wǎng)絡(luò)將各種設(shè)備連接起來,使它們協(xié)同工作,從而將家庭設(shè)備從一個(gè)個(gè)獨(dú)立被動(dòng)的個(gè)體轉(zhuǎn)變成一個(gè)主動(dòng)的、相互連接的網(wǎng)絡(luò)。無線傳感器網(wǎng)絡(luò)通過網(wǎng)關(guān)與外部的GPRS相連,使兩種不同網(wǎng)絡(luò)的信息能相互傳輸,為用戶提供了一種遠(yuǎn)程訪問控制家庭設(shè)備的途徑[2]。遠(yuǎn)程智能家居系統(tǒng)結(jié)構(gòu)如圖1所示。
智能家居網(wǎng)關(guān)在整個(gè)系統(tǒng)中占據(jù)了十分重要的地位,它實(shí)現(xiàn)了兩種網(wǎng)絡(luò)數(shù)據(jù)的透明傳輸,并且具有分析處理數(shù)據(jù)的能力,可以說它是整個(gè)遠(yuǎn)程智能家居控制系統(tǒng)的中樞神經(jīng)。然而,目前針對網(wǎng)關(guān)的軟件設(shè)計(jì)不多,并且主要側(cè)重于網(wǎng)關(guān)的通信功能,而對圖形界面與數(shù)據(jù)存儲(chǔ)等功能的支持不足,這類軟件的圖形界面大都是基于web的設(shè)計(jì),需要通過瀏覽器才能訪問網(wǎng)關(guān)[3],并且基于嵌入式web技術(shù)的圖形界面設(shè)計(jì)并不豐富。目前,支持嵌入式觸摸屏的網(wǎng)關(guān)管理軟件并不多見,因此本文在完成網(wǎng)關(guān)基本功能的基礎(chǔ)上,利用嵌入式圖形接口MiniGUI與嵌入式數(shù)據(jù)庫SQlite設(shè)計(jì)了一款功能穩(wěn)定、界面友好的網(wǎng)關(guān)管理軟件。
圖1 遠(yuǎn)程智能家居結(jié)構(gòu)圖
作為遠(yuǎn)程智能家居的網(wǎng)關(guān),它連接了家庭的無線傳感器網(wǎng)絡(luò)和外部的GPRS。用戶從遠(yuǎn)程訪問網(wǎng)關(guān),通過網(wǎng)關(guān)控制家庭設(shè)備的工作,因此網(wǎng)關(guān)是整個(gè)遠(yuǎn)程智能家居系統(tǒng)的樞紐。它應(yīng)包括數(shù)據(jù)通信、處理、存儲(chǔ)等基本功能,并能為用戶提供一個(gè)友好的操作界面。本系統(tǒng)實(shí)現(xiàn)的具體功能包括:
1)數(shù)據(jù)處理。數(shù)據(jù)處理主要是指將通過網(wǎng)關(guān)的GPRS與無線傳感器網(wǎng)絡(luò)的數(shù)據(jù)進(jìn)行處理,并對信息做出恰當(dāng)?shù)姆磻?yīng)。
2)通信接口。通信接口負(fù)責(zé)數(shù)據(jù)的發(fā)送與接收,不對數(shù)據(jù)進(jìn)行處理,它僅僅將接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給其他軟件模塊處理或者將其他模塊要求發(fā)送的數(shù)據(jù)發(fā)送出去。
3)數(shù)據(jù)庫。數(shù)據(jù)庫模塊包括數(shù)據(jù)的存儲(chǔ)、索引以及提取。它通過數(shù)據(jù)庫接口完成數(shù)據(jù)的插入、檢索、提取等操作。網(wǎng)關(guān)通過該功能可以對經(jīng)過它的數(shù)據(jù)進(jìn)行存儲(chǔ),提供檢索、查詢,便于用戶查看網(wǎng)關(guān)的工作狀態(tài)和整個(gè)系統(tǒng)的工作情況。
4)圖形用戶界面。圖形用戶界面是當(dāng)前流行的應(yīng)用模式,它提供了一個(gè)圖形化的操作界面,極大的提高了網(wǎng)關(guān)的操作性。對數(shù)據(jù)的插入和查詢通過圖形界面可視化的展現(xiàn)出來,并通過該圖形界面接收控制命令,完成對網(wǎng)關(guān)的工作狀態(tài)設(shè)定。
本系統(tǒng)軟件由數(shù)據(jù)處理、通信接口、數(shù)據(jù)庫和圖形用戶界面4個(gè)模塊組成,它們相互協(xié)作,完成了整個(gè)系統(tǒng)的功能。軟件結(jié)構(gòu)圖如圖2所示。
數(shù)據(jù)處理是整個(gè)軟件的核心模塊,數(shù)據(jù)通過它在軟件各個(gè)模塊之間相互傳遞,把整個(gè)系統(tǒng)融合為一個(gè)整體,使其協(xié)調(diào)工作。圖形用戶界面是軟件的表層,它為用戶提供一個(gè)良好的人機(jī)交互界面,負(fù)責(zé)接收用戶的控制命令并將處理結(jié)果反饋給用戶,為用戶調(diào)用數(shù)據(jù)庫提供圖形方式的操作接口。數(shù)據(jù)庫模塊為數(shù)據(jù)進(jìn)行插入、檢索、查詢等基本操作提供了軟件接口,圖形用戶界面通過調(diào)用該接口,使用戶可以方便的利用圖形化方式對數(shù)據(jù)庫進(jìn)行操作。數(shù)據(jù)通信接口提供了軟件與GPRS和無線傳感器網(wǎng)絡(luò)通信的接口,它負(fù)責(zé)從GPRS和無線傳感器網(wǎng)絡(luò)接收數(shù)據(jù)并將數(shù)據(jù)提交給數(shù)據(jù)處理部件處理,同時(shí)可以將數(shù)據(jù)發(fā)送到GPRS網(wǎng)絡(luò)和無線傳感器網(wǎng)絡(luò)中。
圖2 軟件結(jié)構(gòu)圖
圖3 軟件流程
系統(tǒng)采用嵌入式 Linux操作系統(tǒng),Linux強(qiáng)大的功能、穩(wěn)定性、安全性以及開源軟件眾多等特點(diǎn)為網(wǎng)關(guān)管理軟件的設(shè)計(jì)帶來了極大的幫助。軟件流程如圖3所示。
本軟件啟動(dòng)了Linux環(huán)境下的兩個(gè)進(jìn)程來實(shí)現(xiàn)系統(tǒng)功能,分別是系統(tǒng)主進(jìn)程和通信進(jìn)程。當(dāng)Linux啟動(dòng)后,將首先啟動(dòng)系統(tǒng)的主進(jìn)程,主進(jìn)程將對系統(tǒng)運(yùn)行環(huán)境初始化,隨后啟動(dòng)通信子進(jìn)程。
主進(jìn)程的主要用于運(yùn)行圖形用戶界面,它維持了一個(gè)友好的圖形環(huán)境,采用消息驅(qū)動(dòng)機(jī)制,保證用戶的操作能夠及時(shí)得到處理。
通信接口進(jìn)程由主進(jìn)程產(chǎn)生,是主進(jìn)程的子進(jìn)程。它負(fù)責(zé)整個(gè)系統(tǒng)的通信功能。當(dāng)它啟動(dòng)之后,將監(jiān)視整個(gè)系統(tǒng)是否接收到數(shù)據(jù)或者有數(shù)據(jù)需要發(fā)送。
主進(jìn)程與通信接口進(jìn)程的數(shù)據(jù)交互是通過Linux的進(jìn)程間通信機(jī)制來完成的,Linux下常用的進(jìn)程間通信方法有管道、消息隊(duì)列、共享內(nèi)存等,通過這些進(jìn)程間通信方法,使數(shù)據(jù)在不同進(jìn)程間流動(dòng),極大的方便了應(yīng)用開發(fā)。
數(shù)據(jù)處理模塊是數(shù)據(jù)在系統(tǒng)各個(gè)部分之間流動(dòng)的樞紐,并負(fù)責(zé)對數(shù)據(jù)進(jìn)行處理。它是一組數(shù)據(jù)處理函數(shù)與數(shù)據(jù)流動(dòng)通道的集合,負(fù)責(zé)處理通信接口接收到的數(shù)據(jù),判斷其來自GPRS還是無線傳感器網(wǎng)絡(luò),并按照需要決定是否轉(zhuǎn)發(fā)數(shù)據(jù);它還負(fù)責(zé)接收圖形用戶界面對調(diào)用數(shù)據(jù)庫以及發(fā)送接收數(shù)據(jù)的要求,并按照要求完成相應(yīng)工作,將結(jié)果反饋給圖形用戶界面。
除了提供給其他部件直接的函數(shù)調(diào)用外,數(shù)據(jù)處理部件的核心在于維持了一個(gè)數(shù)據(jù)流動(dòng)通道,保證了不同模塊之間的數(shù)據(jù)流通。由于軟件采用了2個(gè)進(jìn)程,圖形用戶界面運(yùn)行于主進(jìn)程,而通信接口運(yùn)行在通信進(jìn)程中,因此這兩個(gè)進(jìn)程中數(shù)據(jù)的交互就必須依靠數(shù)據(jù)處理模塊所提供的進(jìn)程間通信的功能,使數(shù)據(jù)在不同進(jìn)程間傳遞,方便了應(yīng)用開發(fā)。本系統(tǒng)采用管道與信號(hào)量相結(jié)合的方法實(shí)現(xiàn)進(jìn)程間通信。
通俗的說,管道(pipe)就是數(shù)據(jù)從一個(gè)進(jìn)程到另一個(gè)進(jìn)程的流動(dòng)通道,常把一個(gè)進(jìn)程的輸出通過管道連接到另一個(gè)進(jìn)程的輸入。在程序中,我們通過int pipe(int file_descriptor[2])函數(shù)創(chuàng)建一個(gè)管道,管道的輸入輸出傳遞給整型的文件描述符數(shù)組,其中file_descriptor[0]表示管道的讀,file_descriptor[1]表示管道的寫。從file_descriptor[1]寫入的數(shù)據(jù)可以從file_descriptor[0]中讀出。進(jìn)程間管道通信的邏輯結(jié)構(gòu)圖如圖4所示。
信號(hào)量是Linux系統(tǒng)響應(yīng)某些事件而發(fā)出的一個(gè)信號(hào),捕獲到該信號(hào)的進(jìn)程會(huì)立刻中斷并調(diào)用相應(yīng)的函數(shù)進(jìn)行處理。通過將管道與信號(hào)量機(jī)制結(jié)合,實(shí)現(xiàn)了進(jìn)程間實(shí)時(shí)的數(shù)據(jù)通信。當(dāng)主進(jìn)程需要發(fā)送數(shù)據(jù)給通信進(jìn)程時(shí),它首先將數(shù)據(jù)寫入管道,然后發(fā)送信號(hào)給通信進(jìn)程,通信進(jìn)程捕獲到信號(hào)后,立刻中斷并執(zhí)行處理函數(shù)進(jìn)行管道的讀操作,這樣,主進(jìn)程就可以及時(shí)的把數(shù)據(jù)通過管道發(fā)送給通信進(jìn)程[4]。
SQLite是一款開源嵌入式數(shù)據(jù)庫引擎,全部源代碼在3萬行左右,編譯后的程序大約250kb,最多可以管理2TB的數(shù)據(jù),提供了對SQL92標(biāo)準(zhǔn)的大多數(shù)支持,是個(gè)極端輕量級(jí)的關(guān)系型數(shù)據(jù)庫。正是由于SQLite具有小體積,較強(qiáng)的功能,并能管理2TB的數(shù)據(jù),特別適合用于嵌入式領(lǐng)域[5]。
數(shù)據(jù)庫模塊通過調(diào)用SQLite的API,實(shí)現(xiàn)了數(shù)據(jù)存儲(chǔ)、檢索、查詢等功能,該模塊的結(jié)構(gòu)如圖5所示。
圖4 管道通信邏輯圖
SQLite一共涉及了 83個(gè)API調(diào)用以及數(shù)據(jù)結(jié)構(gòu),它的使用簡單,若僅僅是簡單的應(yīng)用,那么只需使用 sqlite3_open(),sqlite3_exec()和sqlite3_close()就可以完成。Sqlite3*db是sqlite中數(shù)據(jù)庫句柄,用于其他API對打開的數(shù)據(jù)庫進(jìn)行操作。sqlite3_open(filename,&db)用于打開一個(gè)數(shù)據(jù)庫,其中“filename”是數(shù)據(jù)庫路徑名,并將數(shù)據(jù)庫的句柄保存在之前定義的sqlite3*db的指針中。Sqlite3_exec(db,sql,null,null,null)通常用于執(zhí)行僅修改數(shù)據(jù)庫記錄而不返回結(jié)果的情況,例如使用insert、update和delete等SQL操作語句的情況,sqlite3_exec中的 sql就是 SQL操作語句了。Sqlite3_close(db)用于關(guān)閉指定的數(shù)據(jù)庫。
圖5 數(shù)據(jù)管理部件結(jié)構(gòu)圖
若需要對數(shù)據(jù)庫的表進(jìn)行查詢,可通過sqlite3_prepare(),sqlite3_step(),sqlite3_column_xxx()等API的協(xié)調(diào)使用完成查詢操作。Sqlite3_stmt*stmt是SQLite內(nèi)部的一個(gè)結(jié)構(gòu)體,它包含了將要執(zhí)行的SQL語句的信息,sqlite3_prepare(db,sql,&stmt,0)將SQL語句進(jìn)行預(yù)編譯,便于系統(tǒng)高效的處理。但此時(shí)SQL語句并沒真正的執(zhí)行,它僅僅被預(yù)編譯在 stmt結(jié)構(gòu)體中,通過sqlite3_step(stmt)調(diào)用,SQL語句才被真正執(zhí)行,結(jié)果通過sqlite_column_xxx(stmt,int num)進(jìn)行提取,其中xxx可以是int、text等數(shù)據(jù)存儲(chǔ)類型,參數(shù) num表示查詢表的列號(hào)[6]。
通過上述SQLite提供的API接口,我們可以方便的實(shí)現(xiàn)數(shù)據(jù)庫的各種功能。
MiniGUI是一個(gè)輕量級(jí)圖形用戶界面支持系統(tǒng),因其小巧、高穩(wěn)定性等優(yōu)點(diǎn),特別適合在智能家居網(wǎng)關(guān)等嵌入式設(shè)備中應(yīng)用。
MiniGUI采用分層設(shè)計(jì),結(jié)構(gòu)圖如圖 6所示[7]:頂層的API提供給用戶調(diào)用,中間核心層包括了窗口系統(tǒng)的各個(gè)模塊,而底層的GAL和IAL提供了Linux圖形接口支持及鼠標(biāo)等設(shè)備驅(qū)動(dòng)。MiniGUI為應(yīng)用層提供了統(tǒng)一的API,屏蔽了底層硬件的區(qū)別,降低了開發(fā)的復(fù)雜性。
圖6 MiniGUI結(jié)構(gòu)與流程圖
MiniGUI是消息驅(qū)動(dòng)的應(yīng)用程序,外設(shè)發(fā)生的事件都由系統(tǒng)收集,并翻譯為特定格式的消息。應(yīng)用程序中建立一個(gè)消息循環(huán)來讀取并處理消息,直到特定的終止消息傳來為止。程序要提供一個(gè)消息處理函數(shù)。系統(tǒng)在此函數(shù)中處理相應(yīng)的消息[8]。
圖形界面采用圖6右圖所示的流程設(shè)計(jì)。程序從MiniGUI的主程序入口MiniGUIMain啟動(dòng),之后創(chuàng)建窗口并開始運(yùn)行消息循環(huán)。MSG是MiniGUI中定義消息的數(shù)據(jù)類型,每個(gè)事件都被轉(zhuǎn)換成一個(gè)MSG類型變量,發(fā)送到消息隊(duì)列中,等待消息處理函數(shù)處理。下面就是執(zhí)行消息循環(huán)的代碼:
當(dāng)用戶關(guān)閉窗口時(shí),消息隊(duì)列中便投放了一個(gè)特殊消息,這個(gè)消息將結(jié)束消息循環(huán),之后程序釋放整個(gè)圖形界面的資源,圖形界面運(yùn)行結(jié)束。
數(shù)據(jù)通信接口在是軟件與無線傳感器網(wǎng)絡(luò)和GPRS的通信接口,它負(fù)責(zé)從兩個(gè)網(wǎng)絡(luò)中接收數(shù)據(jù),并通過它將數(shù)據(jù)發(fā)送到兩個(gè)網(wǎng)絡(luò)中。通信接口代碼運(yùn)行在通信進(jìn)程中,該進(jìn)程是主進(jìn)程在完成系統(tǒng)初始化之后創(chuàng)建的一個(gè)子進(jìn)程。
通信接口可以檢測是否接收到數(shù)據(jù),并將接收到的數(shù)據(jù)提取出來,但不對數(shù)據(jù)做任何分析處理,對于數(shù)據(jù)的處理將通過數(shù)據(jù)處理部件來進(jìn)行。當(dāng)有數(shù)據(jù)需要發(fā)送時(shí),調(diào)用數(shù)據(jù)通信接口將信息發(fā)送到目標(biāo)網(wǎng)絡(luò)中。對于數(shù)據(jù)的發(fā)送,通信接口采用了一個(gè)簡單的退避算法,提高了數(shù)據(jù)成功發(fā)送的概率。該方法的程序流程圖如圖7所示。
圖7 數(shù)據(jù)發(fā)送流程圖
當(dāng)調(diào)用通信接口發(fā)送數(shù)據(jù)后,判斷發(fā)送是否成功。若成功,調(diào)用數(shù)據(jù)管理接口存儲(chǔ)數(shù)據(jù)并返回。若發(fā)送失敗,則首先將該數(shù)據(jù)的發(fā)送次數(shù)加1,然后判斷是否超出了發(fā)送次數(shù)上限。若超出,調(diào)用數(shù)據(jù)管理接口保存數(shù)據(jù)并在數(shù)據(jù)庫中標(biāo)明發(fā)送失敗,然后返回;若還沒有超出發(fā)送次數(shù)的上限,則延遲一個(gè)小的時(shí)間段,再次調(diào)用通信接口發(fā)送數(shù)據(jù),并繼續(xù)按照上述流程處理。
本軟件采用了Linux環(huán)境下的C語言開發(fā),結(jié)合MiniGUI和SQLite等開發(fā)工具,完成了軟件功能的實(shí)現(xiàn)。
軟件按照上述方法設(shè)計(jì),實(shí)現(xiàn)了家用設(shè)備工作狀態(tài)的查詢與設(shè)置、無線傳感器網(wǎng)絡(luò)與GPRS的數(shù)據(jù)轉(zhuǎn)發(fā)以及SQLite數(shù)據(jù)庫的查詢。
圖8顯示了家用設(shè)備的監(jiān)控界面,左邊為無線傳感器網(wǎng)絡(luò)中的設(shè)備,點(diǎn)擊該設(shè)備的圖標(biāo),右側(cè)的“工作狀態(tài)”就顯示出其工作狀態(tài),用戶可以在“設(shè)置”一欄中重新對設(shè)備進(jìn)行設(shè)定,點(diǎn)擊“設(shè)置”按鈕,控制命令就會(huì)通過無線傳感器網(wǎng)絡(luò)發(fā)送到目標(biāo)設(shè)備中。
圖9顯示了SQLite數(shù)據(jù)庫的界面。通過網(wǎng)關(guān)的數(shù)據(jù)將被網(wǎng)關(guān)存入數(shù)據(jù)庫中,通過數(shù)據(jù)庫查詢界面,用戶輸入查詢時(shí)間段,就會(huì)顯示該時(shí)間段內(nèi)網(wǎng)關(guān)記錄到的數(shù)據(jù)。
本文對遠(yuǎn)程智能家居中的網(wǎng)關(guān)管理軟件進(jìn)行了設(shè)計(jì),包括圖形用戶界面、數(shù)據(jù)處理模塊、通信接口以及數(shù)據(jù)庫模塊,實(shí)現(xiàn)了智能家居網(wǎng)關(guān)應(yīng)用的基本功能。軟件系統(tǒng)界面友好,操作方便。系統(tǒng)只需要在嵌入式設(shè)備中非常流行的中低端ARM平臺(tái)上即可運(yùn)行,并且功能模塊可根據(jù)需要進(jìn)行裁剪,成本可控制。因此這種遠(yuǎn)程智能家居網(wǎng)關(guān)管理軟件設(shè)計(jì)具有較高的應(yīng)用前景。
[1]Ricquebourg V,Menga D,Durand D,et al.The Smart Home Concept:our immediate future[C]//Proceedings of the 2006 1st IEEE International Conference on ELearning in Industrial Electronics.Hammamet,Tunisia,2006:23~28
[2]Papadopoulos N,Meliones A,Economou D,et al.A Connected Home Platform and Development Framework for smart home control applications[C]//Proceedings of the 2009 7th IEEE International Conference on Industrial Informatics.Cardiff,UK,2009:402~409
[3]唐偉,周祖德.嵌入式智能家居系統(tǒng)網(wǎng)關(guān)設(shè)計(jì)[J].武漢理工大學(xué)學(xué)報(bào)(信息與管理工程版),2009,31(3):391~393
[4]W.Richard Stevens.Advanced Programming in the UNIX Environment[M].Addison Wesley,2005:403~478
[5]胡偉.SQLite在嵌入式系統(tǒng)上的實(shí)現(xiàn)研究[J].計(jì)算機(jī)與數(shù)字工程,2009,37(2):158~163
[6]Lv Junyan,Xu Shiguo,Li Yijie.Application Research of Embedded Database SQLite[C]//Proceedings of 2009.IFITA InternationalForum on Information Technology and Applications,Volume 2.Chengdu,China,2009:539~543
[7]劉昌盛,郭勇,謝習(xí)華.嵌入式Linux環(huán)境下MiniGUI的研究與移植[J].哈爾濱理工大學(xué)學(xué)報(bào),2009(1):23~28
[8]魯艷,馬旭東,問治國,等.基于 Linux-MiniGUI嵌入式系統(tǒng)監(jiān)控管理軟件開發(fā)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008(6):179~184