王剛,王楚楚,余亞東,金寶根
(紹興文理學院 數理信息學院,浙江紹興,312000)
隨著計算機網絡的快速發展和科學技術的全面進步,人們對生活的便捷性要求越來越高,萬物互聯的時代慢慢來臨,更加智能的日常已經成為必然。然而由于傳統家居布線復雜、安裝維護成本高昂且存在安全隱患等問題,使得智能家居無法真正實現。因此本系統在短距離通信中查找可行方案。通過對比 ZigBee、WiFi、藍牙、超寬帶通信(UWB)、近場通信(NFC)等等無線傳輸技術,發現ZigBee通訊技術作為一種基于IEEE802.15.4協議的短距離無線通信技術,具有功耗低、復雜度低、成本低等特點,是取代傳統家居布線方案的極好的一種選擇[1]。因此本系統決定采用ZigBee通信組建局域網絡,作為智能家居系統的通訊網絡。至于嵌入式Web服務器,常用的有Boa、GoAhead和Thttpd三種,經過對比雖然各有優勢,但考慮到本設計的需求,Boa服務器具有功能強,速度快,安全性高,占用資源少的功能特點,十分適合資源相對有限的嵌入式系統,因此本方案采用的家庭網關選用了Boa服務器,并采用CGI設計與HTML客戶端通信,從而實現客戶端對本地家電的操控以及環境監測[2]。
此系統除了M0端并沒有設置其他ZigBee終端節點,因此以M0上的風扇、LED等外設作為家電控制的終端節點進行演示。如下圖所示系統整體分為三個部分,M0端負責對環境參數進行采集顯示,家庭網關充當服務器的作用、網頁客戶端用于人機交互。其中自組家庭通信網絡由ZigBee協調器及其終端節點構成,協調器在家庭網關(A7)及終端節點(M0)之間充當連接橋梁的角色,實現了將M0端采集到的數據信息上傳到家庭網關,同樣將用戶端的操作指令通過家庭網關下傳到各終端節實現控制家電的開關。家庭網關和用戶客戶端采用Internet進行雙向通信,服務器和終端節點以自組網絡雙向通信,因此借助家庭網關為中轉,利用Zigbee網絡即實現了用戶和終端節點的雙向通信。

圖2 M0數據采集端示意圖
系統設計M0數據采集端主控芯片選擇了NXP Semicon ductors的LPC11C14,該處理器基于ARMCortex-M0內核,是一個低功耗、低成本、32位的處理器,主頻可達50MHz,足以滿足數據采集端的任務需求。M0端采用的是DHT11溫濕度復合傳感器對溫度及濕度進行采集,此外還有數碼管風扇、對其采集參數進行顯示、LED、小風扇等外設用于對家用電器的操控演示、蜂鳴器模擬報警器報警等。網關設計考慮到價格以及功耗采用的是,具備優秀的性能、主打低功耗的ARM7芯片。
ZigBee自組網絡是智能終端系統的核心,根據ZigBee在網絡中扮演的角色不同,可分為協調器、路由器和終端節點三類,協調器負責組織網絡,其允許路由器與終端節點與其綁定并接收兩者發送過來的信息。終端節點負責將終端采集的信息發送給ZigBee協調器[2]。考慮到現實實際情況,可以根據家庭范圍大小采用不同的傳感網絡拓撲結構,經過測試在組網簡單的星型網絡結構,在80米范圍內通信均有效可靠,如果終端節點距離協調器過遠則可通過樹狀網絡進行通訊,使用路由器在中間作為中轉從而延長通信的距離。
Zigbee模塊采用CC2530芯片設計和實現,只需在網絡節點安裝少量的濾波電路和PCB天線。它與高度可靠的短程無線通信協議IEEE802.15.4兼容,并使用CSMA-CA技術解決數據沖突,16-bits CRC技術保證數據傳輸的準確性,使其通信具有極高的可靠性,雖然通信速率較低但最大數據傳輸速率250Kbps遠遠滿足此設計的需求。ZigBee模塊具有工作、休眠兩種狀態,功耗低工作狀態瞬間電流僅為25mA,休眠狀態電流更是幾乎可以忽略不計。因此,此設計供電方式采用2節五號電池對其供電,經過理論計算大概可以使用超過半年時間。此外ZigBee的協調器設計還需要串口模塊,用于與家庭網關進行通信。
家庭網關與協調器之間通信需要協議,家庭網關發送給ZigBee網絡的指令操作信息及終端節點采集到的數據信息,在信息發送時需要添加不同的表頭進行區分,不同的操作設備也要根據約定好相應的編號用以區分。當消息處理線程得到信息首先會對信息類型進行判斷,根據不同的類型信息做出相對應的操作[3]。在這個過程中處理器會開啟多個線程,如:數據庫線程、LED控制線程、Buzzer控制線程、CGI線程、控制命令線程等,根據接收到的事件不同喚醒不透的線程進行處理。考慮到多線程中對臨界資源操作時,可能會產生競爭,出現錯誤,因此這里我們對各個線程引入了互斥鎖、條件變量等同步互斥機制。主線程運行后,各任務線程開始運行,被觸發后則喚醒各線程的條件變量,做出相應的處理,處理后繼續阻塞等待下一次的喚醒。
以數據庫線程為例:創建鏈表頭后一直等待條件變量的喚醒,經過對接收數據信息解析發現表頭是約定的環境信息,則喚醒數據庫相關的條件變量,喚醒后查看是否有信息,若沒有繼續等待,若有信息則循環對數據庫進行相應的操作,操作完畢繼續等待下一次條件變量的喚醒。流程如下圖3所示。

