基于A(yíng)ndroid的智能家居遠程控制系統設計
根據控制信息類(lèi)型設置flag子程序和根據flag值進(jìn)行相應處理的子程序主要是在初始化結束后完成系統功能,程序流程見(jiàn)圖4、圖5。
本文引用地址:http://dyxdggzs.com/article/245796.htm?

?
本系統集中器采用UART中斷方式和GSM模塊通信,當有數據返回集中器時(shí),會(huì )觸發(fā)UART中斷,在UART中斷處理程序中從U0RBR寄存器讀數據到GucRcvBur[Gu1Num]數組中。因為每次通信返回的字節數不相等,本系統在UART中斷處理函數中引入定時(shí)器中斷,在定時(shí)器中斷處理函數中設置GucRcvNew==1。即每次進(jìn)入UART中斷處理函數時(shí),開(kāi)啟定時(shí)器,UART在初始化時(shí)設定的中斷觸發(fā)點(diǎn)是1個(gè)字節,當所有返回字節都接收完成時(shí),定時(shí)器超時(shí)會(huì )觸發(fā)定時(shí)器中斷處理函數,設置GucRcvNew==1,主程序檢測到有數據返回。系統中設置定時(shí)器的觸發(fā)時(shí)間是0.5 s。
2 Android端設計
本系統采用Android應用程序的用戶(hù)友好型界面作為與用戶(hù)的接口,Android終端程序通過(guò)控件綁定方式對固定號碼進(jìn)行短信接收與發(fā)送,用戶(hù)只需通過(guò)點(diǎn)擊控件方式即可傳遞和接收控制信息,具體根據系統自定義通信協(xié)議發(fā)送的控制信息則完全被程序屏蔽,對用戶(hù)完全透明。其中發(fā)送短信和接收短息都會(huì )對Android系統的SQLite數據庫作出改動(dòng),需要對數據庫中的相關(guān)信息進(jìn)行刪除來(lái)保證對用戶(hù)透明。另外對于控件之間消息傳遞采用Android中的Handler機制。
2.1 發(fā)送控制信息
Android中發(fā)送消息主要通過(guò)SmsManager類(lèi)來(lái)實(shí)現,它繼承自java.lang.Object類(lèi)。其主要的方法說(shuō)明略——編者注。
發(fā)送短信程序首先調用SmsManager. getDefault()獲取SmsManager對象,然后通過(guò)PendingIntent的getActivity方法獲得一個(gè)Pending Intent對象。根據短信長(cháng)度Message.length()與短信長(cháng)度最大值比較來(lái)判斷是否需要調用smsManager.divideMessage(Message)將短信分割,然后再調用smsManager的sendTextMessage方法發(fā)送短信。代碼略——編者注。
發(fā)送短信模塊需要在清單文件AndroidManifest.xml中加入允許發(fā)送短信的權限:
2.2 接收返回信息
在A(yíng)ndroid端接收消息,可以采用兩種方式,一種通過(guò)BroadcastReceiver廣播接收器的方式,另外一種是通過(guò)觀(guān)察數據庫變化的內容觀(guān)察者類(lèi)ContentObserver來(lái)實(shí)現。
2.2.1 BroadcastReceiver接收短信
Android中的廣播是一種在應用程序之間傳遞信息的機制,在A(yíng)ndroid中有多種廣播,基于GSM短信的接收會(huì )產(chǎn)生一個(gè)廣播,應用程序可以監聽(tīng)這些廣播并根據廣播類(lèi)型作出相應的處理。BroadcastReceiver就是對接收到的廣播進(jìn)行過(guò)濾并響應的一類(lèi)組件。
當應用程序接收到廣播發(fā)送來(lái)的intent對象,BroadcastReceiver類(lèi)根據其注冊的廣播地址與接收到的intent對象進(jìn)行比較,如果匹配則調用BroadcastReceiver的onReceive()方法。
BroadcastReceiver類(lèi)的注冊有兩種方式,第一種是靜態(tài)注冊方式,即在A(yíng)ndroidManifest.xml文件中利用intent—filter指明需要過(guò)濾的廣播地址。靜態(tài)注冊方式會(huì )使程序始終監聽(tīng)廣播消息,并自動(dòng)調用程序繼承自BroadcastReceiver的類(lèi)。第二種是動(dòng)態(tài)注冊方式,其在activity中調用函數registerReceiver來(lái)注冊,當應用程序關(guān)閉后,就不在進(jìn)行監聽(tīng)。在動(dòng)態(tài)注冊的activity被銷(xiāo)毀前,需要調用unregist er Receiver解除注冊。
短消息廣播是一個(gè)有序廣播,即每次只被優(yōu)先級最高的接收者處理,然后由優(yōu)先級高的接收者傳遞到優(yōu)先級低的接收者。優(yōu)先級高的接收者可以終止這個(gè)廣播。對于有序廣播而言,動(dòng)態(tài)注冊的優(yōu)先級高于靜態(tài)注冊。
系統中定義SmsReceiver類(lèi)繼承自BroadcastReceiver類(lèi),采用動(dòng)態(tài)注冊的方式,在activity中用于動(dòng)態(tài)注冊的代碼略——編者注。
接收短信模塊需要在清單文件AndroidManifest.xml中加入允許發(fā)送短信的權限:。
2.2.2 ContentObserver接收短信
系統實(shí)際使用中,對于用BroadcastReceiver接收短信往往效果不好,主要因為用戶(hù)在A(yíng)ndroid終端安裝的第三方軟件,比如接收短信軟件、安全軟件等,這類(lèi)軟件從底層獲取系統權限,優(yōu)先級始終高于應用層軟件,導致應用層軟件不能優(yōu)先接收到廣播消息,所以在設計短信接收客戶(hù)端時(shí)一般采用監聽(tīng)數據庫方式。
當客戶(hù)端接收到短信后會(huì )將其插入SQLite數據庫,數據庫發(fā)生變化會(huì )觸發(fā)內容觀(guān)察者——ContentObserver。
ContentObserver類(lèi)似于一個(gè)觸發(fā)器,當其所觀(guān)察的Uri發(fā)生變化,這個(gè)觸發(fā)器就會(huì )觸發(fā)來(lái)執行相應的處理。主要方法的說(shuō)明略——編者注。
本系統在onChange的方法中,利用Context實(shí)例對象的getContentResolver方法獲得一個(gè)ContentResolver對象,然后調用Content Reso lver的query方法獲取當前數據庫中的短消息。具體代碼略——編者注。
對于得到的短消息通過(guò)Cursor對象的getColumnIndexOrThrow方法獲取其thread_id,id和body內容。對于在數據庫中的短消息,為了保證對用戶(hù)的透明傳輸,要調用ContentResolver對象的delete方法將收件箱中的短消息刪除。具體代碼略——編者注。
ContentObserver接收短信模塊需要在清單文件AndroidManifest.xml中加入允許接收短信的權限:
2.3 Handler機制
對于使用ContentObserver接收到房間溫度信息后,通過(guò)Android的Handler機制將信息傳送到主activity顯示。在A(yíng)ndroid中,主程序會(huì )創(chuàng )建一個(gè)Looper對象,在Looper對象初始化時(shí)候會(huì )創(chuàng )建一個(gè)消息隊列Message Queue用來(lái)存放線(xiàn)程放入的消息。用戶(hù)可以構造一個(gè)Handler對象與Looper溝通,以便將消息push到消息隊列中。當主線(xiàn)程檢測到有新消息進(jìn)入消息隊列后,首先判斷該消息對應的Handler,然后將消息分發(fā)到指定的Handler處理。
系統中通過(guò)ContentObserver繼承類(lèi)SMSContentObserver的構造函數將在activity中定義的Handler對象傳入SMSContentObserver中,然后調用Handler對象的obtainMessage方法獲得一個(gè)message對象,最后調用message對象的sendToTarget方法將控制消息發(fā)送到消息隊列,在activity中定義了handleMessage函數用來(lái)處理得到的控制消息。具體代碼略——編者注。
2.4 Android終端效果
Android客戶(hù)端控制界面見(jiàn)圖6,當點(diǎn)擊“獲取溫度”按鈕,Android端會(huì )自動(dòng)向系統控制端發(fā)送短信“1:O:O:00”,這樣系統控制端會(huì )檢測到是1類(lèi)控制信息,則返回每個(gè)房間溫度。
?

