基于安卓的藍(lán)牙通信系統(tǒng)開發(fā)_第1頁
基于安卓的藍(lán)牙通信系統(tǒng)開發(fā)_第2頁
基于安卓的藍(lán)牙通信系統(tǒng)開發(fā)_第3頁
基于安卓的藍(lán)牙通信系統(tǒng)開發(fā)_第4頁
基于安卓的藍(lán)牙通信系統(tǒng)開發(fā)_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

目錄TOC\o"1-2"\h\u一、系統(tǒng)背景21.1Android系統(tǒng)概述21.2藍(lán)牙概述3二、系統(tǒng)分析32.1需求分析32.2技術(shù)根底32.3平臺搭建32.4運行環(huán)境3三、系統(tǒng)總體設(shè)計33.1設(shè)計思想33.2設(shè)計框架3四、程序設(shè)計34.1設(shè)置藍(lán)牙權(quán)限34.3設(shè)置藍(lán)牙可見34.4查詢已配對藍(lán)牙設(shè)備34.5掃描周圍藍(lán)牙設(shè)備34.6效勞器端的連接34.7客戶端的連接34.8數(shù)據(jù)通信線程3五、系統(tǒng)測試3六、設(shè)計體會3系統(tǒng)背景1.1Android系統(tǒng)概述自從2008年9月22日,美國運營商T-MobileUSA在紐約正式發(fā)布了第一款基于android安卓的手機(jī)后,更多的移動設(shè)備廠商看到了安卓android的光明前景,并紛紛參加其中,android甚至已經(jīng)涉足上網(wǎng)本市場了其開展前景廣闊涉及領(lǐng)域越來越大。隨著android手機(jī)的普及,android應(yīng)用的需求勢越來越大,這個潛力巨大的市場,已經(jīng)吸引無數(shù)軟件開發(fā)廠商和開發(fā)者投身其中。android的開放性使其比蘋果和黑莓對年輕人更具吸引力,更能吸引年輕人群的關(guān)注和喜愛。在18歲至24歲族群中,Android是最多人選用的操作系統(tǒng)。同時因為Android系統(tǒng)的開放性為Android平板電腦的快速開展奠定了根底,也才能促使其吸引著越來越多的用戶承受和使用。同時Android還具有應(yīng)用程序無界限、應(yīng)用程序是在平的的條件下創(chuàng)立的、應(yīng)用程序可以輕松的嵌入網(wǎng)絡(luò)、應(yīng)用程序可以并行運行等眾多出色的品質(zhì)。具有其他操作系統(tǒng)無法比較的優(yōu)勢和開展空間。安卓系統(tǒng)在不斷升級完善,如今,平板電腦市場已成為Android與蘋果IOS除了智能手機(jī)領(lǐng)域之外爭奪的第二個焦點。一直以來,多數(shù)新聞仍然顯示iPad在平板市場的霸主地位難撼。但是,以Android領(lǐng)頭的平板電腦正以高速的增長對蘋果iPad造成沖擊。放眼整個平板市場,生產(chǎn)Android平板電腦確實是大勢所趨。世界上所有的頂級設(shè)備制造商,三星、索尼、摩托羅拉、聯(lián)想、LG、宏碁、HTC、華碩,幾乎每一家都在賣Android平板電腦。安卓給用戶的觸屏體驗非常好,安卓手機(jī)在高端機(jī)領(lǐng)域泛濫的同時也在中低端機(jī)領(lǐng)域涉足,這將給安卓系統(tǒng)手機(jī)帶來非常好的前景,從目前的市場上來看,安卓系統(tǒng)能夠在短短的時間里面,占據(jù)著超大的市場份額,而且還有非常好的信譽口碑,絕對不是一兩個人吹捧出來的,那是因為安卓手機(jī)真的能夠讓人體驗到好,才能夠有如此高的評價。所以說,雖然目前安卓手機(jī)還是存在一定問題上的缺乏,很多問題都有待需要改善,這就說明安卓系統(tǒng)處于一種開展?fàn)顟B(tài),則它的生命力就會很強,前景很廣闊。Android是一套真正意義的開放性移動設(shè)備綜合平臺,它包括操作系統(tǒng)、中間件和一些關(guān)鍵的平臺應(yīng)用。Android的Java程序運行環(huán)境包含一組Java核心函數(shù)庫及Dalvik虛擬機(jī),他們有效地優(yōu)化了Java程序的運行過程。Android系統(tǒng)平臺基于優(yōu)化了的Linu*核,它提供諸如存管理、進(jìn)程管理、設(shè)備驅(qū)動等效勞,同時也是手機(jī)硬件的連接層。Android最大的優(yōu)點在于它是一個開放的體系構(gòu)造,具有非常好的開發(fā)和調(diào)試環(huán)境,而且還制成各種可擴(kuò)展的用戶體驗,Android里面有非常豐富的圖形系統(tǒng),對多媒體的支持功能和非常強大的瀏覽器。Android平臺的開放性特點既能促進(jìn)技術(shù)的創(chuàng)新,又有助于降低開發(fā)本錢,還可以使運營商能非常方便地地址特色化產(chǎn)品,因此,它具有很大的市場開展?jié)摿Α?.2藍(lán)牙概述自從1998年提出藍(lán)牙技術(shù)以來,藍(lán)牙技術(shù)的開展異常迅速。藍(lán)牙Bluetooth作為一種新的短距離無線通信技術(shù)標(biāo)準(zhǔn),受到全世界越來越多工業(yè)界生產(chǎn)廠家和研究機(jī)構(gòu)的廣泛關(guān)注。成立了世界藍(lán)牙組織BluetoothSIG,采用技術(shù)標(biāo)準(zhǔn)公開的策略來推廣藍(lán)牙技術(shù),現(xiàn)已開展成為一個相當(dāng)大的工業(yè)界高新技術(shù)標(biāo)準(zhǔn)化組織,全球支持藍(lán)牙技術(shù)的2000多家設(shè)備制造商都已經(jīng)成為它的會員,一項公開的、全球統(tǒng)一的技術(shù)規(guī)得到了工業(yè)界如此廣泛的關(guān)注和支持在以往是罕見的。近年來,世界上一些權(quán)威的標(biāo)準(zhǔn)化組織,也都在關(guān)注藍(lán)牙技術(shù)標(biāo)準(zhǔn)的制定和開展。例如,IEEE的標(biāo)準(zhǔn)化機(jī)構(gòu),也已經(jīng)成立了802.15工作組,專門關(guān)注有關(guān)藍(lán)牙技術(shù)標(biāo)準(zhǔn)的兼容和未來的開展等問題。就是討論建立與藍(lán)牙技術(shù)1.0版本相一致的標(biāo)準(zhǔn);是探討藍(lán)牙如何與IEEE802.11b無線局域網(wǎng)技術(shù)共存的問題;而則是研究未來藍(lán)牙技術(shù)向更高速率(如10-20Mbits/s)開展的問題。國的一些生產(chǎn)廠家與研究部門也準(zhǔn)備開場組織藍(lán)牙技術(shù)產(chǎn)品的開發(fā)。由來自國家主管部門、企業(yè)界、學(xué)術(shù)界以及研究生產(chǎn)機(jī)構(gòu)的領(lǐng)導(dǎo)、專家、教授等權(quán)威人士發(fā)起成立的中國藍(lán)牙技術(shù)開展與應(yīng)用論壇,吸引了眾多關(guān)注藍(lán)牙技術(shù)的各界人士,還組織國各界與世界藍(lán)牙組織SIG的代表,就雙方所關(guān)注的問題進(jìn)展了認(rèn)真的討論。并就雙方今后進(jìn)一步加強聯(lián)系、共享藍(lán)牙技術(shù)信息資源、共同促進(jìn)藍(lán)牙技術(shù)在中國的推廣與應(yīng)用等問題達(dá)成共識。藍(lán)牙是取代數(shù)據(jù)電纜的短距離無線通信技術(shù),可以支持物體與物體之間的通信,工作頻段是全球開放的2.4GHz頻段,可以同時進(jìn)展數(shù)據(jù)和語音傳輸,傳輸速率可到達(dá)10Mb/s,使得在其圍的各種信息化設(shè)備都能實現(xiàn)無縫資源共享。藍(lán)牙技術(shù)的應(yīng)用被認(rèn)為非常廣泛而且極具潛力。它可以應(yīng)用于無線設(shè)備(如PDA、手機(jī)、智能、無繩)、圖像處理設(shè)備(照相機(jī)、打印機(jī)、掃描儀)、平安產(chǎn)品(智能卡、身份識別、票據(jù)管理、平安檢查)、消費娛樂(耳機(jī)、MP3、游戲)汽車產(chǎn)品(GPS、ABS、動力系統(tǒng)、平安氣袋)、家用電器(電視機(jī)、電冰箱、電烤箱、微波爐、音響、錄像機(jī))、醫(yī)療健身、建筑、玩具等領(lǐng)域。藍(lán)牙行業(yè)對于市場的持續(xù)增長感到欣慰,現(xiàn)在沒有人再質(zhì)疑它的生命力。2002年,400余種藍(lán)牙產(chǎn)品的銷量總共到達(dá)了3000萬件;而2003年的數(shù)字是2002年的2倍。In-Stat/MDR公司預(yù)測,藍(lán)牙市場的規(guī)模在2007年將膨脹到6億件。愛立信技術(shù)授權(quán)公司的總裁MariaKhorsand表示:“在如此困難的經(jīng)濟(jì)環(huán)境下,藍(lán)牙是少數(shù)仍在增長的產(chǎn)品之一〞。系統(tǒng)分析2.1需求分析本系統(tǒng)設(shè)計的目標(biāo)是開發(fā)出一個基于Android系統(tǒng)的短距離藍(lán)牙通信軟件?,F(xiàn)在幾乎每一部智能手機(jī)都有藍(lán)牙連接,在安裝本程序設(shè)計APP后,可以實現(xiàn)在藍(lán)牙的有效距離進(jìn)展數(shù)據(jù)傳輸,并且不用消耗額外的流量和話費。用戶翻開應(yīng)用軟件后首先要提醒用戶允許翻開自己的手機(jī)藍(lán)牙,然后掃描附近的其他藍(lán)牙設(shè)備,并選擇其中一個設(shè)備對象進(jìn)展連接并進(jìn)展數(shù)據(jù)通信,所以該設(shè)計要有對其他藍(lán)牙設(shè)備的掃描功能,連接功能和數(shù)據(jù)通信功能。另外,本設(shè)計還可以實現(xiàn)發(fā)送承受表情,顯示在線用戶,查看聊天記錄,設(shè)置本機(jī)用戶名,可以實現(xiàn)短距離藍(lán)牙通信的根本操作。本設(shè)計界面簡潔明了,使用戶使用方便快捷,并且參加了再按一次退出提醒功能,使操作更加人性化。2.2技術(shù)根底本設(shè)計是基于Android平臺的一個設(shè)計。Android是Google開發(fā)的基于linu*平臺的開源智能手機(jī)操作系統(tǒng)。Android平臺的根本框架如圖所示。圖2.2.1Android根本框架圖(1)ApplicationsApplicationAndroid會同一個核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。所有的應(yīng)用程序都是用JAVA編寫的。(2)ApplicationFrameWork開發(fā)者完全可以訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序架構(gòu)用來簡化組件軟件的重用;任何一個應(yīng)用程序都可以發(fā)布它的功能塊并且任何其它的應(yīng)用程序都可以使用其所發(fā)布的功能塊〔不過得遵循框架的平安性限制〕。(3)Libraries庫Android包括一個被Android系統(tǒng)中各種不同組件所使用的C/C++庫集。該庫通過Android應(yīng)用程序框架為開發(fā)者提供效勞。(4)AndroidRuntimeAndroid包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數(shù)功能。(5)Linu*核Android的核心系統(tǒng)效勞依賴于Linu*2.6核,如平安性,存管理,進(jìn)程管理,網(wǎng)絡(luò)協(xié)議棧和驅(qū)動模型。Linu*核也同時作為硬件和軟件堆棧之間的硬件抽象層。Android的四大根本組件:Activity(活動),Service(效勞),BroadcastReceiver(播送),ContentProvider(容提供者),各組件之間要進(jìn)展切換需要一個意圖或企圖Intent類,通過啟動StartIntent()方法來使各組件進(jìn)展跳轉(zhuǎn)。Android的五大布局方式:LinearLayout(線性布局),F(xiàn)rameLayout(幀布局),TableLayout(表格布局),AbsoluteLayout(絕對布局)和RelativeLayout(相對布局〕。五種布局方式可以相互嵌套,Android各種漂亮的界面都是通過嵌套布局而實現(xiàn)的。Android的線程以及線程之間通信的中介:Handler類。Android配置文件:AndroidManifest.*ml及res資源文件中各種屬性布局方式引用的資源等。Android應(yīng)用程序由一些零散的有聯(lián)系的組件組成,通過一個工程manifest綁定在一起,在manifest中,描述了每一個組件以及組件的作用。然而,并不是所有的程序都需要全部局部,可以由上面的一個或幾個來組建。使用*些組件構(gòu)建Android應(yīng)用程序時,需要在AndroidManifest.*ml文件里進(jìn)展聲明。Activities〔活動〕在Android應(yīng)用程序中,Activity一般代表手機(jī)的一屏.即用戶可見的一個界面。Android應(yīng)用程序的運行過程就是在不同的Activity之間切換的過程。每個Activity都有自己的視圖和事件對應(yīng)。大多數(shù)應(yīng)用程序都有多個Activity。每一個畫面對應(yīng)于你的應(yīng)用程序,將會是Activity類的擴(kuò)展。Activity使用Views去構(gòu)建UI來顯示信息和響應(yīng)用戶的行為。Activity的生命周期示意圖如圖所示。圖2.2.2Activity生命周期示意圖Services〔效勞〕Service是具有長生命周期并且沒有用戶界面的代碼通過StartService(Intentservice)可以來啟動一個Service,通過Conte*t.bindService()可以綁定一個Service。當(dāng)已經(jīng)連接上了一個效勞,就可以使用效勞提供的外部接口來和效勞通訊了Android應(yīng)用程序中不可見的“工人〞。Service組件運行時不可見,但它負(fù)責(zé)更新的數(shù)據(jù)源和可見的Activity,以及觸發(fā)通知。它們常用來執(zhí)行一些需要持續(xù)運行的處理,當(dāng)你的Activity已經(jīng)不處于激活狀態(tài)或不可見。〔3〕Content〔容〕ContentProvider〔容提供器〕就是一個類。作為應(yīng)用程序之間唯一的共享數(shù)據(jù)的途徑,它實現(xiàn)了一個標(biāo)準(zhǔn)的方法集合,其他應(yīng)用程序可以使用這些方法在應(yīng)用程序之間共享數(shù)據(jù)。提供共享的數(shù)據(jù)存儲。ContentProvider用來管理和共享應(yīng)用程序的數(shù)據(jù)庫。在應(yīng)用程序間,ContentProvider是共享數(shù)據(jù)的首選方式。這意味著,你可以配置自己的ContentProvider去存取其他的應(yīng)用程序或者通過其他應(yīng)用程序暴露的ContentProvider去存取它們的數(shù)據(jù)。Android設(shè)備本身包含了幾個ContentProvider來訪問像聯(lián)系人信息等有用的數(shù)據(jù)庫。Intents〔意圖〕簡單的消息傳遞框架。使用Intent,你可以在整個系統(tǒng)播送消息或者給特定的Activity或者效勞來執(zhí)行你的行為意圖。系統(tǒng)會決定那個〔些〕目標(biāo)執(zhí)行適當(dāng)?shù)男袨?,Intent有顯式和隱式兩種方式。BroadcastReceivers〔播送接收器〕BroadcastReceiver是一個承受播送消息并響應(yīng)的組件。播送消息可以由系統(tǒng)產(chǎn)生,例如時區(qū)發(fā)生變化、電池電量發(fā)生變化等。同時也可以由其他應(yīng)用程序產(chǎn)生,對于這兩種播送。在Broadcastreceiver里都可以設(shè)置相應(yīng)的過濾規(guī)則來進(jìn)展接收。BroadcastReceiver是Intent播送的“消費者〞。通過創(chuàng)立和注冊一個BroadcastReceiver,應(yīng)用程序可以監(jiān)聽符合特定條件的播送的Intent。BroadcastReceiver會自動的啟動你的Android應(yīng)用程序去響應(yīng)新來的Intent。BroadcastReceiver是事件驅(qū)動程序的理想手段。Notifications〔通知〕用戶通知的框架。Notification用來在不需要焦點或不中斷它們當(dāng)前Activity的情況下提示用戶。它們是Service或BroadcastReceiver獲得用戶注意的首選方式。例如,當(dāng)設(shè)備收到文本信息或外部來電時,它通過閃光,發(fā)聲,顯示圖標(biāo)或顯示對話框信息來提醒你。2.3平臺搭建〔1〕javaJDK安裝JDK是Java語言的原創(chuàng)者推出的原始開發(fā)環(huán)境。采用JDK開發(fā)Java程序能夠很快理解程序中各局部代碼之間的關(guān)系,有利于理解Java面向?qū)ο蟮脑O(shè)計思想。在此之前,我們就必須先完成此項工作及在Windows上安裝JDK,首先訪問Oracle的官方下載頁面,也可以從其他下載,下載完成后,雙擊JDK的安裝程序,裝好后配置JDK的環(huán)境變量,在“我的電腦〞|“屬性〞|“高級〞|“環(huán)境變量〞|“系統(tǒng)變量〞中先添加兩個環(huán)境變量:〔安裝路徑〕classpath=.;%JAVA_HOME%\lib之后修改環(huán)境變量PATH,在前面加上:%JAVA_HOME%\bin;完成后測試一下在命令提示符中輸入java-version顯示如圖所示則表示完成了。圖2.3.1Java安裝測試(2)Eclipse安裝以及ADT工具的安裝首先下載Eclipse,直接解壓放到了C:\ProgramFiles\Java\jre8\eclipse下,之后翻開eclipse設(shè)置工作路徑:C:\ProgramFiles\Java\jre8\eclipse\workspace下面由于學(xué)校校園網(wǎng)不流暢我直接下載了ADT-26.0.6.zip,準(zhǔn)備離線安裝ADT插件。翻開eclipse,選擇Help>InstallNewSoftware...之后然后選擇Add...在name項中隨便取一個名字如,之后點擊Archiv...找到下載的ADT-26.0.6.zip如圖所示。點擊OK,然后選擇Selectall之后一路的ne*t和OK最后會根據(jù)提示重啟下eclipse,則完成了ADT的安裝,至于如何看是否完成則是選擇Window>Preferences…翻開首選項面板看是否有Android,有的話就成功了,至于會跳出要求裝SDK則在下面進(jìn)展安裝了。圖2.3.2ADT安裝步驟(3)AndroidSDK的安裝以及系統(tǒng)的設(shè)置首先下載最新的SDK直接解壓到C:\ProgramFiles\Java\后修改環(huán)境變量PATH,在前面加上:C:\ProgramFiles\Java\android-sdk-windows\tools;然后Window>Preferences…彈出“Preferences〞對話框,單擊左側(cè)“Android〞列表項,單擊右側(cè)“Browse〞按鈕,選擇SDK路徑〔例如C:\ProgramFiles\Java\android-sdk-windows〕,單擊“apply〞按鈕,退出SDK安裝提示對話框,單擊“OK〞按鈕,退出“Preferences〞對話框。下面是翻開Window>AndroidSDKManager選擇:“Tools〞下“AndroidSDKplatform-tools〞“E*tras〞下“GoogleUSBdriverpackage〞“〞單擊“Install22packages〞按鈕選中“AcceptAll〞〔如果選擇“Accept〞,可能漏掉“GoogleUSBdriverpackage〞〕單擊“Install〞按鈕之后就是無盡的等待,完成后關(guān)閉,如圖所示。圖2.3.3AndroidSDK更新界面SDK裝好后還要修改下環(huán)境變量PATH,在前面加上:C:\ProgramFiles\Java\android-sdk-windows\platform-tools;2.4運行環(huán)境1、硬件環(huán)境兩臺Android系統(tǒng)的智能手機(jī)一臺Windows7系統(tǒng)的電腦2、軟件環(huán)境及其以上手機(jī)系統(tǒng)Eclipse+JDK+ADT+SDK系統(tǒng)總體設(shè)計3.1設(shè)計思想在Android系統(tǒng)中對藍(lán)牙的操作包括開啟藍(lán)牙,關(guān)閉藍(lán)牙,設(shè)置藍(lán)牙可見性,掃描周圍藍(lán)牙設(shè)備,對藍(lán)牙設(shè)備進(jìn)展配對,連接藍(lán)牙設(shè)備,進(jìn)展數(shù)據(jù)通信。其中對第一次掃描到的藍(lán)牙設(shè)備進(jìn)展配對過程是通過系統(tǒng)秘鑰手動完成的,是為了保證數(shù)據(jù)通信的平安性。我們的技術(shù)開發(fā)主要的工作是設(shè)置藍(lán)牙可見性,掃描周圍的藍(lán)牙設(shè)備,選擇一臺藍(lán)牙設(shè)備進(jìn)展連接并進(jìn)展數(shù)據(jù)通信。并在此根底上完成數(shù)據(jù)庫的讀寫操作,實現(xiàn)查看聊天記錄的功能。首先兩個設(shè)備上都要有藍(lán)牙設(shè)備或者專業(yè)一點叫藍(lán)牙適配器,以手機(jī)和電腦為例我畫了一個藍(lán)牙工作流程圖如圖3.1所示。其次在手機(jī)上進(jìn)展掃描,掃描周圍的藍(lán)牙設(shè)備,找到手機(jī)附近的電腦后給它發(fā)出一個信號需要進(jìn)展藍(lán)牙的配對,再次返回一個信號說明手機(jī)和電腦已經(jīng)配對成功了,最后配對成功后就可以進(jìn)展連接和數(shù)據(jù)通信了。這是一個最根本的流程。圖3.1藍(lán)牙工作流程圖在Android中進(jìn)展藍(lán)牙開發(fā)的相關(guān)類和接口都位于Android.bluetooth包中。其中最主要的幾個API如下所示。BluetoothAdapter類:代表了一個本地的藍(lán)牙適配器。它是所有藍(lán)牙交互的的入口點。利用它你可以發(fā)現(xiàn)其他藍(lán)牙設(shè)備,查詢綁定了的設(shè)備,使用的MAC地址實例化一個藍(lán)牙設(shè)備和建立一個BluetoothServerSocket〔作為效勞器端〕來監(jiān)聽來自其他設(shè)備的連接。BluetoothDevice類:代表了一個遠(yuǎn)端的藍(lán)牙設(shè)備,使用它請求遠(yuǎn)端藍(lán)牙設(shè)備連接或者獲取遠(yuǎn)端藍(lán)牙設(shè)備的名稱、地址、種類和綁定狀態(tài)。其信息是封裝在bluetoothsocket中。BluetoothSocket類:代表了一個藍(lán)牙套接字的接口〔類似于tcp中的套接字〕,它是應(yīng)用程序通過輸入、輸出流與其他藍(lán)牙設(shè)備通信的連接點。BlueboothServerSocket類:代表翻開效勞連接來監(jiān)聽可能到來的連接請求〔屬于Server端〕,為了連接兩個藍(lán)牙設(shè)備必須有一個設(shè)備作為效勞器翻開一個效勞套接字。當(dāng)遠(yuǎn)端設(shè)備發(fā)起連接連接請求的時候,并且Server端已經(jīng)承受連接時,BlueboothServerSocket類將會返回一個BluetoothSocket。Bluetoothclass類:描述了一個藍(lán)牙設(shè)備的一般特點和能力。它的只讀屬性集定義了設(shè)備的主、次設(shè)備類和一些相關(guān)效勞。然而,它并沒有準(zhǔn)確地描述所有該設(shè)備所支持的藍(lán)牙文件和效勞,而是作為對設(shè)備種類來說的一個小小暗示。3.2設(shè)計框架完整的藍(lán)牙操作過程示意圖如圖所示。圖3.2.1藍(lán)牙操作流程圖掃描周圍藍(lán)牙設(shè)備得到配對的設(shè)備列表后,需要從中選取一個設(shè)備進(jìn)展連接并進(jìn)展數(shù)據(jù)通信。藍(lán)牙數(shù)據(jù)通信過程采用C/S模型,兩臺手機(jī)通過藍(lán)牙進(jìn)展數(shù)據(jù)傳輸,其中主動發(fā)起連接請求的設(shè)備視為客戶端,監(jiān)聽并承受請求的設(shè)備視為效勞器端。下面分別介紹藍(lán)牙通信在效勞器端和客戶端上的連接操作過程如圖和圖所示。圖3.2.2效勞器端連接過程圖3.2.3客戶端連接過程在效勞器端,注意如下幾點:1.一定要保證藍(lán)牙開啟且通信雙方已經(jīng)手動完成匹配;2.效勞端要開啟藍(lán)牙可見性,以保證能被客戶端搜索到;3.用BluetoothServerSocket的listenUsingRfmWithServiceRecord()方法獲取ServerSocket對象,再使用BluetoothServerSocket的accept()方法阻塞接收請求者的連接請求,成功后該方法返回BluetoothSocket對象;4.使用獲取到的socket對象的輸入輸出流方法操作數(shù)據(jù)通信,接收到的數(shù)據(jù)一定要通過handler處理顯示。在客戶端,注意如下幾點:1.同樣一定要保證藍(lán)牙開啟且通信雙方已經(jīng)手動完成匹配;2.通過播送掃描周圍可用設(shè)備,并確定該設(shè)備已與本機(jī)完成匹配;3.通過調(diào)用BluetoothAdapter的startDiscovery()方法異步掃描到周圍的BluetoothDevice對象,調(diào)用createRfmSocketToServiceRecord()方法,獲取BluetoothSocket對象,并用該對象調(diào)用connect()方法想效勞器提出連接請求。注意此連接請求過程要循環(huán)請求,直至完成連接;4.使用此連接的socket對象的輸入輸出流方法操作數(shù)據(jù)通信,接收到的數(shù)據(jù)一定要通過handler處理顯示。程序設(shè)計4.1設(shè)置藍(lán)牙權(quán)限在AndroidManifast.*ml配置文件中設(shè)置藍(lán)牙操作權(quán)限。代碼如下:<uses-permissionandroid:name="android.permission.BLUETOOTH"/><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>4.2啟動藍(lán)牙功能首先通過調(diào)用靜態(tài)方法getDefaultAdapter()獲取藍(lán)牙適配器BluetoothAdapter,如果返回為空,說明該設(shè)備沒有藍(lán)牙適配器。代碼如下:BluetoothAdaptermBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();if(mBluetoothAdapter==null)

