凌敏,羅浩武,鄒阿金,黃健明
(1.廣東海洋大學電子與信息工程學院通信工程系,湛江524088;2.廣東海洋大學電子與信息工程學院電子工程系,湛江524088)
隨著智能家居技術的逐步發展,家居智能化正在漸漸影響著人們的生活,各類智能家居設備可以給人們提供舒適、安全、方便的居住環境。移動互聯的高速發展,使得人們隨時隨地都可以通過移動設備與他人聯系。眼下正發展得如火如荼的5G 技術,憑借其速度快、網絡容量大、時延低等優點,勢必能徹底改變智能家居終端的部署與服務方式[1],從而使智能家居得到更進一步的推廣。
為了順應移動端技術的發展,便于在家中隨時使用手機操控家居設備,本文設計了一款可與家中設備進行交互的、集眾多傳統遙控器功能于一身的手機App,同時還具備語音控制、遠程監控等功能,使得用戶只需要一款App,就可以實現對家中所有設備進行監測與控制。
對于家居設備的監控管理,傳統的遙控器雖然在一定程度上可以滿足人們的需求,卻有其局限性。例如:不同的家電需要配備不同的遙控器,導致了遙控器的冗余,管理困難;除此之外,傳統遙控器所能控制的空間范圍是有限的,人們通常無法在室外通過遙控器操控家中設備,也無從知曉設備的運行狀況。
為了克服以上缺陷,本文提出一種解決方案,可集眾多傳統遙控器的功能于一體,方便用戶操作,提升用戶體驗。
本系統的整體架構是配置云服務器作為中轉站,硬件設備由支持TCP/IP 通信協議的ZigBee、Wi-Fi 和4G LTE 通信模塊組成;智能家居App 則通過Socket 與云服務器連接。二者通過同時連接云服務器實現遠程連接,從而進行通信和數據傳輸。系統總體架構如圖1所示。
通過結合4G LTE 無線通信技術和ZigBee 無線通信技術,ZigBee 終端節點采集室內的溫度、濕度、濕度、污染物的氣體濃度、光照強度、當前天氣狀況等信息,將這些信息聯網發送到云服務器中,云服務器再轉發到App。
App 接收到數據后經過處理顯示到界面上,用戶打開App 即可遠程獲取室內的溫度、濕度、煙霧濃度、光照強度等信息,同時能夠遠程改變室內各種家電的狀態、切換室內情景模式。通過這款智能家居App,用戶即使出門在外也能方便了解室內環境情況、改變室內家電狀態。

圖1 系統總體架構
本Android 客戶端的開發環境為Android Studio3.3,是谷歌公司在IntelliJ IDEA 的基礎上,推出的一個Android 集成開發工具。開發語言為面向對象的編程語言Java,故必須安裝支持Java 程序開發和運行的JDK(Java Development Kit),還需要有JRE(Java Runtime Environment)的支持[2]。數據庫方面,選擇了遵守ACID(即原子性、一致性、隔離性和持久性)的關系型數據庫管理系統SQLite,由于其零配置、速度快、占用內存小、開源等優點,使得其成為許多嵌入式設備存儲數據的第一選擇[3]。
Android 客戶端系統設計主要包括用戶UI 設計、通信模塊設計、數據庫設計、語音控制模塊設計四個模塊。
(1)用戶登錄注冊界面設計
登錄注冊布局文件均使用了RelativeLayout 作為整體布局,利用EditText 實現用戶名和密碼的輸入框,利用Button 來觸發注冊和登錄的具體操作。注冊和登錄界面如圖2 所示。

圖2 注冊和登錄界面
(2)用戶主控界面設計
本系統的主控界面按功能可分為控制界面和監控界面。
監控界面如圖3 所示,采用LinearLayout 作為整體布局,通過EditText 顯示家居設備的運行狀態及運行參數。
控制界面如圖4 所示,采用LinearLayout 作為整體布局,通過GridLayout 實現網格布局,使用RecylerView來實現內容的滾動。用戶可點擊按鈕,實現模式的切換和對家居設備的控制。
通信模塊基于TCP 協議和C/S 模型進行設計。TCP 協議全稱為傳輸控制協議(Transmission Control Protocol),因為其具有面向字節流和連接的服務、可靠傳輸、全雙工等特點[4],已經成為使用非常普遍的網絡協議;C/S 模型即客戶端(Client)和服務端(Server)模型,TCP 編程主要基于C/S 模型[4]。
智能家居App 的服務端創建一個服務程序,搭載在云服務器上,等待客戶端連接??蛻舳烁鶕蘒P 地址和端口與服務器建立連接后,對服務器的響應進行數據處理。

圖3 監控界面

圖4 控制界面
服務端實現步驟如下:
(1)實例化ServerSocket 對象,等待客戶端連接;
(2)與客戶端連接成功后,與之進行通信。
Android 客戶端實現步驟如下:
(1)開啟異步線程,通過IP、端口號與遠程服務器連接;
(2)從Socket 對象中獲取輸入輸出流從而進行數據的讀寫操作;
(3)基于數據,在異步線程中對UI 界面進行操作;
(4)讀寫行為結束,關閉輸入輸出流;
(5)關閉Socket。
服務端與客戶端通信流程如圖5 所示。