?
當需要設置某個(gè)房間空調的丁作方式,則通過(guò)點(diǎn)擊“設置空調”按鈕左側的“房間號”、“空調模式”和“設置溫度”等三個(gè)下拉列表(Spinner)來(lái)設置。如設置房間號為“房間二”,空調模式為“制冷”,設置溫度為“25℃”,然后點(diǎn)擊“設置空調”按鈕,安卓端會(huì )自動(dòng)發(fā)送2類(lèi)控制信息“2:2:2:25”到系統控制端,系統接收到控制信息會(huì )處理后返回設置是否成功消息。安卓端解析后將其顯示。當需要關(guān)閉某個(gè)房間空調,可以通過(guò)“關(guān)閉空淵”按鈕左側的“要關(guān)閉空調所在房間號”下拉列表實(shí)現,比如選擇“房間五”,然后點(diǎn)擊“關(guān)閉空調”按鈕,Android端即把3類(lèi)控制信息“3:5:0:00”發(fā)送到系統控制端,系統控制端處理后將空調關(guān)閉狀態(tài)返回。
結語(yǔ)
智能家居中的遠程控制方式有很多,本系統結合Androld終端的用戶(hù)友好型界面,采用自定義協(xié)議方式,設計了一套基于短消息的空調控制系統。在A(yíng)ndroid終端接收返回信息的兩種方式中,ContentObserver因其穩定性在工程實(shí)踐中使用較多,本系統最終也是采用了Cont entOb—server的方式,并取得很好的效果。本系統設計合理,性能穩定,對其他工程設計也具有一定參考價(jià)值。
評論