武一,張圣鵬,丁涵
( 河北工業大學電子信息工程學院,天津300401)
WU Yi,ZHANG Shengpeng,DING Han
(School of Information Engineering,Hebei University of Technology,Tianjin 300401,China)
在“互聯網+”模式快速發展的背景下,智能家居的發展更加依賴于互聯網,手機作為人們日常的通信工具,是智能家居系統中最便捷的控制終端。智能家居系統發展過程中一直存在一些亟待解決的問題,如異常報警抓拍圖像的存儲、短信報警信息模式單一以及Android 客戶端接入及控制等。結合人們對智能家居的發展需求,本文設計了一種“云+端”的智能家居模式[1],以嵌入式網關作為服務器端,以Android 手機作為客戶端的智能家居系統,并結合云平臺相關技術,實現云推送報警信息,報警圖像云存儲,提高系統的實用性。

圖1 系統總體結構
本設計主要分為網關、客戶端、家庭內部無線網絡。網關作為本系統的核心,通過串口接收來自ZigBee 網絡的數據,與家電控制模塊進行UDP 通信,移植了Boa 服務器和MJPG-streamer 視頻服務器,對客戶端的http請求進行響應,異常情況下向用戶手機推送報警消息并拍照上傳圖像云存儲。客戶端為Android 手機客戶端,可以通過用戶界面查看家庭的環境信息以及控制家電,根據情景設定不同模式,通過視頻監控遠程查看家庭實時畫面以及查詢Yeelink 平臺云存儲的報警圖像。家庭內部網絡以低功耗的ZigBee 模塊組成無線傳感網絡采集溫度、濕度、光照、煙霧、天燃氣、人體紅外等環境參數。家電控制模塊采用帶學習功能的紅外和315 MHz、433 MHz 射頻轉發模塊,給智能燈光開關、智能窗簾、空調發送發送控制命令,并且集成了WiFi 模塊,與網關通過UDP 協議進行通信。系統的結構如圖1。
該系統硬件主要為嵌入式網關模塊和ZigBee 模塊。嵌入式網關采用S3C2440AL 作為CPU 處理器,ARM920T 內核,主頻為400 MHz,最高可達533 MHz,配備256 Mbyte 的Nand Flash、2 Mbyte 的Nor Flash、64 Mbyte 的SDRAM 以及串口、網卡等基本模塊。串口與ZigBee 協調器連接,接收并存儲家庭環境數據。網關系統接入Internet 網絡,并接收來自Android客戶端的數據請求。ZigBee 模塊以TI 公司的CC2530 芯片為核心構成,擁有優秀的RF 性能和業界標準增強8051MCU 內核,支持一般的低功耗無線通信[2]。系統中ZigBee 協調器節點負責無線傳感器網絡的建立、網絡地址的分配以及匯聚傳感節點所采集的數據,通過UART 接口與網關相連,傳感器節點采集并發送各種環境和安防傳感器數據。
網關系統為整個系統的核心,負責整個系統的調度,包括監聽來自ZigBee 網絡的數據,響應客戶端的數據獲取請求和控制命令,其工作流程圖如圖2。