{

}

其次,調(diào)用isEnabled()來查詢當(dāng)前藍(lán)牙設(shè)備的狀態(tài),如果返回為false,則表示藍(lán)牙設(shè)備沒有開啟,接下來你需要封裝一個ACTION_REQUEST_ENABLE請求到intent里面,調(diào)用startActivityForResult()方法開啟藍(lán)牙設(shè)備。代碼如下:if(!mBluetoothAdapter.isEnabled())

{

IntentenableBtIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);}4.3設(shè)置藍(lán)牙可見設(shè)置藍(lán)牙設(shè)備可見,使其他設(shè)備可以搜索到本機(jī)藍(lán)牙設(shè)備,然后將ACTION_REQUEST_DISCOVERABLE動作封裝在Intent中然后通過調(diào)用方法startActivity(Intent)可以實現(xiàn)在應(yīng)用程序不退出的情況下使你的設(shè)備能夠被發(fā)現(xiàn)。缺省情況下的使能時間是120秒,可以通過添加E*TRA_DISCOVERABLE_DURATION字段來改變使能時間〔最大不超過300秒,這是出于對你設(shè)備上的信息平安考慮〕。代碼如下:IntentdiscoverableIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putE*tra(BluetoothAdapter.E*TRA_DISCOVERABLE_DURATION,300);startActivity(discoverableIntent);4.4查詢已配對藍(lán)牙設(shè)備在建立連接之前必須先查詢已配對的藍(lán)牙設(shè)備列表〔你周圍的藍(lán)牙設(shè)備可能不止一個〕,以便你選取*一個設(shè)備進(jìn)展數(shù)據(jù)通信。代碼如下:Set<BluetoothDevice>pairedDevices=mBluetoothAdapter.getBondedDevices();if(pairedDevices.size()>0)

