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