新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Android的智能家居遠程控制系統設計

        基于Android的智能家居遠程控制系統設計

        作者: 時間:2014-04-22 來源:網絡 收藏

        根據控制信息類型設置flag子程序和根據flag值進行相應處理的子程序主要是在初始化結束后完成系統功能,程序流程見圖4、圖5。

        本文引用地址:http://www.104case.com/article/245796.htm

        ?

        一種Android端智能家居遠程控制方案的實現

        ?

        本系統集中器采用UART中斷方式和GSM模塊通信,當有數據返回集中器時,會觸發UART中斷,在UART中斷處理程序中從U0RBR寄存器讀數據到GucRcvBur[Gu1Num]數組中。因為每次通信返回的字節數不相等,本系統在UART中斷處理函數中引入定時器中斷,在定時器中斷處理函數中設置GucRcvNew==1。即每次進入UART中斷處理函數時,開啟定時器,UART在初始化時設定的中斷觸發點是1個字節,當所有返回字節都接收完成時,定時器超時會觸發定時器中斷處理函數,設置GucRcvNew==1,主程序檢測到有數據返回。系統中設置定時器的觸發時間是0.5 s。

        2 端設計

        本系統采用應用程序的用戶友好型界面作為與用戶的接口,終端程序通過控件綁定方式對固定號碼進行短信接收與發送,用戶只需通過點擊控件方式即可傳遞和接收控制信息,具體根據系統自定義通信協議發送的控制信息則完全被程序屏蔽,對用戶完全透明。其中發送短信和接收短息都會對Android系統的SQLite數據庫作出改動,需要對數據庫中的相關信息進行刪除來保證對用戶透明。另外對于控件之間消息傳遞采用Android中的Handler機制。

        2.1 發送控制信息

        Android中發送消息主要通過SmsManager類來實現,它繼承自java.lang.Object類。其主要的方法說明略——編者注。

        發送短信程序首先調用SmsManager. getDefault()獲取SmsManager對象,然后通過PendingIntent的getActivity方法獲得一個Pending Intent對象。根據短信長度Message.length()與短信長度最大值比較來判斷是否需要調用smsManager.divideMessage(Message)將短信分割,然后再調用smsManager的sendTextMessage方法發送短信。代碼略——編者注。

        發送短信模塊需要在清單文件AndroidManifest.xml中加入允許發送短信的權限:

        2.2 接收返回信息

        在Android端接收消息,可以采用兩種方式,一種通過BroadcastReceiver廣播接收器的方式,另外一種是通過觀察數據庫變化的內容觀察者類ContentObserver來實現。

        2.2.1 BroadcastReceiver接收短信

        Android中的廣播是一種在應用程序之間傳遞信息的機制,在Android中有多種廣播,基于GSM短信的接收會產生一個廣播,應用程序可以監聽這些廣播并根據廣播類型作出相應的處理。BroadcastReceiver就是對接收到的廣播進行過濾并響應的一類組件。

        當應用程序接收到廣播發送來的intent對象,BroadcastReceiver類根據其注冊的廣播地址與接收到的intent對象進行比較,如果匹配則調用BroadcastReceiver的onReceive()方法。

        BroadcastReceiver類的注冊有兩種方式,第一種是靜態注冊方式,即在AndroidManifest.xml文件中利用intent—filter指明需要過濾的廣播地址。靜態注冊方式會使程序始終監聽廣播消息,并自動調用程序繼承自BroadcastReceiver的類。第二種是動態注冊方式,其在activity中調用函數registerReceiver來注冊,當應用程序關閉后,就不在進行監聽。在動態注冊的activity被銷毀前,需要調用unregist er Receiver解除注冊。

        短消息廣播是一個有序廣播,即每次只被優先級最高的接收者處理,然后由優先級高的接收者傳遞到優先級低的接收者。優先級高的接收者可以終止這個廣播。對于有序廣播而言,動態注冊的優先級高于靜態注冊。

        系統中定義SmsReceiver類繼承自BroadcastReceiver類,采用動態注冊的方式,在activity中用于動態注冊的代碼略——編者注。

        接收短信模塊需要在清單文件AndroidManifest.xml中加入允許發送短信的權限:。

        2.2.2 ContentObserver接收短信

        系統實際使用中,對于用BroadcastReceiver接收短信往往效果不好,主要因為用戶在Android終端安裝的第三方軟件,比如接收短信軟件、安全軟件等,這類軟件從底層獲取系統權限,優先級始終高于應用層軟件,導致應用層軟件不能優先接收到廣播消息,所以在設計短信接收客戶端時一般采用監聽數據庫方式。

        當客戶端接收到短信后會將其插入SQLite數據庫,數據庫發生變化會觸發內容觀察者——ContentObserver。

        ContentObserver類似于一個觸發器,當其所觀察的Uri發生變化,這個觸發器就會觸發來執行相應的處理。主要方法的說明略——編者注。

        本系統在onChange的方法中,利用Context實例對象的getContentResolver方法獲得一個ContentResolver對象,然后調用Content Reso lver的query方法獲取當前數據庫中的短消息。具體代碼略——編者注。

        對于得到的短消息通過Cursor對象的getColumnIndexOrThrow方法獲取其thread_id,id和body內容。對于在數據庫中的短消息,為了保證對用戶的透明傳輸,要調用ContentResolver對象的delete方法將收件箱中的短消息刪除。具體代碼略——編者注。

        ContentObserver接收短信模塊需要在清單文件AndroidManifest.xml中加入允許接收短信的權限:

        2.3 Handler機制

        對于使用ContentObserver接收到房間溫度信息后,通過Android的Handler機制將信息傳送到主activity顯示。在Android中,主程序會創建一個Looper對象,在Looper對象初始化時候會創建一個消息隊列Message Queue用來存放線程放入的消息。用戶可以構造一個Handler對象與Looper溝通,以便將消息push到消息隊列中。當主線程檢測到有新消息進入消息隊列后,首先判斷該消息對應的Handler,然后將消息分發到指定的Handler處理。

        系統中通過ContentObserver繼承類SMSContentObserver的構造函數將在activity中定義的Handler對象傳入SMSContentObserver中,然后調用Handler對象的obtainMessage方法獲得一個message對象,最后調用message對象的sendToTarget方法將控制消息發送到消息隊列,在activity中定義了handleMessage函數用來處理得到的控制消息。具體代碼略——編者注。

        2.4 Android終端效果

        Android客戶端控制界面見圖6,當點擊“獲取溫度”按鈕,Android端會自動向系統控制端發送短信“1:O:O:00”,這樣系統控制端會檢測到是1類控制信息,則返回每個房間溫度。

        ?

        ?

        當需要設置某個房間空調的丁作方式,則通過點擊“設置空調”按鈕左側的“房間號”、“空調模式”和“設置溫度”等三個下拉列表(Spinner)來設置。如設置房間號為“房間二”,空調模式為“制冷”,設置溫度為“25℃”,然后點擊“設置空調”按鈕,安卓端會自動發送2類控制信息“2:2:2:25”到系統控制端,系統接收到控制信息會處理后返回設置是否成功消息。安卓端解析后將其顯示。當需要關閉某個房間空調,可以通過“關閉空淵”按鈕左側的“要關閉空調所在房間號”下拉列表實現,比如選擇“房間五”,然后點擊“關閉空調”按鈕,Android端即把3類控制信息“3:5:0:00”發送到系統控制端,系統控制端處理后將空調關閉狀態返回。

        結語

        中的遠程控制方式有很多,本系統結合Androld終端的用戶友好型界面,采用自定義協議方式,設計了一套基于短消息的空調控制系統。在Android終端接收返回信息的兩種方式中,ContentObserver因其穩定性在工程實踐中使用較多,本系統最終也是采用了Cont entOb—server的方式,并取得很好的效果。本系統設計合理,性能穩定,對其他工程設計也具有一定參考價值。


        上一頁 1 2 下一頁

        關鍵詞: Android 智能家居

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 衢州市| 丹凤县| 温宿县| 桂平市| 宁晋县| 靖宇县| 卢湾区| 宝应县| 枣庄市| 阜城县| 怀安县| 濮阳市| 白山市| 江油市| 英吉沙县| 紫金县| 高密市| 黑龙江省| 喜德县| 峨边| 海门市| 高唐县| 鹤庆县| 滦南县| 镇江市| 安庆市| 永嘉县| 贵港市| 炎陵县| 磐安县| 上高县| 呼玛县| 九龙城区| 应用必备| 莫力| 万源市| 浠水县| 磐石市| 木里| 澄城县| 孟津县|