曾明輝,談宏華,邢栢豪,郭良等
(武漢工程大學 電氣信息學院,武漢430000)
生活中智能設備的運用越來越廣泛,僅靠物理開關控制家居的方案已經逐漸不能滿足人們的生活需求,運用智能家居控制系統,可以實現家居的遠程控制以及根據環境的變化自動調節工作狀態。嵌入式技術相當于一個小型的計算機系統,根據不同的功能需求,進行配套的軟硬件設計,可以實現各種智能化控制系統的特殊要求。智能家居將計算機、網絡、通信等技術有效地結合起來,使家中的各類電器設施形成一個有效的整體,并以既定的控制策略根據環境變化進行自動控制。所以嵌入式技術軟硬件靈活結合的特點與智能家居控制系統的需求相契合[1]。
QT 是一個跨平臺的C++圖形用戶界面應用程序開發框架,它包含了很多自定義的C++類庫,使用帶UI 界面的QWidget 類可快捷地實現可視化圖形界面APP 的編寫,使用QTcpSocket 類則可實現網絡通訊。智能網關運行Linux 系統,服務器程序使用線程池thread-pool 模式管理,防止在接收到一個新的請求時服務器反復創建線程、銷毀進程的情況出現,提高CPU 的使用效率。ZigBee 技術是最近發展起來的一種短距離無線通信技術,功耗低,被業界認為是最有可能應用在工控場合的無線方式,它使用2.4 GHz 波段,采用跳頻技術和擴頻技術[2]。
在智能家居系統中,一般首先需要通過傳感器檢測環境中的溫濕度、光照強度、氣體濃度,然后根據參數控制家中的電器設備如風扇、電燈、蜂鳴報警器等,還需要設計一個客戶端APP,用戶登錄后,可以遠程控制電器設備或者通過攝像頭遠程監控[3-5]。
系統主要由客戶端、智能網關、電器控制端組成。用戶在客戶端界面進行注冊、登錄操作后,進入控制界面,界面中顯示智能網關傳來的電器工作狀態信息。用戶可以在界面中控制每個電器設備、顯示攝像頭監控畫面,還可以獲取互聯網上的天氣數據。用戶端的操作以JSON 格式的自定義通信協議發送給智能網關服務器[6],智能網關服務器成功接收到信息后首先向客戶端返回成功接收標志位。以注冊功能為例,客戶端與智能網關之間的通信協議如表1所示[7]。

表1 客戶端與智能網關通訊協議Tab.1 Communication protocol between client and intelligent gateway
如果是用戶登錄、注冊、找回密碼操作時,對SQLITE數據庫進行操作。如果接收到的數據是電器控制,則將對應的設備地址以及自定義功能碼通過Modbus協議發送給電器控制端。如果控制端控制異常則會返回異常碼[8]。部分自定義協議如表2所示。

表2 自定義Modbus 協議Tab.2 Custom Modbus protocol
使用跨平臺GUI 開發工具QT 編寫客戶端APP。在使用Linux 系統的智能網關中編寫好服務器程序,與上位機之間通過TCP/IP 協議通訊;智能網關再連接ZigBee 模塊,使用Modbus 協議與電器控制器通訊。電器控制端使用Keil 配置CPU,獲取傳感器的數據以及對電器進行控制[9]。系統總體設計如圖1所示。