{

for(BluetoothDevicedevice:pairedDevices)

{

mArrayAdapter.add(device.getName()+"\n"+device.getAddress());//添加設(shè)備名和MAC地址到設(shè)備列表中}

4.5掃描周圍藍(lán)牙設(shè)備BluetoothAdapter調(diào)用startDiscovery()方法異步掃描周圍藍(lán)牙設(shè)備,這個掃描的過程大概持續(xù)12秒,每掃描到一個BluetoothDevice系統(tǒng)就會播送ACTION_FOUND動作。BluetoothAdapter會注冊一個BroadcastReceiver來獲取該設(shè)備富的設(shè)備名和MAC地址。代碼如下:privatefinalBroadcastReceivermReceiver=newBroadcastReceiver()

{

publicvoidonReceive(Conte*tconte*t,Intentintent)

{Stringaction=intent.getAction();if(BluetoothDevice.ACTION_FOUND.equals(action)){BluetoothDevicedevice=intent.getParcelableE*tra(BluetoothDevice.E*TRA_DEVICE);stViewmArrayAdapter.add(device.getName()+"\n"+device.getAddress());

}

}};IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver,filter);4.6效勞器端的連接首先用listenUsingRfmWithServiceRecord(String,UUID)方法來獲取BluetoothServerSocket對象,參數(shù)String代表了該效勞的名稱,UUID代表了和客戶端連接的一個標(biāo)識〔128位格式的字符串ID,相當(dāng)于PIN碼〕,UUID必須雙方匹配才可以建立連接。其次調(diào)用accept〔〕方法來監(jiān)聽可能到來的連接請求,當(dāng)監(jiān)聽到一個請求后,返回一個連接上的藍(lán)牙套接字BluetoothSocket。最后,在承受到一個連接以后,調(diào)用close〔〕方法來關(guān)閉監(jiān)聽程序,因為一般藍(lán)牙設(shè)備之間是點對點的傳輸?shù)?。注意:accept〔〕方法不應(yīng)該放在主Acitvity里面,因為它是一種阻塞調(diào)用,在沒有監(jiān)聽到連接請求之前程序就一直停在那里,應(yīng)該新建一個AcceptThread線程來管理。代碼如下:privateclassAcceptThreade*tendsThread