圖2 網關系統工作流程
基于智能家居系統的功能需求,本系統在嵌入式設備上移植Boa 服務器,接收并響應手機客戶端的http 請求,通過CGI 調用應用程序,進行設備控制。
CGI 是外部應用擴展應用程序與Web 服務器交互的一個標準接口[3]。按照CGI 標準編寫的外部擴展應用程序可以處理客戶端輸入的數據,從而完成客戶端與服務器的交互操作[4]。
本設計中,Web 服務器根據Android 客戶端請求調用CGI程序,CGI 程序檢查REQUEST_METHOD 環境變量以確定采用的方法,如果是POST 方法,則從標準輸入STDIN 讀取數據;如果是GET 方法,則從QUERY_STRING 環境變量讀取數據[5]。該系統中需要解碼數據格式為“變量名=值”鍵值對的格式:variable1=value&variable2=value2&..。變量名表示要發送命令對應的設備,變量值則對應要執行的命令。解析數據并根據命令不同,如果是環境數據查詢則執行查詢數據庫并返回數據;如果是家電控制命令則與射頻紅外轉發模塊建立UDP 連接,發送相應的控制命令,如果是模式設置,則操作相應的配置文件,設置對應的模式狀態。
本系統利用極光云推送服務,將家庭環境報警信息推送至用戶手機通知欄[6]。在嵌入式網關應用服務器上使用CURL 編程,調用JPush Remote API 遠程接口,對指定的用戶Android 手機客戶端來推送通知消息。Curl 編程基于Lib-Curl,主要采用callback function(回調函數)的形式完成傳輸任務,用戶在啟動傳輸前設置好各類參數和回調函數,當滿足條件時libcurl 將調用用戶的回調函數實現特定功能[7]。
根據極光推送向服務器端提供的API,利用libcurl 實現消息的推送。首先調用curl_global_init(CURL_GLOBAL_ALL)初始化libcurl,初始化所有可能的調用。用curl_easy_init()函數初始化一個CURL 的指針,開始一個會話。調用curl_easy_setopt()設置傳輸選項。使用curl_easy_setopt(curl,CURLOPT_URL,"https://api. jpush. cn/v2/push")設 置 訪問URL。
根據API 參數說明格式,結合智能家居系統應用需求,選擇和設定相應參數值。需要設定發送編號、接收者類型為廣播以及待發送的Android應用程序。然后由發送編號(sendno)、接收者類型(receiver_type)、發送范圍值(receiver_value)、API DevSecret(master_secret)4 個值拼接后,進行一次MD5 (32 位大寫)生成驗證串。
為方便用戶查看報警信息,設定發送消息的類型為通知(msg_type=1),即將消息推送到在Android 手機客戶端的通知欄。發送消息內容msg_content 為JSON 格式。例如人體紅外報警通知可設置為:msg_content={"n_content":"Thieft Alerting!"}。選擇Android 手機作為接收推送消息的平臺,設置被推送的報警信息在手機離線狀態下可保存一天的時長。使用curl_easy_setopt(curl,CURLOPT_POSTFIELDS,pForm)函數傳遞作為HTTP POST 操作的所有設置選項內容。最后curl_easy_perform(curl)函數完成curl_easy_setopt 指定的所有選項。
本系統拍照使用wget 工具,與視頻服務器連接并下載圖像到/sddisk 目錄。shell 腳本語句為:wget"http://192.168.7.25:8080/action=snapshot"-O MYMdir。
為方便上傳腳本程序查找圖像,抓拍的圖像以當前時間和“_alert”組合作為文件名,存儲在開發板的SD 卡中,節省開發板的存儲空間,并且當網絡異常無法上傳圖片時可以拔出內存卡,在PC 機上直接查看報警圖像。
通過shell 腳本,使用CURL 工具對圖像上傳URL 進行HTTP POST 請求,實現圖像的上傳。首先查找/sddisk 目錄下按時間排序最早并且以alert.jpg 結尾的圖像,然后通過curl設置相關選項,在請求頭信息添加U-ApiKey 即yeelink 分配給用戶的API KEY,設置上傳圖像的URL,對該URL 以POST方法進行HTTP 請求,以二進制數據形式上傳圖像至yeelink物聯網云平臺。檢測到有符合要求的圖片就上傳,上傳后并刪除該圖片。圖像上傳語句如下:UPimage="curl-request POST-data-binary@"MYMPIC"-header U-ApiKey:MYMUP_ApiKey-verbose MYMUP_URL"。
從實用的角度出發,Android 客戶端界面主要設計了環境數據查詢顯示、模式設置、家電控制、天氣預報、視頻監控、報警記錄查詢、使用幫助、推送消息設置模塊,實現用戶隨時隨地查詢家庭環境信息、控制家電及查看異常報警信息和異常報警圖像。
為方便手機客戶端與遠程Web 服務器通信,并及時顯示服務器響應的數據,本文采用在Android 客戶端使用webview組件加載含有JavaScript 腳本的網頁,利用Javascript 腳本與Android 方法相互調用,來實現UI 線程與網頁的數據交換,網頁中的Javascript 腳本中調用Jquery 庫的get()方法向遠程Web 服務器發送請求并獲取服務器響應數據。
在Java 代碼中通過webview.loadUrl("javascript:方法名()")調用Javascript 方法來傳遞由UI 用戶界面觸發的一些控制操作命令到Javascript 中處理,在Javascript 中調用Jquery.get()方法從遠程Web 服務器獲取數據或發送控制命令。從遠程服務器上獲取數據后傳遞給get()函數參數指定的函數,調用android 方法,將獲取的數據傳遞到UI 界面顯示。
嵌入式網關系統移植了MJPEG-streamer 視頻服務器,以input_uvc 為輸入組件,output_http 為輸出組件,根據輸出組件中的output_http 的http 通信協議,在Android 平臺上實現服務器連接和圖像數據解析并顯示。
手機客戶端利用SOCKET 編程實現了與MJPEG-streamer視頻服務器的http 數據傳輸協議。建立TCP 連接,并發出返回視頻流數據的http 請求,服務器在收到和解析請求消息后,返回一個HTTP 響應消息,客戶端解析HTTP 響應消息,判斷MIME 類型、內容、大小。通過邊界符定位到圖像數據部分,截取圖像數據向Handler 發送消息更新UI 顯示。
利用Yeelink 平臺提供的API 接口,Android 手機客戶端與Yeelink 平臺建立連接,進行數據交換。首先設置查詢的起始和結束時間,與Yeelink 建立連接,查詢該時間段內所有節點圖像的基本信息,從輸入流獲取數據,并解析,記錄對應的時間點信息。然后以時間點倒序查詢所有時間點的圖像內容,并在listview 組件中異步顯示。具體流程如圖3 所示。