圖1 系統總體設計圖Fig.1 System overall design drawing
ZigBee 采用的是CEL 公司的ZICM2410 模塊,是集成CPU 的單片ZigBee 芯片,它集成了射頻收發器、MAC 和帶有FLASH 閃存的8051 內核,可支持與PC 的串口通訊以及1 Mbps 的無線通訊。Zig-Bee 網絡基于IEEE802.15.4 國際標準,具有低功耗、低速率、高可靠性的特點。
智能網關采用的SOC 是三星公司的Exynos4412,是一款采用了基于ARM 公司Cortex-A9 架構四核CPU 的低成本、低功耗芯片,采用32 nm 工藝制程,主頻可達1433 MHz 且集成了Mali-400MP 的GPU,GPU 主頻可達400 MHz。該芯片采用64/128 位內部總線架構并集成了眾多強大的硬件加速器。
2.2.1 處理器
電器控制端采用的SOC 是NXP 公司的LPC111x,是一款采用了ARM 公司Cortex-M0 架構的微控制器,可用于高集成度和低功耗的嵌入式應用。M 系列處理器相比于A 系列處理器更偏向于控制,只能運行比較簡單的操作系統(無法運行Linux),但是對于控制端足夠滿足要求,還可以節約成本、降低功耗。
2.2.2 傳感器
光敏傳感器使用的是ISL29002,這是一種具有集成光傳感器內置的整合性ADC 和標準IIC 接口的光線強度檢測傳感器,該設備讀取周圍環境光線水平位照度,輸出信號為數字量并且可以通過IIC協議訪問[10]。
溫濕度傳感器使用的是DHT11,是一款運用數字模塊采集技術和溫濕度傳感技術的溫濕度復合傳感器,輸出的信號為數字量。具有響應快、體積小、抗干擾能力強、性價比高等優點,在智能家居、物聯網領域應用廣泛[11]。
客戶端使用Windows 系統中的QT4.6 軟件編寫,在QT 應用程序中,首先在main.cpp 中創建QWidget 對象,QWidget 類代表一般窗口,同時繼承了QObect 和QPaintDevice 類,其他窗口都是從QWidget 類繼承出來的,然后在login.ui 文件中可視化編輯智能家居系統的登錄界面,如圖2所示。

圖2 登錄界面Fig.2 Login interface
將UI 界面的按鈕轉到槽,并添加QAbstract-Button 類對象中的clicked()事件,QT 軟件會自動生成槽函數聲明以及對應信號函數。如果要做到UI界面跳轉則需要先在父界面的頭文件中添加子界面的聲明,然后在父界面的cpp 文件中創建一個子界面類的對象,并調用該對象,同時關閉父界面的UI。
在login.cpp 中的部分代碼如下:

新用戶打開軟件后首先需要點擊注冊按鈕,進入注冊界面,輸入賬號、密碼、手機號即可注冊。此時客戶端APP 將已自定義結構體的方式將新用戶的信息通過socket 請求傳送給服務器,如果注冊成功服務器也會通過socket 返回注冊成功標識符。如果用戶選擇找回密碼則進入“找回密碼”界面,如圖3所示。在該界面中用戶需要填寫自己注冊時的賬號和手機號。如果填寫正確則進入修改密碼界面,用戶可以填寫原用戶名并輸入新密碼。

圖3 找回密碼界面Fig.3 Retrieve password interface
當用戶輸入正確的賬號密碼后,可進入智能家居管理系統的主界面,在主界面中可以手動控制LED、風扇、蜂鳴器的開關,實時顯示由溫濕度傳感器獲取的溫濕度數據,從廣域網中查詢可城市的天氣情況。查詢天氣情況時首先要在瀏覽器中的開發者工具中查看天氣資訊網的get 地址,并獲取其Body、Header 信息,使用在線HTTP 接口測試工具測試可以成功獲取JSON 格式的天氣數據之后,在weather.cpp 中進行JSON 數據解析,并通過QWidget類對象將數據顯示到UI 界面上,其中查詢天氣的部分代碼如下:

當新用戶注冊時,服務器通過socket 請求接收到用戶信息,并在服務器中建立SQLite3 格式的數據庫保存用戶信息。SQLite 是一款應用于嵌入式領域的小型數據庫,它和傳統數據庫之間最大的不同之處在于它的尺寸小和操作簡單,它保持了大部分傳統數據庫的特征。相比于SQL 數據庫更加輕量化且語句基本相同,不需要外部依賴且支持跨平臺操作。服務器與客戶端之間通過TCP 協議連接,首先設置服務器的監聽套接字socket,然后綁定服務器的ip 地址與端口號,再設置socket 為被動監聽,建立監聽隊列。接到客戶端連接請求后,處理請求并進行3 次握手。最后需要對客戶端發來的JSON 格式的自定義通訊協議進行處理。其中建立連接過程如圖4所示。