{

privatefinalBluetoothServerSocketmmServerSocket;publicAcceptThread()

{

BluetoothServerSockettmp=null;try

{

tmp=mAdapter.listenUsingRfmWithServiceRecord(NAME,MY_UUID);}

catch(IOE*ceptione)

{

}

mmServerSocket=tmp;

}

publicvoidrun()

{

BluetoothSocketsocket=null;while(true)

{

try

{

socket=mmServerSocket.accept();}catch(IOE*ceptione)

{

break;

}

if(socket!=null)

{

manageConnectedSocket(socket);mmServerSocket.close();break;

}

}

}

publicvoidcancel()

{

try

{

mmServerSocket.close();}catch(IOE*ceptione)

{

}

}

}

4.7客戶端的連接通過調(diào)用BluetoothDevice的createRfmSocketToServiceRecord(UUID)方法來獲取BluetoothSocket。UUID就是匹配碼。然后調(diào)用connect〔〕方法來請求數(shù)據(jù)連接。如果效勞器端承受了該連接,他們將在通信過程中共享RFFM信道。注意:conncet()方法也是阻塞調(diào)用,一般建立一個獨立的ConnectThread線程來調(diào)用該方法。在設(shè)備搜索過程中不應(yīng)該發(fā)起連接connect()方法,這樣會明顯減慢速度以至于連接失敗。且數(shù)據(jù)傳輸完成只有調(diào)用close()方法來關(guān)閉連接,這樣可以節(jié)省系統(tǒng)部資源。代碼如下:privateclassConnectThreade*tendsThread

