曾明輝,談宏華,邢栢豪,郭良等
(武漢工程大學 電氣信息學院,武漢430000)
生活中智能設(shè)備的運用越來越廣泛,僅靠物理開關(guān)控制家居的方案已經(jīng)逐漸不能滿足人們的生活需求,運用智能家居控制系統(tǒng),可以實現(xiàn)家居的遠程控制以及根據(jù)環(huán)境的變化自動調(diào)節(jié)工作狀態(tài)。嵌入式技術(shù)相當于一個小型的計算機系統(tǒng),根據(jù)不同的功能需求,進行配套的軟硬件設(shè)計,可以實現(xiàn)各種智能化控制系統(tǒng)的特殊要求。智能家居將計算機、網(wǎng)絡(luò)、通信等技術(shù)有效地結(jié)合起來,使家中的各類電器設(shè)施形成一個有效的整體,并以既定的控制策略根據(jù)環(huán)境變化進行自動控制。所以嵌入式技術(shù)軟硬件靈活結(jié)合的特點與智能家居控制系統(tǒng)的需求相契合[1]。
QT 是一個跨平臺的C++圖形用戶界面應用程序開發(fā)框架,它包含了很多自定義的C++類庫,使用帶UI 界面的QWidget 類可快捷地實現(xiàn)可視化圖形界面APP 的編寫,使用QTcpSocket 類則可實現(xiàn)網(wǎng)絡(luò)通訊。智能網(wǎng)關(guān)運行Linux 系統(tǒng),服務(wù)器程序使用線程池thread-pool 模式管理,防止在接收到一個新的請求時服務(wù)器反復創(chuàng)建線程、銷毀進程的情況出現(xiàn),提高CPU 的使用效率。ZigBee 技術(shù)是最近發(fā)展起來的一種短距離無線通信技術(shù),功耗低,被業(yè)界認為是最有可能應用在工控場合的無線方式,它使用2.4 GHz 波段,采用跳頻技術(shù)和擴頻技術(shù)[2]。
在智能家居系統(tǒng)中,一般首先需要通過傳感器檢測環(huán)境中的溫濕度、光照強度、氣體濃度,然后根據(jù)參數(shù)控制家中的電器設(shè)備如風扇、電燈、蜂鳴報警器等,還需要設(shè)計一個客戶端APP,用戶登錄后,可以遠程控制電器設(shè)備或者通過攝像頭遠程監(jiān)控[3-5]。
系統(tǒng)主要由客戶端、智能網(wǎng)關(guān)、電器控制端組成。用戶在客戶端界面進行注冊、登錄操作后,進入控制界面,界面中顯示智能網(wǎng)關(guān)傳來的電器工作狀態(tài)信息。用戶可以在界面中控制每個電器設(shè)備、顯示攝像頭監(jiān)控畫面,還可以獲取互聯(lián)網(wǎng)上的天氣數(shù)據(jù)。用戶端的操作以JSON 格式的自定義通信協(xié)議發(fā)送給智能網(wǎng)關(guān)服務(wù)器[6],智能網(wǎng)關(guān)服務(wù)器成功接收到信息后首先向客戶端返回成功接收標志位。以注冊功能為例,客戶端與智能網(wǎng)關(guān)之間的通信協(xié)議如表1所示[7]。
表1 客戶端與智能網(wǎng)關(guān)通訊協(xié)議Tab.1 Communication protocol between client and intelligent gateway
如果是用戶登錄、注冊、找回密碼操作時,對SQLITE數(shù)據(jù)庫進行操作。如果接收到的數(shù)據(jù)是電器控制,則將對應的設(shè)備地址以及自定義功能碼通過Modbus協(xié)議發(fā)送給電器控制端。如果控制端控制異常則會返回異常碼[8]。部分自定義協(xié)議如表2所示。
表2 自定義Modbus 協(xié)議Tab.2 Custom Modbus protocol
使用跨平臺GUI 開發(fā)工具QT 編寫客戶端APP。在使用Linux 系統(tǒng)的智能網(wǎng)關(guān)中編寫好服務(wù)器程序,與上位機之間通過TCP/IP 協(xié)議通訊;智能網(wǎng)關(guān)再連接ZigBee 模塊,使用Modbus 協(xié)議與電器控制器通訊。電器控制端使用Keil 配置CPU,獲取傳感器的數(shù)據(jù)以及對電器進行控制[9]。系統(tǒng)總體設(shè)計如圖1所示。
圖1 系統(tǒng)總體設(shè)計圖Fig.1 System overall design drawing
ZigBee 采用的是CEL 公司的ZICM2410 模塊,是集成CPU 的單片ZigBee 芯片,它集成了射頻收發(fā)器、MAC 和帶有FLASH 閃存的8051 內(nèi)核,可支持與PC 的串口通訊以及1 Mbps 的無線通訊。Zig-Bee 網(wǎng)絡(luò)基于IEEE802.15.4 國際標準,具有低功耗、低速率、高可靠性的特點。
智能網(wǎng)關(guān)采用的SOC 是三星公司的Exynos4412,是一款采用了基于ARM 公司Cortex-A9 架構(gòu)四核CPU 的低成本、低功耗芯片,采用32 nm 工藝制程,主頻可達1433 MHz 且集成了Mali-400MP 的GPU,GPU 主頻可達400 MHz。該芯片采用64/128 位內(nèi)部總線架構(gòu)并集成了眾多強大的硬件加速器。
2.2.1 處理器
電器控制端采用的SOC 是NXP 公司的LPC111x,是一款采用了ARM 公司Cortex-M0 架構(gòu)的微控制器,可用于高集成度和低功耗的嵌入式應用。M 系列處理器相比于A 系列處理器更偏向于控制,只能運行比較簡單的操作系統(tǒng)(無法運行Linux),但是對于控制端足夠滿足要求,還可以節(jié)約成本、降低功耗。
2.2.2 傳感器
光敏傳感器使用的是ISL29002,這是一種具有集成光傳感器內(nèi)置的整合性ADC 和標準IIC 接口的光線強度檢測傳感器,該設(shè)備讀取周圍環(huán)境光線水平位照度,輸出信號為數(shù)字量并且可以通過IIC協(xié)議訪問[10]。
溫濕度傳感器使用的是DHT11,是一款運用數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù)的溫濕度復合傳感器,輸出的信號為數(shù)字量。具有響應快、體積小、抗干擾能力強、性價比高等優(yōu)點,在智能家居、物聯(lián)網(wǎng)領(lǐng)域應用廣泛[11]。
客戶端使用Windows 系統(tǒng)中的QT4.6 軟件編寫,在QT 應用程序中,首先在main.cpp 中創(chuàng)建QWidget 對象,QWidget 類代表一般窗口,同時繼承了QObect 和QPaintDevice 類,其他窗口都是從QWidget 類繼承出來的,然后在login.ui 文件中可視化編輯智能家居系統(tǒng)的登錄界面,如圖2所示。
圖2 登錄界面Fig.2 Login interface
將UI 界面的按鈕轉(zhuǎn)到槽,并添加QAbstract-Button 類對象中的clicked()事件,QT 軟件會自動生成槽函數(shù)聲明以及對應信號函數(shù)。如果要做到UI界面跳轉(zhuǎn)則需要先在父界面的頭文件中添加子界面的聲明,然后在父界面的cpp 文件中創(chuàng)建一個子界面類的對象,并調(diào)用該對象,同時關(guān)閉父界面的UI。
在login.cpp 中的部分代碼如下:
新用戶打開軟件后首先需要點擊注冊按鈕,進入注冊界面,輸入賬號、密碼、手機號即可注冊。此時客戶端APP 將已自定義結(jié)構(gòu)體的方式將新用戶的信息通過socket 請求傳送給服務(wù)器,如果注冊成功服務(wù)器也會通過socket 返回注冊成功標識符。如果用戶選擇找回密碼則進入“找回密碼”界面,如圖3所示。在該界面中用戶需要填寫自己注冊時的賬號和手機號。如果填寫正確則進入修改密碼界面,用戶可以填寫原用戶名并輸入新密碼。
圖3 找回密碼界面Fig.3 Retrieve password interface
當用戶輸入正確的賬號密碼后,可進入智能家居管理系統(tǒng)的主界面,在主界面中可以手動控制LED、風扇、蜂鳴器的開關(guān),實時顯示由溫濕度傳感器獲取的溫濕度數(shù)據(jù),從廣域網(wǎng)中查詢可城市的天氣情況。查詢天氣情況時首先要在瀏覽器中的開發(fā)者工具中查看天氣資訊網(wǎng)的get 地址,并獲取其Body、Header 信息,使用在線HTTP 接口測試工具測試可以成功獲取JSON 格式的天氣數(shù)據(jù)之后,在weather.cpp 中進行JSON 數(shù)據(jù)解析,并通過QWidget類對象將數(shù)據(jù)顯示到UI 界面上,其中查詢天氣的部分代碼如下:
當新用戶注冊時,服務(wù)器通過socket 請求接收到用戶信息,并在服務(wù)器中建立SQLite3 格式的數(shù)據(jù)庫保存用戶信息。SQLite 是一款應用于嵌入式領(lǐng)域的小型數(shù)據(jù)庫,它和傳統(tǒng)數(shù)據(jù)庫之間最大的不同之處在于它的尺寸小和操作簡單,它保持了大部分傳統(tǒng)數(shù)據(jù)庫的特征。相比于SQL 數(shù)據(jù)庫更加輕量化且語句基本相同,不需要外部依賴且支持跨平臺操作。服務(wù)器與客戶端之間通過TCP 協(xié)議連接,首先設(shè)置服務(wù)器的監(jiān)聽套接字socket,然后綁定服務(wù)器的ip 地址與端口號,再設(shè)置socket 為被動監(jiān)聽,建立監(jiān)聽隊列。接到客戶端連接請求后,處理請求并進行3 次握手。最后需要對客戶端發(fā)來的JSON 格式的自定義通訊協(xié)議進行處理。其中建立連接過程如圖4所示。
圖4 客戶端與服務(wù)器建立連接流程Fig.4 Flow chart of establishing connection between client and server
服務(wù)器與客戶端連接成功時,服務(wù)器就會創(chuàng)建一個新的線程,由該線程讀取客戶端傳來的數(shù)據(jù)并執(zhí)行相應操作任務(wù),當操作任務(wù)執(zhí)行完畢之后,線程就退出。由此可見每次客戶端提交給服務(wù)器的連接次數(shù)頻繁且任務(wù)操作簡單、執(zhí)行時間短。因此服務(wù)器就處于一個不停的創(chuàng)建線程和銷毀線程的狀態(tài),非常消耗CPU 資源。所以需要運用thread-pool線程池模式來解決上述問題[12]。線程池的原理為在智能網(wǎng)關(guān)服務(wù)器啟動之后,首先就創(chuàng)建一個由一定數(shù)量的線程組成的隊列。這些線程由互斥量加鎖,在訪問完成后才會釋放鎖,目前處于阻塞狀態(tài),不占用CPU 資源。當服務(wù)器與客戶端連接成功后,需要執(zhí)行任務(wù)時,線程池將選擇一個空閑進程,將任務(wù)傳入此線程中運行。如果執(zhí)行任務(wù)請求過多,導致隊列中的所有線程都在上鎖狀態(tài),線程池會另外創(chuàng)建一些新的進程去處理新任務(wù),這些新進程也會加入到線程池之中。如果檢測到有很多線程處于阻塞狀態(tài),線程池將自動銷毀一些線程,從而減少內(nèi)存占用,回收系統(tǒng)資源。
以控制LED 燈為例,首先查看底板的硬件原理圖找到外設(shè)的控制方式,如圖5所示。再查看核心板硬件原理圖找到CPU 上控制LED 的引腳,如6圖所示。當PIO3_0 輸出低電平時,LED1 亮,輸出高電平時LED1 滅。所以在程序中通過函數(shù)void GPIOSet Value(uint32_t portNum,uint32_t bitPosi,uint32_t bitVal)設(shè)置PIO3_0 的輸出值來控制LED1的亮滅。比如使用函數(shù)GPIOSetValue(PORT3,0,0)將PIO3_0 輸出1,從而點亮LED1。
圖5 LED 硬件原理圖Fig.5 LED hardware schematic diagram
圖6 CPU 硬件原理圖Fig.6 CPU hardware schematic diagram
在家中安裝好智能網(wǎng)關(guān)、電器控制端后,打開客戶端,輸入智能網(wǎng)關(guān)IP 地址及端口號,測試能否成功建立TCP 連接并收發(fā)數(shù)據(jù),測試客戶端能否連上互聯(lián)網(wǎng)獲取天氣信息,測試溫濕度數(shù)據(jù)能否正常獲取。然后在客戶端APP 的電器設(shè)備控制界面手動點擊燈、風扇、蜂鳴器的開關(guān),看能否正常工作。如果手動測試中各項功能均正常,即可進入下一步自動控制模式測試。
進入自動控制模式后,智能家居系統(tǒng)可以根據(jù)當前的環(huán)境自動做出控制策略。如果溫濕度傳感器測得的溫度高于30℃或者濕度高于60%時,電器控制端會自動打開電風扇。當溫度低于26°C 或者濕度低于40%時,電器控制端會自動關(guān)閉電扇。當氣體傳感器檢測到CO 濃度高于50 ppm 時,蜂鳴器響提示用戶CO 濃度過高??蛻舳肆鞒倘鐖D7所示。
圖7 客戶端流程Fig.7 Client flow chart
本文設(shè)計了一套基于QT 和智能網(wǎng)關(guān)的智能家居系統(tǒng),詳細介紹了系統(tǒng)的整體架構(gòu),給出了客戶端的UI 界面QT 編寫方法、智能網(wǎng)關(guān)服務(wù)器的軟件實現(xiàn)方法以及電器控制端的配置方法。本系統(tǒng)不僅可以在客戶端上遠程控制家中的電器,更可以根據(jù)智能控制策略,自動控制電器的工作狀態(tài)。還可以連上互聯(lián)網(wǎng),獲取當?shù)氐奶鞖馇闆r、新聞資訊。經(jīng)測試,該系統(tǒng)運行流暢、界面簡潔明了、操作簡單,能夠?qū)崿F(xiàn)家中環(huán)境檢測、電器手動控制、電器自動控制,基本滿足智能家居的功能需求,對提高人們生活質(zhì)量水平有一定的工程實用價值[13]。