文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2015.10.043
中文引用格式: 陳瑋,秦會斌,曹曙光,等. 基于Android平臺的智能家居系統設計[J].電子技術應用,2015,41(10):158-160,164.
英文引用格式: Chen Wei,Qin Huibin,Cao Shuguang,et al. Design of smart home system based on Android[J].Application of Electronic Technique,2015,41(10):158-160,164.
0 引言
智能家居通過物聯網技術將家居子系統有機結合在一起形成高度智能化的智慧家庭[1]。物聯網、云概念的提出加速了智能家居的發展,Android智能手機和網絡技術的發展也給智能家居帶來了新的思路[2]。本文提出一個基于Android平臺的智能家居系統設計方案。以Android手機作為家居控制終端,通過云平臺轉發消息,真正實現遠程控制,將用戶信息、設備信息存在網關使不同客戶端能實現信息共享,實現動態添加、刪除動作。結合推送技術獲得良好的實時性。
1 系統總體框架圖
系統由客戶端、云計算中心、網關和家庭設備組成。系統框架如圖1所示。
客戶端實現對底層設備的控制方式包括:(1)內網控制:客戶端使用家庭網絡與網關直接通信,由網關控制底層設備;(2)外網控制:客戶端與網關不在同一網段內,客戶端指令由云服務器轉發給對應的網關,再由網關控制底層設備。采用內外網的通信方式,使得家庭寬帶網絡在不可使用的情況下,仍能通過內網通信實現對設備的控制,同時節省用戶數據流量[3]。每次運行客戶端軟件,會自動獲取網關處的配置信息、設備信息。網關同步底層設備狀態,當發生改變時由網關轉發給客戶端,使用戶能及時獲知底層設備的最新狀態。
2 客戶端設計與實現
2.1 客戶端功能說明
Android客戶端功能模塊如圖2所示。
設備管理是核心模塊,包括自定義房間和設備。可添加、刪除、修改房間,房間下可添加設備。點擊設備管理,通過后臺獲取當前用戶下的所有房間并以JSON格式返回,客戶端完成解析并顯示在界面上,點擊添加圖標進入添加房間界面,填寫房間名稱并將用戶ID與房間名稱發往網關并保存至數據庫。通過長按房間界面實現刪除與修改動作。點擊房間會顯示該房間下的所有設備,可添加設備,長按刪除設備,不提供修改設備動作。可以控制單個設備或區域內的所有設備,也可以對某個情景模式關聯的設備進行聯動控制。
2.2 客戶端框架
在Eclipse開發環境下,采用java語言,基于MVC模式對客戶端進行設計。視圖層View負責生成用戶界面,接收輸入并顯示結果。控制層Controller用于監聽用戶操作并作出反應。模型層Model定義了各種功能模塊,包括通信模塊、數據庫模塊、數據格式的封裝和解析模塊等[4],其中通信模塊是核心。
2.3 通信模塊
通信模塊負責客戶端和服務器或網關間的消息通信和鏈路維護。通信方式有:TCP/UDP、Http、MQTT推送。系統的通信協議如圖3。過程如下:
(1)第一次使用軟件,需在云端完成注冊,將用戶名和密碼以Http方式發到云端,并獲得服務器生成的用戶ID。同時在家庭WiFi環境下使網關加入局域網:將WiFi的SSID和密碼通過加密算法進行加密,將加密序列生成UDP數據包并發送出去,網關獲得該包并解析出WiFi相關信息,實現自動連接到路由器。
socket=new DatagramSocket();
sequence=sequence_init(account.toString(),
pswd.toString());//生成加密序列
while(flag){
for(int i=0; i<len; i++){String str = "";
for(int j = 0; j<sequence[i]; j++){str += "a";}
outPacket=new
DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName(s_gateway),4000);
socket.send(outPacket);}
socket.receive(receive);
(2)綁定網關。網關加入局域網后監聽客戶端廣播的數據包并返回自己的IP地址和TCP通信端口,客戶端通過TCP的Socket發送用戶ID到網關實現和網關的綁定,同時將用戶和網關的唯一標識號發送至云端實現綁定,這樣客戶端通過外網訪問云服務器時,服務器能轉發指令給對應的網關。
(3)以后每次使用軟件前,都要判斷當前網絡環境。即判斷客戶端和網關是否在同一網段內。若客戶端沒有接收到返回信息,說明它們不在一個網段內,則選擇通過Http方式連接云服務器。
(4)采用MQTT實現設備狀態的實時更新。訂閱客戶端所綁定的網關,網關同步底層設備狀態,當狀態改變時,由網關發送給MQTT server,再推送至客戶端。
系統的通信模塊活動圖如圖4所示。
2.4 通信模塊實現
2.4.1 Http通信
外網通信方式下,用戶登錄、獲取設備信息等由客戶端采用Http建立主動連接,服務器將結果以JSON格式返回。模塊中的Http請求用Android-Async-Http網絡請求庫實現,它是基于Apache HttpClient庫之上的一個異步網絡請求處理庫,網絡處理均基于Android的非UI線程,不阻塞UI操作,通過回調方法處理請求結果。
Android-Async-Http使用簡單,通過核心類AsyncHttp-
Client的實例就可以執行網絡請求,提供put、post等方法。登陸過程如下:
(1)創建AsyncHttpClient的實例
AsyncHttpClient client = new AsyncHttpClient();
(2)創建請求參數的封裝對象
RequestParams params = new RequestParams();
params.put("username", userName);
params.put("userpass", userPass);
(3)執行post方法
client.post(url, params,
new AsyncHttpResponseHandler (){
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody){
if(statusCode == 200){//成功
Toast.makeText(this,new String(responseBody) ).show();}}
Public void onFailure(int statusCode, Header[] headers,
byte[] responseBody Throwable error){
error.printStackTrace();//失敗
}}…);
new AsyncHttpResponseHandler()這個實例用于接收請求結果,一般重寫onSuccess()和onFailure()方法接收請求成功或失敗的消息。onSuccess()方法的參數responseBody為響應內容字節。
2.4.2 MQTT推送
MQTT是基于TCP/IP協議,專為物聯網開發的輕量級通信協議。該協議針對網絡差、計算能力低的設備做了特殊處理,使其能適應物聯網應用場景,有占用寬帶小、耗電量少等優勢。協議里有兩個主要角色:MQTT client和MQTT server。client向server訂閱某個話題就能收到發布到該話題的所有消息;client發布消息到某個話題下,則該話題的所有訂閱者都能收到[5]。通信時序圖如圖5所示。
本文通過MQTT實現客戶端實時獲得設備信息。客戶端對應MQTT client,是消息訂閱者。當狀態改變時,由設備將信息發送給網關,再由網關傳遞給MQTT server,再推送至訂閱了該網關的客戶端。使用MQTT,須將mqttv3.jar包加入Android應用程序中,它是IBM提供的MQTT協議的實現。APK調用該jar包提供的API接口,就能建立MQTT client和MQTT server的連接。流程如下[6]:
(1)創建一個MqttClient對象,參數包括MQTT server所在的IP地址和端口號、客戶端唯一標識clientid等。
MqttClient client=new MqttClient("tcp://123.57.219.126:
1883",
"test", new MemoryPersistence());
(2)創建MqttConnectOptions的對象并進行設置。用戶名和密碼用于連接MQTT server時進行驗證,心跳時間用于client定時發送心跳包,以便和server保持連接。
MqttConnectOptions options=new MqttConnectOptions();
options.setUserName(userName);//用戶名
options.setPassword(passWord.toCharArray());//密碼
options.setKeepAliveInterval(20);//心跳時間
(3)給客戶端設置回調。
client.setCallback(new MqttCallback() {
public void connectionLost(Throwable cause) {
//連接丟失后,進行重連}
public void deliveryComplete(IMqttDeliveryToken token){
//publish后會執行到這里}
public void messageArrived(String topicNam e,
MqttMessage message) throws Exception {
//subscribe后得到的消息會執行到這里面
Message msg = new Message();
msg.what = 1;
msg.obj = topicName+"---"+message.toString();
//通過handler傳遞給主線程進行UI更新
handler.sendMessage(msg);}});
(4)連接到MQTT server。
client.connect(options);
(5)訂閱某個網關的話題,接收網關發布到該話題下的消息,即設備信息。TOPICS是客戶端訂閱的話題,設為“gateway-example”。QOS_VALUES代表服務質量保證級別,1表示至少會發送一次消息。
client. subscribe(TOPICS, QOS_VALUES);
MQTT技術可以實現底層設備信息的實時更新,非常適合智能家居這種使用場景。
3 云計算中心
云計算將計算任務分布在大量計算機構成的資源池上,使各種應用系統按需獲取計算力、存儲空間和信息服務[7]。云計算作為一種新技術受到越來越多的親睞,很多學校、企業都建立了云計算數據中心。本文采用阿里云ECS(Elastic Compute Service)作為云計算中心,它是一種簡單高效、處理能力可彈性伸縮計算服務。服務器開發框架采用Jquery+SpringMVC+Mybatis+Ehcache。Mybatis是一個基于Java的持久層框架,支持普通SQL查詢。為了提高Mybatis的性能,需要添加第三方緩存組件支持,目前用的比較多的是Ehcache緩存。Ehcache性能強大、快速簡單,具有多種緩存策略。Mybatis與Ehcache整合可以提高性能,提高查詢效率,降低數據庫壓力。
4 功能測試
主要對設備的實時控制和狀態值的實時刷新進行了驗證。設備用繼電器模擬,使用安裝Android程序的手機作為客戶端進行功能測試。
在外網環境下,當客戶端連接服務器后,觸發設備開關按鈕,可以將控制命令由云中轉至網關,再轉發至底層設備控制繼電器開關,同時設備的最新狀態和傳感器值也會在客戶端進行實時刷新。測試結果如圖6,客戶端能保持和網關信息同步。
5 結論
本文簡要介紹了基于Android平臺的智能家居系統設計和關鍵技術。該系統結合了云計算和MQTT技術,實現遠程控制和信息同步,同時提供了內網控制,設備信息存在網關保證用戶信息共享。為市場化應用提供一種參考。
參考文獻
[1] 岳敬華.基于云服務的智能家居系統的研究與設計[D].杭州:杭州電子科技大學,2014.
[2] 吳浩權.基于Android的智能家居系統的研究與設計[D].杭州:浙江工業大學,2013.
[3] 崔荔.基于Android平臺的智能家居客戶端系統設計與實現[D].西安:長安大學,2013.
[4] 王運紅,何靈娜.基于Android平臺智能家居客戶端的設計和實現[J].機電工程,2014,31(8);1086-1089,1102.
[5] 關慶余.基于MQTT協議的移動社交網絡客戶端的設計與實現[D].沈陽:中國科學院研究生院(沈陽計算技術研究所),2014.
[6] 姜妮,張宇,趙志軍.基于MQTT物聯網消息推送系統[J].網絡新媒體技術,2014,3(6):62-64.
[7] 劉鵬.云計算[M].北京:電子工業出版社,2011.