<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于Android的智能家居遠(yuǎn)程控制系統(tǒng)設(shè)計

          基于Android的智能家居遠(yuǎn)程控制系統(tǒng)設(shè)計

          作者: 時間:2014-04-22 來源:網(wǎng)絡(luò) 收藏

          根據(jù)控制信息類型設(shè)置flag子程序和根據(jù)flag值進(jìn)行相應(yīng)處理的子程序主要是在初始化結(jié)束后完成系統(tǒng)功能,程序流程見圖4、圖5。

          本文引用地址:http://www.ex-cimer.com/article/245796.htm

          ?

          一種Android端智能家居遠(yuǎn)程控制方案的實現(xiàn)

          ?

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

          2 端設(shè)計

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

          2.1 發(fā)送控制信息

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

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

          發(fā)送短信模塊需要在清單文件AndroidManifest.xml中加入允許發(fā)送短信的權(quán)限:

          2.2 接收返回信息

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

          2.2.1 BroadcastReceiver接收短信

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

          當(dāng)應(yīng)用程序接收到廣播發(fā)送來的intent對象,BroadcastReceiver類根據(jù)其注冊的廣播地址與接收到的intent對象進(jìn)行比較,如果匹配則調(diào)用BroadcastReceiver的onReceive()方法。

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

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

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

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

          2.2.2 ContentObserver接收短信

          系統(tǒng)實際使用中,對于用BroadcastReceiver接收短信往往效果不好,主要因為用戶在Android終端安裝的第三方軟件,比如接收短信軟件、安全軟件等,這類軟件從底層獲取系統(tǒng)權(quán)限,優(yōu)先級始終高于應(yīng)用層軟件,導(dǎo)致應(yīng)用層軟件不能優(yōu)先接收到廣播消息,所以在設(shè)計短信接收客戶端時一般采用監(jiān)聽數(shù)據(jù)庫方式。

          當(dāng)客戶端接收到短信后會將其插入SQLite數(shù)據(jù)庫,數(shù)據(jù)庫發(fā)生變化會觸發(fā)內(nèi)容觀察者——ContentObserver。

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

          本系統(tǒng)在onChange的方法中,利用Context實例對象的getContentResolver方法獲得一個ContentResolver對象,然后調(diào)用Content Reso lver的query方法獲取當(dāng)前數(shù)據(jù)庫中的短消息。具體代碼略——編者注。

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

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

          2.3 Handler機(jī)制

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

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

          2.4 Android終端效果

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

          ?

          ?

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

          結(jié)語

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


          上一頁 1 2 下一頁

          關(guān)鍵詞: Android 智能家居

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();