圖4 客戶端與服務器建立連接流程Fig.4 Flow chart of establishing connection between client and server
服務器與客戶端連接成功時,服務器就會創建一個新的線程,由該線程讀取客戶端傳來的數據并執行相應操作任務,當操作任務執行完畢之后,線程就退出。由此可見每次客戶端提交給服務器的連接次數頻繁且任務操作簡單、執行時間短。因此服務器就處于一個不停的創建線程和銷毀線程的狀態,非常消耗CPU 資源。所以需要運用thread-pool線程池模式來解決上述問題[12]。線程池的原理為在智能網關服務器啟動之后,首先就創建一個由一定數量的線程組成的隊列。這些線程由互斥量加鎖,在訪問完成后才會釋放鎖,目前處于阻塞狀態,不占用CPU 資源。當服務器與客戶端連接成功后,需要執行任務時,線程池將選擇一個空閑進程,將任務傳入此線程中運行。如果執行任務請求過多,導致隊列中的所有線程都在上鎖狀態,線程池會另外創建一些新的進程去處理新任務,這些新進程也會加入到線程池之中。如果檢測到有很多線程處于阻塞狀態,線程池將自動銷毀一些線程,從而減少內存占用,回收系統資源。
以控制LED 燈為例,首先查看底板的硬件原理圖找到外設的控制方式,如圖5所示。再查看核心板硬件原理圖找到CPU 上控制LED 的引腳,如6圖所示。當PIO3_0 輸出低電平時,LED1 亮,輸出高電平時LED1 滅。所以在程序中通過函數void GPIOSet Value(uint32_t portNum,uint32_t bitPosi,uint32_t bitVal)設置PIO3_0 的輸出值來控制LED1的亮滅。比如使用函數GPIOSetValue(PORT3,0,0)將PIO3_0 輸出1,從而點亮LED1。

圖5 LED 硬件原理圖Fig.5 LED hardware schematic diagram

圖6 CPU 硬件原理圖Fig.6 CPU hardware schematic diagram
在家中安裝好智能網關、電器控制端后,打開客戶端,輸入智能網關IP 地址及端口號,測試能否成功建立TCP 連接并收發數據,測試客戶端能否連上互聯網獲取天氣信息,測試溫濕度數據能否正常獲取。然后在客戶端APP 的電器設備控制界面手動點擊燈、風扇、蜂鳴器的開關,看能否正常工作。如果手動測試中各項功能均正常,即可進入下一步自動控制模式測試。
進入自動控制模式后,智能家居系統可以根據當前的環境自動做出控制策略。如果溫濕度傳感器測得的溫度高于30℃或者濕度高于60%時,電器控制端會自動打開電風扇。當溫度低于26°C 或者濕度低于40%時,電器控制端會自動關閉電扇。當氣體傳感器檢測到CO 濃度高于50 ppm 時,蜂鳴器響提示用戶CO 濃度過高??蛻舳肆鞒倘鐖D7所示。

圖7 客戶端流程Fig.7 Client flow chart
本文設計了一套基于QT 和智能網關的智能家居系統,詳細介紹了系統的整體架構,給出了客戶端的UI 界面QT 編寫方法、智能網關服務器的軟件實現方法以及電器控制端的配置方法。本系統不僅可以在客戶端上遠程控制家中的電器,更可以根據智能控制策略,自動控制電器的工作狀態。還可以連上互聯網,獲取當地的天氣情況、新聞資訊。經測試,該系統運行流暢、界面簡潔明了、操作簡單,能夠實現家中環境檢測、電器手動控制、電器自動控制,基本滿足智能家居的功能需求,對提高人們生活質量水平有一定的工程實用價值[13]。