圖3 SQlite 線程工作流程示意圖
LED線程如下圖4所示:LED線程一直阻塞等待喚醒,服務器接收到客戶端下發的指令后,通過對接收的信息分析對比發現是控制LED小燈的命令,則喚醒LED線程,根據led文件掩碼信息,識別是控制的哪個小燈,根據事前約定好的協議封裝控制狀態指令,拼接后發送給控制端即可以控制對應小燈的亮滅。

圖4 LED處理線程工作流程示意圖
軟件設計中對數據的存儲以及一些初始化參數(報警溫度臨界值等)存儲采用的數據庫是sqlite3,該數據庫具有C語言函數接口,可以用這些接口很容易地對數據庫進行各種操作。例如:在c程序想打開一個數據庫即可使用int sqlite3_open(文件名,sqlite3 **)函數,若想對數據庫進行增刪改查等操作使用sqlite3_exec(sqlite3*,const char *sql,sqlite3_callback, void *,char **errmsg )函數就可以在執行各種sql語句,(const char *sql即需要使用的sql語句,詳情使用見sqlite官網)。各線程的激活如數據庫的激活以及各種操作是在數據接收線程后面,為區分各種操作命令類型,根據接收端和發送端要約定的協議,接收端接收到數據后即對消息進行解析,根據約定的消息頭,分為不同的功能執行不同的工作線程、不同的功能函數。

圖5 環境參數存儲形式圖
如上圖溫濕度記錄存儲表為例,數據庫中根據存儲信息類型的不同,分為不同的表,如用戶注冊表、環境參數表等。例如,通過對table_select_mask掩碼進行與操作,就能標記出是對數據庫的哪個表格進行操作。以此類推根據操作掩碼,就能識別出不同的操作、根據數據掩碼就能區分不同種類的數據,從而將數據存儲在數據庫中相對應的表中。
BOA服務器采用HTTP超文本傳輸協議,是一個功能強大、速度快、安全性高、占用資源少的嵌入式系統服務器。BOA使用需要移植及配置,移植方便,這里不進行詳述。服務器和CGI程序之間的通信需要環境變量的協作,由于HTML只能顯示靜態網頁,不能與服務器動態數據交互,因此必須通過表單與服務器交互,來解決用戶使用網頁客戶端的動態交互功能。表單提交方法由METHOD標簽的屬性所決定,當“METHOD=GET”時,信息是通過 QUERY—STRING這個環境變量來傳遞。而當“METHOD=POST”,表單信息將通過標準輸入來進行讀取數據,并用環境變量CONTENT—LENGTH記錄發送數據的長度(因為CGI中不會出現EOF,所以讀取字節長度絕對不能超過發送數據長度)。
如圖6所示,客戶端的瀏覽器與嵌入式Web服務器BOA建立連接,要經過初始化socket、bind、listen等初始化過程,瀏覽器通過以CGI程序的GET或者POST表單傳遞方式向Web服務器發送表單,服務器通過分析表單信息,調用不同的CGI,例如小燈開關CGI,報警器CGI等,即實現了用戶在網頁端動態下發操作指令,通過Boa服務器的處理下發到ZigBee網絡的終端節點實現家電的控制。

圖6 通訊整體框圖

圖7 cgi調用流程圖
同樣,終端節點的信息也可以經過ZigBee協調器發到服務器,繼而上傳到用戶端。最終實現了用戶通過電腦手機等智能設備,借助家庭智能網關、ZigBee自組網絡能夠遠程控制家電,查看環境參數。
此系統經過驗證,能夠根據家庭大小所需要,采用不同的ZigBee網絡拓撲結構調整通信網絡范圍大小,根據要操控的家電多少增加或減少ZigBee終端端點,使用方便、穩定可靠,達到了預期的功能,具有一定的現實意義。