圖5 服務端與客戶端通信
SQLite 作為Android 操作系統體系結構的重要成員,對于所有Android 系統應用程序都可用。由于其可移植性好,Android 針對其封裝了專屬的API[5],例如SQLiteOpenHelper,通過該接口可以實現數據庫、表的創建與升級。不管如何進行封裝,本質上都是構建SQL 語句并且提交到SQLite 中執行,最終得到需求結果[3]。
為了可以靈活地操作和管理數據庫,App 的數據庫模塊選擇自定義一個繼承自SQLiteOpenHelper 的數據庫操作類DBHelper,在該類中實例化實際操作數據庫的SQLiteDatabase 對象,重寫繼承的方法,并封裝增刪改查等一系列操作。
具體操作如下:
(1)創建數據庫
定義全局變量SQLiteDatabase,在數據庫操作類的構造函數中,使用sqLiteDatabase = dBHelper.getWritableDatabase()創建一個可讀寫操作的數據庫。
(2)創建表
首先定義創建表的SQL 語句,在復用的onCreate(SQLiteDatabase sqLiteDatabase)中調用sqLiteDatabase.execSQL(sql)方法,將SQL 語句作為參數傳入,從而創建所需要的表。
(3)升級數據庫
當數據庫中的字段或者表結構有所變化的時候,重寫的onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion,int newVersion)方法會被調用,根據版本號升級數據庫。
(4)添加數據
為了避免繁瑣的操作,首先實例化一個可以存儲鍵值對數據的ContentValues 對象;然后將要添加進數據庫的數據封裝在ContentValues 實例里;最后執行SQLiteDatabase 的insert 函數將數據插入對應的表中。也可以自定義添加數據的SQL 語句,使用sqLiteDatabase.execSQL(sql)進行添加。
(5)查詢數據
使用sqLiteDatabase.query()遍歷表進行查詢。
(6)刪除數據
調用SQLiteDatabase 的delete()方法;也可以自定義刪除數據的SQL 語句,使用sqLiteDatabase.execSQL(sql)進行刪除。
表1 和表2 分別是該系統的用戶信息表和家居實時數據表。

表1 用戶信息表

表2 家居實時數據表
隨著物聯網的不斷普及,通過語音實現智能家居控制已成為一種發展趨勢,對于有老人和小孩的家庭來說,語音控制顯得更加輕松高效。百度提供的語音識別功能強大,不但可以將錄音轉化為文字,還在線支持普通話、英文、粵語和四川話[6],適用于多種情況;對于識別出來的文字,可以進行分詞及找出意圖和詞槽[6]。本App集成了百度語音識別的API,將用戶的語音轉化成計算機可讀的字符串發送給硬件設備,硬件與App 客戶端同時對用戶的語音輸入做出響應。
語音控制實現步驟如下:
(1)搭建開發環境
要使用百度官方提供的API,首先需要下載相應的jar 包和so 庫文件,并部署到項目正確的位置下。
(2)權限設置
為了實現語音控制操作,需要在AndroidManifest.xml 文件中設置允許App 使用麥克風、錄音、存儲等權限。若Android 系統版本為6.0 以上,還需要在源文件中動態申請權限。
(3)初始化并配置語音解析器
初始化:
SpeechSynthesizer mSpeechSynthesizer =SpeechSynthesizer.getInstance();
注冊自定義的監聽器:
mSpeechSynthesizer.setSpeechSynthesizerListener(new MyListnener());
配置在語音開發者平臺上注冊應用得到的appId、apiKey 和secretKey:
mSpeechSynthesizer.setAppId(appId);
mSpeechSynthesizer.setApiKey(appKey,secretKey);
初始化tts:
mSpeechSynthesizer.initTts(TtsMode.MIX);
(4)初始化EventManager
EventManager eventManager = EventManagerFactory.create(getContext(),”asr”);
(5)初始化事件監聽EventListener,在繼承的onEvent 方法中做回調處理;
(6)注冊自定義的監聽事件
EventManager.registerListener(eventListener);
(7)發送事件
識別結束后,調用eventManager.send(SpeechConstant.ASR_STOP,null,null,0,0)停止識別。將識別出的字符串轉換后發送給云服務器,云服務器再轉發到硬件設備上,后者接收到指令后會做出對應的處理。
隨著物聯網技術和5G 技術的不斷發展,智能家居在未來勢必會走進尋常百姓家,變得越來越平民化。本文開發的智能家居App 系統將軟件客戶端和硬件設備通過云服務器這座橋梁,實現了遠程連接,從而可以對家居設備進行遠程控制和監控,解決了市場上由于家居品牌不同、控制方式不同所帶來的種種問題,實現了只需下載安裝一款App,就可以與家中所有設備實現交互;配置的語音控制模塊,使得交互方式變得更方便和友好。