文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2015.10.043
中文引用格式: 陳瑋,,秦會斌,曹曙光,等. 基于Android平臺的智能家居系統(tǒng)設計[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 引言
智能家居通過物聯(lián)網(wǎng)技術將家居子系統(tǒng)有機結合在一起形成高度智能化的智慧家庭[1],。物聯(lián)網(wǎng)、云概念的提出加速了智能家居的發(fā)展,,Android智能手機和網(wǎng)絡技術的發(fā)展也給智能家居帶來了新的思路[2],。本文提出一個基于Android平臺的智能家居系統(tǒng)設計方案。以Android手機作為家居控制終端,,通過云平臺轉發(fā)消息,,真正實現(xiàn)遠程控制,將用戶信息,、設備信息存在網(wǎng)關使不同客戶端能實現(xiàn)信息共享,,實現(xiàn)動態(tài)添加、刪除動作,。結合推送技術獲得良好的實時性,。
1 系統(tǒng)總體框架圖
系統(tǒng)由客戶端、云計算中心、網(wǎng)關和家庭設備組成,。系統(tǒng)框架如圖1所示,。
客戶端實現(xiàn)對底層設備的控制方式包括:(1)內網(wǎng)控制:客戶端使用家庭網(wǎng)絡與網(wǎng)關直接通信,由網(wǎng)關控制底層設備,;(2)外網(wǎng)控制:客戶端與網(wǎng)關不在同一網(wǎng)段內,,客戶端指令由云服務器轉發(fā)給對應的網(wǎng)關,再由網(wǎng)關控制底層設備,。采用內外網(wǎng)的通信方式,,使得家庭寬帶網(wǎng)絡在不可使用的情況下,仍能通過內網(wǎng)通信實現(xiàn)對設備的控制,,同時節(jié)省用戶數(shù)據(jù)流量[3],。每次運行客戶端軟件,會自動獲取網(wǎng)關處的配置信息,、設備信息,。網(wǎng)關同步底層設備狀態(tài),當發(fā)生改變時由網(wǎng)關轉發(fā)給客戶端,,使用戶能及時獲知底層設備的最新狀態(tài),。
2 客戶端設計與實現(xiàn)
2.1 客戶端功能說明
Android客戶端功能模塊如圖2所示。
設備管理是核心模塊,,包括自定義房間和設備,。可添加,、刪除,、修改房間,房間下可添加設備,。點擊設備管理,,通過后臺獲取當前用戶下的所有房間并以JSON格式返回,客戶端完成解析并顯示在界面上,,點擊添加圖標進入添加房間界面,,填寫房間名稱并將用戶ID與房間名稱發(fā)往網(wǎng)關并保存至數(shù)據(jù)庫。通過長按房間界面實現(xiàn)刪除與修改動作,。點擊房間會顯示該房間下的所有設備,,可添加設備,長按刪除設備,,不提供修改設備動作,。可以控制單個設備或區(qū)域內的所有設備,,也可以對某個情景模式關聯(lián)的設備進行聯(lián)動控制,。
2.2 客戶端框架
在Eclipse開發(fā)環(huán)境下,,采用java語言,基于MVC模式對客戶端進行設計,。視圖層View負責生成用戶界面,,接收輸入并顯示結果??刂茖覥ontroller用于監(jiān)聽用戶操作并作出反應,。模型層Model定義了各種功能模塊,包括通信模塊,、數(shù)據(jù)庫模塊,、數(shù)據(jù)格式的封裝和解析模塊等[4],其中通信模塊是核心,。
2.3 通信模塊
通信模塊負責客戶端和服務器或網(wǎng)關間的消息通信和鏈路維護,。通信方式有:TCP/UDP、Http,、MQTT推送,。系統(tǒng)的通信協(xié)議如圖3。過程如下:
(1)第一次使用軟件,,需在云端完成注冊,,將用戶名和密碼以Http方式發(fā)到云端,,并獲得服務器生成的用戶ID,。同時在家庭WiFi環(huán)境下使網(wǎng)關加入局域網(wǎng):將WiFi的SSID和密碼通過加密算法進行加密,將加密序列生成UDP數(shù)據(jù)包并發(fā)送出去,,網(wǎng)關獲得該包并解析出WiFi相關信息,,實現(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)關。網(wǎng)關加入局域網(wǎng)后監(jiān)聽客戶端廣播的數(shù)據(jù)包并返回自己的IP地址和TCP通信端口,,客戶端通過TCP的Socket發(fā)送用戶ID到網(wǎng)關實現(xiàn)和網(wǎng)關的綁定,,同時將用戶和網(wǎng)關的唯一標識號發(fā)送至云端實現(xiàn)綁定,這樣客戶端通過外網(wǎng)訪問云服務器時,,服務器能轉發(fā)指令給對應的網(wǎng)關,。
(3)以后每次使用軟件前,都要判斷當前網(wǎng)絡環(huán)境,。即判斷客戶端和網(wǎng)關是否在同一網(wǎng)段內,。若客戶端沒有接收到返回信息,說明它們不在一個網(wǎng)段內,,則選擇通過Http方式連接云服務器,。
(4)采用MQTT實現(xiàn)設備狀態(tài)的實時更新,。訂閱客戶端所綁定的網(wǎng)關,網(wǎng)關同步底層設備狀態(tài),,當狀態(tài)改變時,,由網(wǎng)關發(fā)送給MQTT server,再推送至客戶端,。
系統(tǒng)的通信模塊活動圖如圖4所示,。
2.4 通信模塊實現(xiàn)
2.4.1 Http通信
外網(wǎng)通信方式下,用戶登錄,、獲取設備信息等由客戶端采用Http建立主動連接,,服務器將結果以JSON格式返回。模塊中的Http請求用Android-Async-Http網(wǎng)絡請求庫實現(xiàn),,它是基于Apache HttpClient庫之上的一個異步網(wǎng)絡請求處理庫,,網(wǎng)絡處理均基于Android的非UI線程,不阻塞UI操作,,通過回調方法處理請求結果,。
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()這個實例用于接收請求結果,,一般重寫onSuccess()和onFailure()方法接收請求成功或失敗的消息,。onSuccess()方法的參數(shù)responseBody為響應內容字節(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)關,,再由網(wǎng)關傳遞給MQTT server,再推送至訂閱了該網(wǎng)關的客戶端,。使用MQTT,,須將mqttv3.jar包加入Android應用程序中,它是IBM提供的MQTT協(xié)議的實現(xiàn),。APK調用該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)給客戶端設置回調,。
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)關的話題,,接收網(wǎng)關發(fā)布到該話題下的消息,即設備信息,。TOPICS是客戶端訂閱的話題,,設為“gateway-example”。QOS_VALUES代表服務質量保證級別,,1表示至少會發(fā)送一次消息,。
client. subscribe(TOPICS, QOS_VALUES);
MQTT技術可以實現(xiàn)底層設備信息的實時更新,,非常適合智能家居這種使用場景,。
3 云計算中心
云計算將計算任務分布在大量計算機構成的資源池上,使各種應用系統(tǒng)按需獲取計算力,、存儲空間和信息服務[7],。云計算作為一種新技術受到越來越多的親睞,很多學校,、企業(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ā)設備開關按鈕,,可以將控制命令由云中轉至網(wǎng)關,,再轉發(fā)至底層設備控制繼電器開關,同時設備的最新狀態(tài)和傳感器值也會在客戶端進行實時刷新,。測試結果如圖6,,客戶端能保持和網(wǎng)關信息同步。
5 結論
本文簡要介紹了基于Android平臺的智能家居系統(tǒng)設計和關鍵技術,。該系統(tǒng)結合了云計算和MQTT技術,,實現(xiàn)遠程控制和信息同步,同時提供了內網(wǎng)控制,,設備信息存在網(wǎng)關保證用戶信息共享,。為市場化應用提供一種參考。
參考文獻
[1] 岳敬華.基于云服務的智能家居系統(tǒng)的研究與設計[D].杭州:杭州電子科技大學,2014.
[2] 吳浩權.基于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] 關慶余.基于MQTT協(xié)議的移動社交網(wǎng)絡客戶端的設計與實現(xiàn)[D].沈陽:中國科學院研究生院(沈陽計算技術研究所),,2014.
[6] 姜妮,張宇,,趙志軍.基于MQTT物聯(lián)網(wǎng)消息推送系統(tǒng)[J].網(wǎng)絡新媒體技術,,2014,3(6):62-64.
[7] 劉鵬.云計算[M].北京:電子工業(yè)出版社,,2011.