武一,張圣鵬,丁涵
( 河北工業(yè)大學(xué)電子信息工程學(xué)院,天津300401)
WU Yi,ZHANG Shengpeng,DING Han
(School of Information Engineering,Hebei University of Technology,Tianjin 300401,China)
在“互聯(lián)網(wǎng)+”模式快速發(fā)展的背景下,智能家居的發(fā)展更加依賴于互聯(lián)網(wǎng),手機(jī)作為人們?nèi)粘5耐ㄐ殴ぞ?,是智能家居系統(tǒng)中最便捷的控制終端。智能家居系統(tǒng)發(fā)展過程中一直存在一些亟待解決的問題,如異常報警抓拍圖像的存儲、短信報警信息模式單一以及Android 客戶端接入及控制等。結(jié)合人們對智能家居的發(fā)展需求,本文設(shè)計了一種“云+端”的智能家居模式[1],以嵌入式網(wǎng)關(guān)作為服務(wù)器端,以Android 手機(jī)作為客戶端的智能家居系統(tǒng),并結(jié)合云平臺相關(guān)技術(shù),實現(xiàn)云推送報警信息,報警圖像云存儲,提高系統(tǒng)的實用性。
圖1 系統(tǒng)總體結(jié)構(gòu)
本設(shè)計主要分為網(wǎng)關(guān)、客戶端、家庭內(nèi)部無線網(wǎng)絡(luò)。網(wǎng)關(guān)作為本系統(tǒng)的核心,通過串口接收來自ZigBee 網(wǎng)絡(luò)的數(shù)據(jù),與家電控制模塊進(jìn)行UDP 通信,移植了Boa 服務(wù)器和MJPG-streamer 視頻服務(wù)器,對客戶端的http請求進(jìn)行響應(yīng),異常情況下向用戶手機(jī)推送報警消息并拍照上傳圖像云存儲??蛻舳藶锳ndroid 手機(jī)客戶端,可以通過用戶界面查看家庭的環(huán)境信息以及控制家電,根據(jù)情景設(shè)定不同模式,通過視頻監(jiān)控遠(yuǎn)程查看家庭實時畫面以及查詢Yeelink 平臺云存儲的報警圖像。家庭內(nèi)部網(wǎng)絡(luò)以低功耗的ZigBee 模塊組成無線傳感網(wǎng)絡(luò)采集溫度、濕度、光照、煙霧、天燃?xì)?、人體紅外等環(huán)境參數(shù)。家電控制模塊采用帶學(xué)習(xí)功能的紅外和315 MHz、433 MHz 射頻轉(zhuǎn)發(fā)模塊,給智能燈光開關(guān)、智能窗簾、空調(diào)發(fā)送發(fā)送控制命令,并且集成了WiFi 模塊,與網(wǎng)關(guān)通過UDP 協(xié)議進(jìn)行通信。系統(tǒng)的結(jié)構(gòu)如圖1。
該系統(tǒng)硬件主要為嵌入式網(wǎng)關(guān)模塊和ZigBee 模塊。嵌入式網(wǎng)關(guān)采用S3C2440AL 作為CPU 處理器,ARM920T 內(nèi)核,主頻為400 MHz,最高可達(dá)533 MHz,配備256 Mbyte 的Nand Flash、2 Mbyte 的Nor Flash、64 Mbyte 的SDRAM 以及串口、網(wǎng)卡等基本模塊。串口與ZigBee 協(xié)調(diào)器連接,接收并存儲家庭環(huán)境數(shù)據(jù)。網(wǎng)關(guān)系統(tǒng)接入Internet 網(wǎng)絡(luò),并接收來自Android客戶端的數(shù)據(jù)請求。ZigBee 模塊以TI 公司的CC2530 芯片為核心構(gòu)成,擁有優(yōu)秀的RF 性能和業(yè)界標(biāo)準(zhǔn)增強(qiáng)8051MCU 內(nèi)核,支持一般的低功耗無線通信[2]。系統(tǒng)中ZigBee 協(xié)調(diào)器節(jié)點(diǎn)負(fù)責(zé)無線傳感器網(wǎng)絡(luò)的建立、網(wǎng)絡(luò)地址的分配以及匯聚傳感節(jié)點(diǎn)所采集的數(shù)據(jù),通過UART 接口與網(wǎng)關(guān)相連,傳感器節(jié)點(diǎn)采集并發(fā)送各種環(huán)境和安防傳感器數(shù)據(jù)。
網(wǎng)關(guān)系統(tǒng)為整個系統(tǒng)的核心,負(fù)責(zé)整個系統(tǒng)的調(diào)度,包括監(jiān)聽來自ZigBee 網(wǎng)絡(luò)的數(shù)據(jù),響應(yīng)客戶端的數(shù)據(jù)獲取請求和控制命令,其工作流程圖如圖2。
圖2 網(wǎng)關(guān)系統(tǒng)工作流程
基于智能家居系統(tǒng)的功能需求,本系統(tǒng)在嵌入式設(shè)備上移植Boa 服務(wù)器,接收并響應(yīng)手機(jī)客戶端的http 請求,通過CGI 調(diào)用應(yīng)用程序,進(jìn)行設(shè)備控制。
CGI 是外部應(yīng)用擴(kuò)展應(yīng)用程序與Web 服務(wù)器交互的一個標(biāo)準(zhǔn)接口[3]。按照CGI 標(biāo)準(zhǔn)編寫的外部擴(kuò)展應(yīng)用程序可以處理客戶端輸入的數(shù)據(jù),從而完成客戶端與服務(wù)器的交互操作[4]。
本設(shè)計中,Web 服務(wù)器根據(jù)Android 客戶端請求調(diào)用CGI程序,CGI 程序檢查REQUEST_METHOD 環(huán)境變量以確定采用的方法,如果是POST 方法,則從標(biāo)準(zhǔn)輸入STDIN 讀取數(shù)據(jù);如果是GET 方法,則從QUERY_STRING 環(huán)境變量讀取數(shù)據(jù)[5]。該系統(tǒng)中需要解碼數(shù)據(jù)格式為“變量名=值”鍵值對的格式:variable1=value&variable2=value2&..。變量名表示要發(fā)送命令對應(yīng)的設(shè)備,變量值則對應(yīng)要執(zhí)行的命令。解析數(shù)據(jù)并根據(jù)命令不同,如果是環(huán)境數(shù)據(jù)查詢則執(zhí)行查詢數(shù)據(jù)庫并返回數(shù)據(jù);如果是家電控制命令則與射頻紅外轉(zhuǎn)發(fā)模塊建立UDP 連接,發(fā)送相應(yīng)的控制命令,如果是模式設(shè)置,則操作相應(yīng)的配置文件,設(shè)置對應(yīng)的模式狀態(tài)。
本系統(tǒng)利用極光云推送服務(wù),將家庭環(huán)境報警信息推送至用戶手機(jī)通知欄[6]。在嵌入式網(wǎng)關(guān)應(yīng)用服務(wù)器上使用CURL 編程,調(diào)用JPush Remote API 遠(yuǎn)程接口,對指定的用戶Android 手機(jī)客戶端來推送通知消息。Curl 編程基于Lib-Curl,主要采用callback function(回調(diào)函數(shù))的形式完成傳輸任務(wù),用戶在啟動傳輸前設(shè)置好各類參數(shù)和回調(diào)函數(shù),當(dāng)滿足條件時libcurl 將調(diào)用用戶的回調(diào)函數(shù)實現(xiàn)特定功能[7]。
根據(jù)極光推送向服務(wù)器端提供的API,利用libcurl 實現(xiàn)消息的推送。首先調(diào)用curl_global_init(CURL_GLOBAL_ALL)初始化libcurl,初始化所有可能的調(diào)用。用curl_easy_init()函數(shù)初始化一個CURL 的指針,開始一個會話。調(diào)用curl_easy_setopt()設(shè)置傳輸選項。使用curl_easy_setopt(curl,CURLOPT_URL,"https://api. jpush. cn/v2/push")設(shè) 置 訪問URL。
根據(jù)API 參數(shù)說明格式,結(jié)合智能家居系統(tǒng)應(yīng)用需求,選擇和設(shè)定相應(yīng)參數(shù)值。需要設(shè)定發(fā)送編號、接收者類型為廣播以及待發(fā)送的Android應(yīng)用程序。然后由發(fā)送編號(sendno)、接收者類型(receiver_type)、發(fā)送范圍值(receiver_value)、API DevSecret(master_secret)4 個值拼接后,進(jìn)行一次MD5 (32 位大寫)生成驗證串。
為方便用戶查看報警信息,設(shè)定發(fā)送消息的類型為通知(msg_type=1),即將消息推送到在Android 手機(jī)客戶端的通知欄。發(fā)送消息內(nèi)容msg_content 為JSON 格式。例如人體紅外報警通知可設(shè)置為:msg_content={"n_content":"Thieft Alerting!"}。選擇Android 手機(jī)作為接收推送消息的平臺,設(shè)置被推送的報警信息在手機(jī)離線狀態(tài)下可保存一天的時長。使用curl_easy_setopt(curl,CURLOPT_POSTFIELDS,pForm)函數(shù)傳遞作為HTTP POST 操作的所有設(shè)置選項內(nèi)容。最后curl_easy_perform(curl)函數(shù)完成curl_easy_setopt 指定的所有選項。
本系統(tǒng)拍照使用wget 工具,與視頻服務(wù)器連接并下載圖像到/sddisk 目錄。shell 腳本語句為:wget"http://192.168.7.25:8080/action=snapshot"-O MYMdir。
為方便上傳腳本程序查找圖像,抓拍的圖像以當(dāng)前時間和“_alert”組合作為文件名,存儲在開發(fā)板的SD 卡中,節(jié)省開發(fā)板的存儲空間,并且當(dāng)網(wǎng)絡(luò)異常無法上傳圖片時可以拔出內(nèi)存卡,在PC 機(jī)上直接查看報警圖像。
通過shell 腳本,使用CURL 工具對圖像上傳URL 進(jìn)行HTTP POST 請求,實現(xiàn)圖像的上傳。首先查找/sddisk 目錄下按時間排序最早并且以alert.jpg 結(jié)尾的圖像,然后通過curl設(shè)置相關(guān)選項,在請求頭信息添加U-ApiKey 即yeelink 分配給用戶的API KEY,設(shè)置上傳圖像的URL,對該URL 以POST方法進(jìn)行HTTP 請求,以二進(jìn)制數(shù)據(jù)形式上傳圖像至yeelink物聯(lián)網(wǎng)云平臺。檢測到有符合要求的圖片就上傳,上傳后并刪除該圖片。圖像上傳語句如下:UPimage="curl-request POST-data-binary@"MYMPIC"-h(huán)eader U-ApiKey:MYMUP_ApiKey-verbose MYMUP_URL"。
從實用的角度出發(fā),Android 客戶端界面主要設(shè)計了環(huán)境數(shù)據(jù)查詢顯示、模式設(shè)置、家電控制、天氣預(yù)報、視頻監(jiān)控、報警記錄查詢、使用幫助、推送消息設(shè)置模塊,實現(xiàn)用戶隨時隨地查詢家庭環(huán)境信息、控制家電及查看異常報警信息和異常報警圖像。
為方便手機(jī)客戶端與遠(yuǎn)程Web 服務(wù)器通信,并及時顯示服務(wù)器響應(yīng)的數(shù)據(jù),本文采用在Android 客戶端使用webview組件加載含有JavaScript 腳本的網(wǎng)頁,利用Javascript 腳本與Android 方法相互調(diào)用,來實現(xiàn)UI 線程與網(wǎng)頁的數(shù)據(jù)交換,網(wǎng)頁中的Javascript 腳本中調(diào)用Jquery 庫的get()方法向遠(yuǎn)程Web 服務(wù)器發(fā)送請求并獲取服務(wù)器響應(yīng)數(shù)據(jù)。
在Java 代碼中通過webview.loadUrl("javascript:方法名()")調(diào)用Javascript 方法來傳遞由UI 用戶界面觸發(fā)的一些控制操作命令到Javascript 中處理,在Javascript 中調(diào)用Jquery.get()方法從遠(yuǎn)程Web 服務(wù)器獲取數(shù)據(jù)或發(fā)送控制命令。從遠(yuǎn)程服務(wù)器上獲取數(shù)據(jù)后傳遞給get()函數(shù)參數(shù)指定的函數(shù),調(diào)用android 方法,將獲取的數(shù)據(jù)傳遞到UI 界面顯示。
嵌入式網(wǎng)關(guān)系統(tǒng)移植了MJPEG-streamer 視頻服務(wù)器,以input_uvc 為輸入組件,output_http 為輸出組件,根據(jù)輸出組件中的output_http 的http 通信協(xié)議,在Android 平臺上實現(xiàn)服務(wù)器連接和圖像數(shù)據(jù)解析并顯示。
手機(jī)客戶端利用SOCKET 編程實現(xiàn)了與MJPEG-streamer視頻服務(wù)器的http 數(shù)據(jù)傳輸協(xié)議。建立TCP 連接,并發(fā)出返回視頻流數(shù)據(jù)的http 請求,服務(wù)器在收到和解析請求消息后,返回一個HTTP 響應(yīng)消息,客戶端解析HTTP 響應(yīng)消息,判斷MIME 類型、內(nèi)容、大小。通過邊界符定位到圖像數(shù)據(jù)部分,截取圖像數(shù)據(jù)向Handler 發(fā)送消息更新UI 顯示。
利用Yeelink 平臺提供的API 接口,Android 手機(jī)客戶端與Yeelink 平臺建立連接,進(jìn)行數(shù)據(jù)交換。首先設(shè)置查詢的起始和結(jié)束時間,與Yeelink 建立連接,查詢該時間段內(nèi)所有節(jié)點(diǎn)圖像的基本信息,從輸入流獲取數(shù)據(jù),并解析,記錄對應(yīng)的時間點(diǎn)信息。然后以時間點(diǎn)倒序查詢所有時間點(diǎn)的圖像內(nèi)容,并在listview 組件中異步顯示。具體流程如圖3 所示。
圖3 客戶端與云平臺通信流程圖
Yeelink 平臺提供了查看規(guī)定時間段內(nèi)的圖像信息的API??蛻舳送ㄟ^日期和時間對話框,設(shè)置查詢的起始時間點(diǎn)和截至?xí)r間點(diǎn)。對獲取圖像信息URL 的一個HTTP GET 請求,云平臺將返回所指定時間段內(nèi)的圖像相關(guān)數(shù)據(jù)信息[8]。返回的信息包括各個圖像對應(yīng)的時間節(jié)點(diǎn)、大小、類型等信息。把各個報警圖像數(shù)據(jù)的timestamp 取出作為獲取圖像內(nèi)容URL http://api.yeelink.net/v1.0/device/<device_id >/sensor/<sensor_id >/photo/info/<key >中的key,來獲得所有節(jié)點(diǎn)的報警圖像內(nèi)容。
本系統(tǒng)通過HttpURLConnection 實現(xiàn)簡單的基于URL 請求、響應(yīng)。先實例化一個URL 對象,通過URL 的openConnection 實例化HttpURLConnection 對象。通過conn.setRequest-Method 設(shè)置請求方法GET 以及在頭信息中設(shè)置用戶訪問權(quán)限密碼"U-ApiKey"。建立連接并獲得輸入流,處理數(shù)據(jù)。所獲得圖像內(nèi)容為二進(jìn)制數(shù)據(jù),然后通過Drawable d =Drawable.createFromStream(is,"src"),將數(shù)據(jù)流以Drawable 的形式返回顯示。
在智能家居Android 客戶端增加消息推送功能,當(dāng)系統(tǒng)檢測到環(huán)境異常情況時,嵌入式網(wǎng)關(guān)推送報警信息到手機(jī)通知欄,點(diǎn)擊該消息打開Activity,顯示推送信息內(nèi)容并連接視頻服務(wù)器,實時查看家庭環(huán)境畫面,方便用戶及時掌握家庭環(huán)境動態(tài)。
極光推送是一個端到端的推送服務(wù),使得服務(wù)器端消息能夠及時地推送到終端用戶手機(jī)上。極光推送的Android SDK 用AlarmManager 來定時的發(fā)心跳,防止NAT 表失效,與服務(wù)器維護(hù)一個TCP 長連接,保證了數(shù)據(jù)送達(dá)的及時性。
在Android 應(yīng)用中集成JPush Android SDK,為Android App 增加推送功能,接收通知消息。cn.jpush.android.api.JPushInterface 類包含了JPush SDK 提供所有的API 接口。在應(yīng)用程序啟動時調(diào)用JPushInterface.init 初始化SDK。推送消息可以根據(jù)情況選擇接收與否。在應(yīng)用程序界面設(shè)置相應(yīng)按鈕操作來調(diào)用stopPush API 在不需要推送消息或者開會等免打擾時間段停止JPush 推送服務(wù)。停止推送服務(wù)后,JPush Service 停止在后臺運(yùn)行,收不到推送消息。調(diào)用resumePush接口函數(shù)可以恢復(fù)被停止的推送服務(wù)。
JPush SDK 收到推送,通過廣播的方式,轉(zhuǎn)發(fā)給智能家居客戶端App。由于本課題接收來自嵌入式網(wǎng)關(guān)的通知消息,所以在AndroidManifest.xml 里配置表示收到了通知Push 和用戶點(diǎn)擊了通知的Receiver action。在BroadcastReceiver 類里設(shè)置點(diǎn)擊通知要打開的Activity。在Activity 中,通過JPushInterface.EXTRA_NOTIFICATION_TITLE、JPushInterface.EXTRA_ALERT 兩個Intent 參數(shù)分別獲取服務(wù)器推送下來的通知的標(biāo)題和內(nèi)容并顯示。
手機(jī)客戶端設(shè)置嵌入式家庭網(wǎng)關(guān)的IP 地址或域名,進(jìn)入控制主界面如圖4 所示。點(diǎn)擊環(huán)境參數(shù)查看到實時家庭環(huán)境狀態(tài),點(diǎn)擊空調(diào)、窗簾、電燈的家電設(shè)備,可進(jìn)行相應(yīng)的開關(guān)操作。模式設(shè)定界面,選擇無人模式,如果有人在室內(nèi)活動,則手機(jī)通知欄顯示“Thieft Alerting”有人闖入的報警信息,如圖5,點(diǎn)擊該消息可以視頻監(jiān)控界面實時查看家庭動態(tài)環(huán)境,如圖6 所示。點(diǎn)擊報警記錄查看報警時間、內(nèi)容及報警場景的圖像,如圖7 所示。經(jīng)測試,該系統(tǒng)能實現(xiàn)智能家居生活的基本功能。
圖4 主界面(截圖)
圖5 通知消息(截圖)
圖6 報警內(nèi)容(截圖)
圖7 報警圖像記錄(截圖)
本文將嵌入式網(wǎng)關(guān)、Android 智能手機(jī)、消息云推送以及圖像云存儲等相關(guān)技術(shù)緊密結(jié)合,應(yīng)用到智能家居系統(tǒng)設(shè)計中,解決了智能家居系統(tǒng)大規(guī)模數(shù)據(jù)的存儲、管理及移動終端的可靠接入訪問等問題,有很高市場應(yīng)用價值。本設(shè)計對“云+端”智能家居模式的發(fā)展有一定的促進(jìn)作用。
[1]朱敏玲,李寧.智能家居發(fā)展現(xiàn)狀及未來淺析[J].電視技術(shù),2015,39(4):82-85.
[2]高立艾,劉少博,唐娟.基于ZigBee 和GPRS 的溫室環(huán)境無線監(jiān)測系統(tǒng)設(shè)計[J].貴州農(nóng)業(yè)科學(xué),2013(4):168-170.
[3]焦雙偉,喻金科.嵌入式Web 服務(wù)器在控制系統(tǒng)中的設(shè)計與實現(xiàn)[J].計算機(jī)系統(tǒng)應(yīng)用,2011,20(8):126-128.
[4]陳紅梅,陳靜,李雪冬.嵌入式Linux 下基于CGI 的動態(tài)Web 的實現(xiàn)[J].計算機(jī)時代,2010(4):4-5.
[5]盧靈,周賢軍.基于WiFi 的嵌入式視頻監(jiān)控系統(tǒng)設(shè)計[J].電視技術(shù),2013,37(1):157-160.
[6]極光推送.JPush Android SDK 集成指南[EB/OL].[2015-04-20].http://docs.jpush.io/guideline/android_guide/.
[7]劉聰.智能家庭網(wǎng)關(guān)Web 存儲代理技術(shù)的研究與實現(xiàn)[D].北京:北京郵電大學(xué),2010.
[8]黃明亮.物聯(lián)網(wǎng)開放平臺的研究與設(shè)計[D].青島:中國海洋大學(xué),2013.