馮 冬 陳俊杰
(東南大學儀器科學與工程學院 南京 210096)
智能家居是一種基于家庭設備的自動化與通信完成對環境監測和設備自動控制的一項技術[1]。它正給人們的生活帶來前所未有的舒適與便利。在不久的將來,智能家居將進入每個家庭,成為人們生活必不可少的一部分。
無線傳感器網絡極大地拓展了人們的感知范圍,通過將由家庭設備組成的無線傳感器網絡與GPRS結合,可以讓人們隨時隨地監測和控制家庭設備的工作。基于上述技術的智能家居系統具有對家庭設備遠程控制、監測、集中管理的功能。家庭中包括4表、安防、空調、熱水器在內的眾多設備通過內置的通信與控制裝置,形成一個無線傳感器網絡,這個網絡將各種設備連接起來,使它們協同工作,從而將家庭設備從一個個獨立被動的個體轉變成一個主動的、相互連接的網絡。無線傳感器網絡通過網關與外部的GPRS相連,使兩種不同網絡的信息能相互傳輸,為用戶提供了一種遠程訪問控制家庭設備的途徑[2]。遠程智能家居系統結構如圖1所示。
智能家居網關在整個系統中占據了十分重要的地位,它實現了兩種網絡數據的透明傳輸,并且具有分析處理數據的能力,可以說它是整個遠程智能家居控制系統的中樞神經。然而,目前針對網關的軟件設計不多,并且主要側重于網關的通信功能,而對圖形界面與數據存儲等功能的支持不足,這類軟件的圖形界面大都是基于web的設計,需要通過瀏覽器才能訪問網關[3],并且基于嵌入式web技術的圖形界面設計并不豐富。目前,支持嵌入式觸摸屏的網關管理軟件并不多見,因此本文在完成網關基本功能的基礎上,利用嵌入式圖形接口MiniGUI與嵌入式數據庫SQlite設計了一款功能穩定、界面友好的網關管理軟件。

圖1 遠程智能家居結構圖
作為遠程智能家居的網關,它連接了家庭的無線傳感器網絡和外部的GPRS。用戶從遠程訪問網關,通過網關控制家庭設備的工作,因此網關是整個遠程智能家居系統的樞紐。它應包括數據通信、處理、存儲等基本功能,并能為用戶提供一個友好的操作界面。本系統實現的具體功能包括:
1)數據處理。數據處理主要是指將通過網關的GPRS與無線傳感器網絡的數據進行處理,并對信息做出恰當的反應。
2)通信接口。通信接口負責數據的發送與接收,不對數據進行處理,它僅僅將接收到的數據轉發給其他軟件模塊處理或者將其他模塊要求發送的數據發送出去。
3)數據庫。數據庫模塊包括數據的存儲、索引以及提取。它通過數據庫接口完成數據的插入、檢索、提取等操作。網關通過該功能可以對經過它的數據進行存儲,提供檢索、查詢,便于用戶查看網關的工作狀態和整個系統的工作情況。
4)圖形用戶界面。圖形用戶界面是當前流行的應用模式,它提供了一個圖形化的操作界面,極大的提高了網關的操作性。對數據的插入和查詢通過圖形界面可視化的展現出來,并通過該圖形界面接收控制命令,完成對網關的工作狀態設定。
本系統軟件由數據處理、通信接口、數據庫和圖形用戶界面4個模塊組成,它們相互協作,完成了整個系統的功能。軟件結構圖如圖2所示。
數據處理是整個軟件的核心模塊,數據通過它在軟件各個模塊之間相互傳遞,把整個系統融合為一個整體,使其協調工作。圖形用戶界面是軟件的表層,它為用戶提供一個良好的人機交互界面,負責接收用戶的控制命令并將處理結果反饋給用戶,為用戶調用數據庫提供圖形方式的操作接口。數據庫模塊為數據進行插入、檢索、查詢等基本操作提供了軟件接口,圖形用戶界面通過調用該接口,使用戶可以方便的利用圖形化方式對數據庫進行操作。數據通信接口提供了軟件與GPRS和無線傳感器網絡通信的接口,它負責從GPRS和無線傳感器網絡接收數據并將數據提交給數據處理部件處理,同時可以將數據發送到GPRS網絡和無線傳感器網絡中。

圖2 軟件結構圖