圖3 客戶端與云平臺通信流程圖
Yeelink 平臺提供了查看規定時間段內的圖像信息的API。客戶端通過日期和時間對話框,設置查詢的起始時間點和截至時間點。對獲取圖像信息URL 的一個HTTP GET 請求,云平臺將返回所指定時間段內的圖像相關數據信息[8]。返回的信息包括各個圖像對應的時間節點、大小、類型等信息。把各個報警圖像數據的timestamp 取出作為獲取圖像內容URL http://api.yeelink.net/v1.0/device/<device_id >/sensor/<sensor_id >/photo/info/<key >中的key,來獲得所有節點的報警圖像內容。
本系統通過HttpURLConnection 實現簡單的基于URL 請求、響應。先實例化一個URL 對象,通過URL 的openConnection 實例化HttpURLConnection 對象。通過conn.setRequest-Method 設置請求方法GET 以及在頭信息中設置用戶訪問權限密碼"U-ApiKey"。建立連接并獲得輸入流,處理數據。所獲得圖像內容為二進制數據,然后通過Drawable d =Drawable.createFromStream(is,"src"),將數據流以Drawable 的形式返回顯示。
在智能家居Android 客戶端增加消息推送功能,當系統檢測到環境異常情況時,嵌入式網關推送報警信息到手機通知欄,點擊該消息打開Activity,顯示推送信息內容并連接視頻服務器,實時查看家庭環境畫面,方便用戶及時掌握家庭環境動態。
極光推送是一個端到端的推送服務,使得服務器端消息能夠及時地推送到終端用戶手機上。極光推送的Android SDK 用AlarmManager 來定時的發心跳,防止NAT 表失效,與服務器維護一個TCP 長連接,保證了數據送達的及時性。
在Android 應用中集成JPush Android SDK,為Android App 增加推送功能,接收通知消息。cn.jpush.android.api.JPushInterface 類包含了JPush SDK 提供所有的API 接口。在應用程序啟動時調用JPushInterface.init 初始化SDK。推送消息可以根據情況選擇接收與否。在應用程序界面設置相應按鈕操作來調用stopPush API 在不需要推送消息或者開會等免打擾時間段停止JPush 推送服務。停止推送服務后,JPush Service 停止在后臺運行,收不到推送消息。調用resumePush接口函數可以恢復被停止的推送服務。
JPush SDK 收到推送,通過廣播的方式,轉發給智能家居客戶端App。由于本課題接收來自嵌入式網關的通知消息,所以在AndroidManifest.xml 里配置表示收到了通知Push 和用戶點擊了通知的Receiver action。在BroadcastReceiver 類里設置點擊通知要打開的Activity。在Activity 中,通過JPushInterface.EXTRA_NOTIFICATION_TITLE、JPushInterface.EXTRA_ALERT 兩個Intent 參數分別獲取服務器推送下來的通知的標題和內容并顯示。
手機客戶端設置嵌入式家庭網關的IP 地址或域名,進入控制主界面如圖4 所示。點擊環境參數查看到實時家庭環境狀態,點擊空調、窗簾、電燈的家電設備,可進行相應的開關操作。模式設定界面,選擇無人模式,如果有人在室內活動,則手機通知欄顯示“Thieft Alerting”有人闖入的報警信息,如圖5,點擊該消息可以視頻監控界面實時查看家庭動態環境,如圖6 所示。點擊報警記錄查看報警時間、內容及報警場景的圖像,如圖7 所示。經測試,該系統能實現智能家居生活的基本功能。

圖4 主界面(截圖)

圖5 通知消息(截圖)

圖6 報警內容(截圖)

圖7 報警圖像記錄(截圖)
本文將嵌入式網關、Android 智能手機、消息云推送以及圖像云存儲等相關技術緊密結合,應用到智能家居系統設計中,解決了智能家居系統大規模數據的存儲、管理及移動終端的可靠接入訪問等問題,有很高市場應用價值。本設計對“云+端”智能家居模式的發展有一定的促進作用。
[1]朱敏玲,李寧.智能家居發展現狀及未來淺析[J].電視技術,2015,39(4):82-85.
[2]高立艾,劉少博,唐娟.基于ZigBee 和GPRS 的溫室環境無線監測系統設計[J].貴州農業科學,2013(4):168-170.
[3]焦雙偉,喻金科.嵌入式Web 服務器在控制系統中的設計與實現[J].計算機系統應用,2011,20(8):126-128.
[4]陳紅梅,陳靜,李雪冬.嵌入式Linux 下基于CGI 的動態Web 的實現[J].計算機時代,2010(4):4-5.
[5]盧靈,周賢軍.基于WiFi 的嵌入式視頻監控系統設計[J].電視技術,2013,37(1):157-160.
[6]極光推送.JPush Android SDK 集成指南[EB/OL].[2015-04-20].http://docs.jpush.io/guideline/android_guide/.
[7]劉聰.智能家庭網關Web 存儲代理技術的研究與實現[D].北京:北京郵電大學,2010.
[8]黃明亮.物聯網開放平臺的研究與設計[D].青島:中國海洋大學,2013.