android藍牙app開發(fā)(安卓開發(fā)藍牙)
今天給各位分享android藍牙app開發(fā)的知識,其中也會對安卓開發(fā)藍牙進行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關注本站,現(xiàn)在開始吧!
Android藍牙開發(fā)——實現(xiàn)藍牙聊天
與藍牙開發(fā)主要的相關類是以下四個
知道對應API后就可以進行對應的藍牙開發(fā),這里以獲取藍牙設備為例子
}
搜索設備的回調(diào)則需要通過注冊廣播的形式來獲取
定義廣播
之后就可以進行個人的一些操作
要實現(xiàn)藍牙聊天則涉及到藍牙之間的傳輸通信,前面也說到了,這里肯定就是用到BluetoothServerSocket以及BluetoothSocket。
藍牙傳輸通信相當于服務器端與客戶端之間的通信,只不過不同是這里每一個藍牙設備本身自己 既充當服務器端也充當客戶端 ,大致的關系就是
注意,這些連接都是阻塞式的,都要放在線程里去執(zhí)行。
可以看到,當BluetoothServerSocket監(jiān)聽到有設備連接的時候,就會調(diào)用dataTransfer開啟一個數(shù)據(jù)傳輸。
需要一個ConnectThread來發(fā)起
之后建立連接之后就會調(diào)用dataTransfer來進行數(shù)據(jù)傳輸,同樣也需要一個線程來維護數(shù)據(jù)傳輸
藍牙聊天則是基于上面三個線程來進行實現(xiàn),同樣,對于藍牙文件間的傳輸也是同個道理,通過輸入輸出流來進行處理。之后的操作就比較容易處理了
藍牙聊天
Android 藍牙開發(fā)基本流程
Android 藍牙開發(fā)(一)
普通藍牙設備官方文檔
Android 平臺包含藍牙網(wǎng)絡堆棧支持 ,憑借此支持,設備能以無線方式與其他藍牙設備交換數(shù)據(jù)。應用框架提供了通過 Android Bluetooth API 訪問藍牙功能的途徑。使用 Bluetooth API Android 應用可以執(zhí)行下面的操作:
傳統(tǒng)藍牙適用于電池使用強度較大的操作,例如 Android 設備之間的流傳輸和通信等。針對具有低功耗要求的藍牙設備,Android 4.3(API 18)中引入了面向低功耗藍牙的 API 支持。
使用 Android Bluetooth API 來完成使用藍牙進行通信的四項主要任務: 設置藍牙 、 查找局部區(qū)域內(nèi)的配對設備或可用設備 、 連接設備 ,以及在 設備之間傳輸數(shù)據(jù) 。
關于藍牙的 API 在 android.bluetooth 包中,下面介紹一下和藍牙相關的主要類:
在 BluetoothProfile IPC 客戶端連接到服務(即,運行特定配置文件的內(nèi)部服務)或斷開服務連接時向其發(fā)送通知的接口。
使用藍牙必須聲明權限 BLUETOOTH 才可以執(zhí)行藍牙通信。
1、獲取藍牙適配器
例如:我們可以查詢所有已配對的設備,然后使用 ArrayAdapter 向用戶顯示每臺設備的名稱:
要發(fā)起連接僅需要知道目標藍牙設備的 Mac 地址就可以了。
注意 執(zhí)行 discovery 對于藍牙適配器來說是一個非常繁重的過程,并且會消耗大量資源。在找到要連接的設備后, 要確保使用 cancelDiscovery() 來停止發(fā)現(xiàn),然后嘗試連接 。如果您已經(jīng)和某臺設備進行連接,那么這個時候執(zhí)行發(fā)現(xiàn)操作會大幅度的減少此連接可用的帶寬!因此不應該在處于連接狀態(tài)的時候執(zhí)行發(fā)現(xiàn)操作!
例如:
在連接之前如果兩個設備沒有配對,則系統(tǒng)會自動發(fā)出配對請求。
服務器套接字接受連接的基本過程
放在子線程中去執(zhí)行。
例子:
客戶端連接的基本過程
調(diào)用 connect() 的時候要確??蛻舳藳]有執(zhí)行發(fā)現(xiàn)操作。如果執(zhí)行了會大幅度降低連接的速度,增加失敗的可能。
例子
在連接之前調(diào)用 cancleDiscovery() 在進行連接之前應該始終調(diào)用這個方法,而且調(diào)用的時候無需檢測是否正在掃描。
過程:
從 Android 3.0 開始, Bluetooth API 便支持使用藍牙配置文件。藍牙配置文件是適用于設備間藍牙通信的無線接口規(guī)范。
1、藍牙配置文件就是設備間通信(藍牙設備)的一種規(guī)范
免提配置文件便是一個示例,對于連接到無線耳機的手機,兩臺設備都必須支持免提配置文件。我們也可以通過實現(xiàn)接口 BluetoothProfile 來寫入自己的類來支持特定的藍牙配置文件。Android API 提供了以下的幾種藍牙配置文件的實現(xiàn):
2、使用配置文件的基本步驟
創(chuàng)建 HDP 應用:
關于普通藍牙設備和普通藍牙設備之間的連接通信
關于藍牙設備和藍牙儀器(藍牙耳機、電子秤等等類似產(chǎn)品)
這種之間的通信是通過配置文件代理來實現(xiàn)的。
都有一個對應的配置文件代理類。具體的操作是通過這個對象來完成。
參考: ;mid=2247484128idx=1sn=9d59b9ad66fb68b9569c29566103c009scene=21#wechat_redirect
Android藍牙開發(fā)(二)經(jīng)典藍牙消息傳輸實現(xiàn)
上篇文章中,我們主要介紹了藍牙模塊,傳統(tǒng)/經(jīng)典藍牙模塊BT和低功耗藍牙BLE及其相關的API,不熟悉的可以查看 Android藍牙開發(fā)(一)藍牙模塊及核心API 進行了解。
本篇主要記錄用到的經(jīng)典藍牙開發(fā)流程及連接通訊。
藍牙連接前,給與相關系統(tǒng)權限:
安卓6.0以上系統(tǒng)要動態(tài)請求及獲取開啟GPS內(nèi)容:
藍牙核心對象獲取,若獲取對象為null則說明設備不支持藍牙:
判斷藍牙是否開啟,沒有則開啟:
藍牙掃描:
取消掃描:
藍牙監(jiān)聽廣播,監(jiān)聽藍牙開關,發(fā)現(xiàn)設備,掃描結束等狀態(tài),定義狀態(tài)回調(diào)接口,進行對應操作,例如:監(jiān)聽到藍牙開啟后,進行設備掃描;發(fā)現(xiàn)設備后進行連接等。
客戶端,與服務端建立長連接,進行通訊:
服務端監(jiān)聽客戶端發(fā)起的連接,進行接收及通訊:
客戶端連接及服務端監(jiān)聽基類,用于客戶端和服務端之前Socket消息通訊,進行消息或文件的發(fā)送、接收,進行通訊關閉操作等:
我這里只是簡單記錄了項目中用到的藍牙通訊,兩個設備之間不通過配對進行連接、通訊。
相關詳細內(nèi)容及使用請查看Github項目:
藍牙配對操作及其它內(nèi)容,可以詳細查看我下面的參考資料,寫的十分詳細,比如設備通過MAC地址,可以通過BluetoothAdapter獲取設備,再通過客戶端connect方法去進行連接等。
連接中遇到問題:read failed, socket might closed or timeout, read ret: -1。
通過改UUID,反射等方法都還是會出現(xiàn)錯誤。連接時,要確保服務端及客戶端都處于完全斷開狀態(tài),否則連接就會出現(xiàn)以上問題,但偶爾還是會有問題,期待有什么好的方法可留言告訴我。
參考資料:
Android-經(jīng)典藍牙(BT)-建立長連接傳輸短消息和文件
Android藍牙開發(fā)—經(jīng)典藍牙詳細開發(fā)流程
歡迎點贊/評論,你們的贊同和鼓勵是我寫作的最大動力!
Android開發(fā)之藍牙(Bluetooth)
在上一篇中有介紹了Wifi與網(wǎng)絡連接處理
Android開發(fā)之WiFi與網(wǎng)絡連接處理
下面,來繼續(xù)說說Android中藍牙的基本使用。
Bluetooth是目前使用的最廣泛的無線通訊協(xié)議之一,主要針對短距離設備通訊(10米),常用于連接耳機、鼠標和移動通訊設備等。
值得一提的是:
android4.2新增了部分新功能,但是對于Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協(xié)議棧針BLE。谷歌和Broadcom之間的合作,開發(fā)新的藍牙協(xié)議棧,取代了基于堆棧的Bluez。因此市場上出現(xiàn)了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。
BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。
first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入權限
**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:
返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。
打開藍牙設備的方式:
1.直接調(diào)用函數(shù)enable()去打開藍牙設備 ;
2.系統(tǒng)API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。
注意: 1.如果藍牙已經(jīng)開啟,不會彈出該Activity界面。2.在目前大多數(shù)Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經(jīng)開啟,那么藍牙的開關 ,狀態(tài)會隨著飛行模式的狀態(tài)而發(fā)生改變。
1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個異步方法,調(diào)用后會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續(xù)12秒。該方法調(diào)用后,搜索過程實際上是在一個System Service中進行的,所以可以調(diào)用cancelDiscovery()方法來停止搜索(該方法可以在未執(zhí)行discovery請求時調(diào)用)。
系統(tǒng)開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統(tǒng)會發(fā)送以下三個廣播:
2.掃描設備
3.定義廣播接收器接收搜索結果
4.注冊廣播
獲取附近的藍牙設備
第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以服務器端和客戶端都應啟動新線程連接。
(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現(xiàn)服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。
服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。
服務端
通過調(diào)用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket(UUID用于客戶端與服務端之間的配對)
客戶端
調(diào)用BluetoothService的createRfcommSocketToServiceRecord(UUID)方法獲取BluetoothSocket(該UUID應該同于服務端的UUID)。
調(diào)用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,并且連接被服務端accept,則connect()方法返回。
數(shù)據(jù)傳遞,通過以上操作,就已經(jīng)建立的BluetoothSocket連接了,數(shù)據(jù)傳遞無非是通過流的形式
獲取流
該類就是關于遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。
好多東西我也不知道怎么描述,下面給出Demo:
剛好有剛學習的小伙伴問我ListView怎么用,那我就用ListView。
源碼:
RairDemo
GitHub:
Coding:
Android 藍牙開發(fā)(三)-藍牙的詳細介紹
前面的兩篇文章,主要是在 Android 官網(wǎng)關于藍牙介紹的基礎上加上自己的理解完成的。主要針對的是 Android 開發(fā)中的一些 API 的使用。
第一篇文章 Android 藍牙開發(fā)(一) 主要是介紹了普通的藍牙在 Android 開發(fā)中的運用。
第二篇文章 Android 藍牙開發(fā)(二) 主要是介紹了低功耗藍牙的開發(fā)。
這篇文章主要介紹的是藍牙的歷史和一些關于藍牙的通用知識,還有廣播包的知識。要想徹底了解藍牙開發(fā),這些基礎的知識也是需要的,就像網(wǎng)絡協(xié)議一樣,這些都是基礎的內(nèi)容。我們的 API 的調(diào)用都是以這個為基礎的,了解這些,開發(fā)過程中遇到問題,才可以知道什么怎么一回事。
下篇文章主要講的就是實際開發(fā)中的一些坑。
藍牙其實就是一種近距離無線通信技術。
從下到上分別為:控制器(Controller)--主機(host)--應用(Application)
詳細介紹各個層的含義:
BLE 應用可以分為兩大類:基于非連接的和基于連接的
意思就是外設和周邊設備不發(fā)生連接,主要靠掃描到的廣播來獲取信息。發(fā)送廣播的一方叫做 broadcaster 監(jiān)聽廣播的一方叫做 oberver 在 GAP 層有對應的角色定義。
網(wǎng)絡拓撲圖:
這種方式就是廣播設備不斷的向外發(fā)送廣播(含有特定的信息),然后觀察者接受到廣播按照兩者之間約定好的協(xié)議進行解析拿到有用的信息。例如:iBeacon,通過這種設備我們可以實現(xiàn)室內(nèi)定位。
其實這些設備的角色可以即使廣播者又是觀察者。接收到廣播后作出了處理,然后又發(fā)送廣播。這樣就形成了雙向的網(wǎng)絡,類似于因特網(wǎng),這就是藍牙 Mesh 組網(wǎng)。
廣播數(shù)據(jù)包格式:
每個廣播數(shù)據(jù)包由 31 byte 組成。分為有效數(shù)據(jù)和無效數(shù)據(jù)兩部分。
例子:
這里是掃描的數(shù)據(jù)包(轉(zhuǎn)換成了 16 進制,兩個代表一個字節(jié)),第一個字節(jié)是 02 表示后面的兩個字節(jié)是數(shù)據(jù)部分,然后第二個字節(jié)是 01 表示了數(shù)據(jù)的類型。后面一個字節(jié)就是真正的數(shù)據(jù)了。這個廣播數(shù)據(jù)單元就分析完了。下面就是另一個數(shù)據(jù)單元了。依次類推,關于數(shù)據(jù)類型的解釋,官網(wǎng)有。
這是數(shù)據(jù)類型對應的含義表。
網(wǎng)絡拓撲圖:
一個中心設備可連接多個外設,但是一個外設只能連接一個中心(外設連接成功后就會停止對外廣播,別人就發(fā)現(xiàn)不了它了)。其中一個中心設備的連接外設的數(shù)量也是有限的。
鏈接: ;mid=2247484141idx=1sn=fd7e71864189b3631ce529afeb4cf669scene=21#wechat_redirect
關于android藍牙app開發(fā)和安卓開發(fā)藍牙的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。