{

privatefinalBluetoothSocketmmSocket;privatefinalBluetoothDevicemmDevice;publicConnectThread(BluetoothDevicedevice)

{

BluetoothSockettmp=null;mmDevice=device;try

{

tmp=device.createRfmSocketToServiceRecord(MY_UUI; }catch(IOE*ceptione)

{

}

mmSocket=tmp;}

publicvoidrun()

{

mAdapter.cancelDiscovery();try

{

mmSocket.connect();}

catch(IOE*ceptionconnectE*ception)

{

try

{

mmSocket.close();}

catch(IOE*ceptioncloseE*ception)

{

}

return;}manageConnectedSocket(mmSocket);}

4.8數(shù)據(jù)通信線程當(dāng)兩臺設(shè)備連接上以后,每個設(shè)備都擁有各自的BluetoothSocket。現(xiàn)在就可以實現(xiàn)設(shè)備之間的數(shù)據(jù)通信了。首先通過調(diào)用getInputStream()和getOutputStream()方法來獲取輸入輸出流。然后通過調(diào)用read(byte[])和write(byte[])方法來讀取或者寫數(shù)據(jù)。注意:讀取和寫操作都是阻塞調(diào)用,需要建立一個單獨的線程ConnectedThread來管理。privateclassConnectedThreade*tendsThread

{

privatefinalBluetoothSocketmmSocket;privatefinalInputStreammmInStream;privatefinalOutputStreammmOutStream;publicConnectedThread(BluetoothSocketsocket)

{

mmSocket=socket;InputStreamtmpIn=null;OutputStreamtmpOut=null;try

{

tmpIn=socket.getInputStream();tmpOut=so

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論