圖3 軟件流程
系統采用嵌入式 Linux操作系統,Linux強大的功能、穩定性、安全性以及開源軟件眾多等特點為網關管理軟件的設計帶來了極大的幫助。軟件流程如圖3所示。
本軟件啟動了Linux環境下的兩個進程來實現系統功能,分別是系統主進程和通信進程。當Linux啟動后,將首先啟動系統的主進程,主進程將對系統運行環境初始化,隨后啟動通信子進程。
主進程的主要用于運行圖形用戶界面,它維持了一個友好的圖形環境,采用消息驅動機制,保證用戶的操作能夠及時得到處理。
通信接口進程由主進程產生,是主進程的子進程。它負責整個系統的通信功能。當它啟動之后,將監視整個系統是否接收到數據或者有數據需要發送。
主進程與通信接口進程的數據交互是通過Linux的進程間通信機制來完成的,Linux下常用的進程間通信方法有管道、消息隊列、共享內存等,通過這些進程間通信方法,使數據在不同進程間流動,極大的方便了應用開發。
數據處理模塊是數據在系統各個部分之間流動的樞紐,并負責對數據進行處理。它是一組數據處理函數與數據流動通道的集合,負責處理通信接口接收到的數據,判斷其來自GPRS還是無線傳感器網絡,并按照需要決定是否轉發數據;它還負責接收圖形用戶界面對調用數據庫以及發送接收數據的要求,并按照要求完成相應工作,將結果反饋給圖形用戶界面。
除了提供給其他部件直接的函數調用外,數據處理部件的核心在于維持了一個數據流動通道,保證了不同模塊之間的數據流通。由于軟件采用了2個進程,圖形用戶界面運行于主進程,而通信接口運行在通信進程中,因此這兩個進程中數據的交互就必須依靠數據處理模塊所提供的進程間通信的功能,使數據在不同進程間傳遞,方便了應用開發。本系統采用管道與信號量相結合的方法實現進程間通信。
通俗的說,管道(pipe)就是數據從一個進程到另一個進程的流動通道,常把一個進程的輸出通過管道連接到另一個進程的輸入。在程序中,我們通過int pipe(int file_descriptor[2])函數創建一個管道,管道的輸入輸出傳遞給整型的文件描述符數組,其中file_descriptor[0]表示管道的讀,file_descriptor[1]表示管道的寫。從file_descriptor[1]寫入的數據可以從file_descriptor[0]中讀出。進程間管道通信的邏輯結構圖如圖4所示。
信號量是Linux系統響應某些事件而發出的一個信號,捕獲到該信號的進程會立刻中斷并調用相應的函數進行處理。通過將管道與信號量機制結合,實現了進程間實時的數據通信。當主進程需要發送數據給通信進程時,它首先將數據寫入管道,然后發送信號給通信進程,通信進程捕獲到信號后,立刻中斷并執行處理函數進行管道的讀操作,這樣,主進程就可以及時的把數據通過管道發送給通信進程[4]。
SQLite是一款開源嵌入式數據庫引擎,全部源代碼在3萬行左右,編譯后的程序大約250kb,最多可以管理2TB的數據,提供了對SQL92標準的大多數支持,是個極端輕量級的關系型數據庫。正是由于SQLite具有小體積,較強的功能,并能管理2TB的數據,特別適合用于嵌入式領域[5]。
數據庫模塊通過調用SQLite的API,實現了數據存儲、檢索、查詢等功能,該模塊的結構如圖5所示。

圖4 管道通信邏輯圖
SQLite一共涉及了 83個API調用以及數據結構,它的使用簡單,若僅僅是簡單的應用,那么只需使用 sqlite3_open(),sqlite3_exec()和sqlite3_close()就可以完成。Sqlite3*db是sqlite中數據庫句柄,用于其他API對打開的數據庫進行操作。sqlite3_open(filename,&db)用于打開一個數據庫,其中“filename”是數據庫路徑名,并將數據庫的句柄保存在之前定義的sqlite3*db的指針中。Sqlite3_exec(db,sql,null,null,null)通常用于執行僅修改數據庫記錄而不返回結果的情況,例如使用insert、update和delete等SQL操作語句的情況,sqlite3_exec中的 sql就是 SQL操作語句了。Sqlite3_close(db)用于關閉指定的數據庫。

圖5 數據管理部件結構圖
若需要對數據庫的表進行查詢,可通過sqlite3_prepare(),sqlite3_step(),sqlite3_column_xxx()等API的協調使用完成查詢操作。Sqlite3_stmt*stmt是SQLite內部的一個結構體,它包含了將要執行的SQL語句的信息,sqlite3_prepare(db,sql,&stmt,0)將SQL語句進行預編譯,便于系統高效的處理。但此時SQL語句并沒真正的執行,它僅僅被預編譯在 stmt結構體中,通過sqlite3_step(stmt)調用,SQL語句才被真正執行,結果通過sqlite_column_xxx(stmt,int num)進行提取,其中xxx可以是int、text等數據存儲類型,參數 num表示查詢表的列號[6]。
通過上述SQLite提供的API接口,我們可以方便的實現數據庫的各種功能。
MiniGUI是一個輕量級圖形用戶界面支持系統,因其小巧、高穩定性等優點,特別適合在智能家居網關等嵌入式設備中應用。
MiniGUI采用分層設計,結構圖如圖 6所示[7]:頂層的API提供給用戶調用,中間核心層包括了窗口系統的各個模塊,而底層的GAL和IAL提供了Linux圖形接口支持及鼠標等設備驅動。MiniGUI為應用層提供了統一的API,屏蔽了底層硬件的區別,降低了開發的復雜性。

