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