圖6 MiniGUI結構與流程圖
MiniGUI是消息驅動的應用程序,外設發生的事件都由系統收集,并翻譯為特定格式的消息。應用程序中建立一個消息循環來讀取并處理消息,直到特定的終止消息傳來為止。程序要提供一個消息處理函數。系統在此函數中處理相應的消息[8]。
圖形界面采用圖6右圖所示的流程設計。程序從MiniGUI的主程序入口MiniGUIMain啟動,之后創建窗口并開始運行消息循環。MSG是MiniGUI中定義消息的數據類型,每個事件都被轉換成一個MSG類型變量,發送到消息隊列中,等待消息處理函數處理。下面就是執行消息循環的代碼:

當用戶關閉窗口時,消息隊列中便投放了一個特殊消息,這個消息將結束消息循環,之后程序釋放整個圖形界面的資源,圖形界面運行結束。
數據通信接口在是軟件與無線傳感器網絡和GPRS的通信接口,它負責從兩個網絡中接收數據,并通過它將數據發送到兩個網絡中。通信接口代碼運行在通信進程中,該進程是主進程在完成系統初始化之后創建的一個子進程。
通信接口可以檢測是否接收到數據,并將接收到的數據提取出來,但不對數據做任何分析處理,對于數據的處理將通過數據處理部件來進行。當有數據需要發送時,調用數據通信接口將信息發送到目標網絡中。對于數據的發送,通信接口采用了一個簡單的退避算法,提高了數據成功發送的概率。該方法的程序流程圖如圖7所示。

圖7 數據發送流程圖
當調用通信接口發送數據后,判斷發送是否成功。若成功,調用數據管理接口存儲數據并返回。若發送失敗,則首先將該數據的發送次數加1,然后判斷是否超出了發送次數上限。若超出,調用數據管理接口保存數據并在數據庫中標明發送失敗,然后返回;若還沒有超出發送次數的上限,則延遲一個小的時間段,再次調用通信接口發送數據,并繼續按照上述流程處理。
本軟件采用了Linux環境下的C語言開發,結合MiniGUI和SQLite等開發工具,完成了軟件功能的實現。
軟件按照上述方法設計,實現了家用設備工作狀態的查詢與設置、無線傳感器網絡與GPRS的數據轉發以及SQLite數據庫的查詢。

圖8顯示了家用設備的監控界面,左邊為無線傳感器網絡中的設備,點擊該設備的圖標,右側的“工作狀態”就顯示出其工作狀態,用戶可以在“設置”一欄中重新對設備進行設定,點擊“設置”按鈕,控制命令就會通過無線傳感器網絡發送到目標設備中。
圖9顯示了SQLite數據庫的界面。通過網關的數據將被網關存入數據庫中,通過數據庫查詢界面,用戶輸入查詢時間段,就會顯示該時間段內網關記錄到的數據。
本文對遠程智能家居中的網關管理軟件進行了設計,包括圖形用戶界面、數據處理模塊、通信接口以及數據庫模塊,實現了智能家居網關應用的基本功能。軟件系統界面友好,操作方便。系統只需要在嵌入式設備中非常流行的中低端ARM平臺上即可運行,并且功能模塊可根據需要進行裁剪,成本可控制。因此這種遠程智能家居網關管理軟件設計具有較高的應用前景。
[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]唐偉,周祖德.嵌入式智能家居系統網關設計[J].武漢理工大學學報(信息與管理工程版),2009,31(3):391~393
[4]W.Richard Stevens.Advanced Programming in the UNIX Environment[M].Addison Wesley,2005:403~478
[5]胡偉.SQLite在嵌入式系統上的實現研究[J].計算機與數字工程,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]劉昌盛,郭勇,謝習華.嵌入式Linux環境下MiniGUI的研究與移植[J].哈爾濱理工大學學報,2009(1):23~28
[8]魯艷,馬旭東,問治國,等.基于 Linux-MiniGUI嵌入式系統監控管理軟件開發[J].計算機技術與發展,2008(6):179~184