Android蓝牙开发 — 经典蓝牙BLE蓝牙
一,前期基礎知識儲備
1)藍牙是一種支持設備之間短距離通信的無線電技術(其他還包括紅外,WIFI);
支持移動電話、筆記本電腦、無線耳機等設備之間進行信息的交換;
Android支持的藍牙協議棧:Bluz,BlueDroid,BLE;
- Bluz是Linux推出的,目前使用最廣泛;
- BlueDroid是Android4.0之后推出來的,簡化了Bluz的操作;
- BLE是最新的低功耗協議,傳輸效率和傳輸速率都是很高的;
2)藍牙開發技術一共分為兩種:
- 經典藍牙,3.0版本以下的藍牙,功耗高,傳輸數據量大,有效距離10米;
- 低功耗藍牙BLE,4.0及以上版本,低功耗,數據量小,有效距離40米;
經典藍牙的開發包括藍牙的互相連接、讀取藍牙列表、文件傳輸、藍牙耳機等等;
特點:基于Socket連接,傳輸速率快;缺點:耗電,距離短;
通信的流程,發現設備 -> 配對/綁定設備 ?-> ?建立連接 ?-> ?數據通信 ?-> ?斷開連接
BLE藍牙開發主要是低功耗設備(臨近設備間傳輸少量數據),比如血糖儀、藍牙手環、藍牙手表、藍牙溫度槍等等;Android 4.3(API 級別 18)為發揮核心作用的藍牙低功耗 (BLE) 引入內置平臺支持,并提供相應 API,方便應用發現設備、查詢服務和傳輸信息。與傳統藍牙不同,藍牙低功耗 (BLE) 旨在提供顯著降低的功耗。這使 Android 應用可與功率要求更嚴格的 BLE 設備(例如近程傳感器、心率監測儀和健身設備)通信。
注意:當用戶使用 BLE 將其設備與其他設備配對時,用戶設備上的所有應用都可以訪問在這兩個設備間傳輸的數據。
因此,如果您的應用捕獲敏感數據,您應實現應用層安全以保護此類數據的私密性。
3)藍牙通信底層原理:
Android 平臺包含藍牙網絡堆棧支持,此支持能讓設備以無線方式與其他藍牙設備交換數據。應用框架提供通過 Android Bluetooth API 訪問藍牙功能的權限。這些 API 允許應用以無線方式連接到其他藍牙設備,從而實現點到點和多點無線功能。
為了讓支持藍牙的設備能夠在彼此之間傳輸數據,它們必須先通過配對過程形成通信通道。其中一臺設備(可檢測到的設備)需將自身設置為可接收傳入的連接請求。另一臺設備會使用服務發現過程找到此可檢測到的設備。在可檢測到的設備接受配對請求后,這兩臺設備會完成綁定過程,并在此期間交換安全密鑰。二者會緩存這些密鑰,以供日后使用。完成配對和綁定過程后,兩臺設備會交換信息。當會話完成時,發起配對請求的設備會發布已將其鏈接到可檢測設備的通道。但是,這兩臺設備仍保持綁定狀態,因此在未來的會話期間,只要二者在彼此的范圍內且均未移除綁定,便可自動重新連接。
4)關鍵類和接口
android.bluetooth 包中提供所有 Bluetooth API。以下概要列出了創建藍牙連接所需的類和接口:
?BluetoothAdapter
表示本地藍牙適配器(藍牙無線裝置)。BluetoothAdapter 是所有藍牙交互的入口點。借助該類,您可以發現其他藍牙設備、查詢已綁定(已配對)設備的列表、使用已知的 MAC 地址實例化 BluetoothDevice,以及通過創建 BluetoothServerSocket 偵聽來自其他設備的通信。
BluetoothDevice
表示遠程藍牙設備。借助該類,您可以通過 BluetoothSocket 請求與某個遠程設備建立連接,或查詢有關該設備的信息,例如設備的名稱、地址、類和綁定狀態等。
BluetoothSocket
表示藍牙套接字接口(類似于 TCP Socket)。這是允許應用使用 InputStream 和 OutputStream 與其他藍牙設備交換數據的連接點。
BluetoothServerSocket
表示用于偵聽傳入請求的開放服務器套接字(類似于 TCP ServerSocket)。如要連接兩臺 Android 設備,其中一臺設備必須使用此類開放一個服務器套接字。當遠程藍牙設備向此設備發出連接請求時,該設備接受連接,然后返回已連接的 BluetoothSocket。
BluetoothSocket 和 BluetoothServerSocket?
類似于Java中的套接字的 Socket 和 ServerSocket;
在服務器端和客戶端進行數據傳輸的時候都要使用這個類;
服務器端 : 使用BluetoothServerSocket對象可以創建一個BluetoothSocket對象, 調用BluetoothServerSocket的accept()方法就可以獲取該對象;
客戶端 : 調用BluetoothDevice的createRfcommSocketToServiceRecord()可以獲取該對象;?
在服務器端BluetoothServerSocket進行accept()阻塞, 在客戶端BluetoothSocket調用connect()連接服務器, 如果連接成功,?
服務器端的accept()方法就會返回BluetoothSocket對象, 同時客戶端的BluetoothSocket也成功連接服務器,?
此時服務器端和客戶端的BluetoothSocket對象就可以獲取輸入輸出流, 對數據進行操作;
基于藍牙這套通信流程,可以實現一個簡單的聊天程序。
BluetoothHeadset
提供藍牙耳機支持,以便與手機配合使用。這包括藍牙耳機配置文件和免提 (v1.5) 配置文件。
BluetoothA2dp
定義如何使用藍牙立體聲音頻傳輸配置文件 (A2DP),通過藍牙連接將高質量音頻從一個設備流式傳輸至另一個設備。
- A2DP。藍牙立體聲音頻傳輸配置文件 (A2DP) 定義如何通過藍牙連接和流式傳輸,將高質量音頻從一個設備傳輸至另一個設備。Android 提供?BluetoothA2dp?類,該類是用于控制藍牙 A2DP 服務的代理。
官方文檔:《藍牙概覽》《藍牙低功耗概覽》《BluetoothA2dp》
5)電話音頻協議(HSP,HFP)和媒體音頻協議(A2DP,AVRCP)
- HSP(手機規格)– 提供手機(移動電話)與耳機之間通信所需的基本功能。
- HFP(免提規格)– 在 HSP 的基礎上增加了某些擴展功能,原來只用于從固定車載免提裝置來控制移動電話。
- A2DP(高級音頻傳送規格)– 允許傳輸立體聲音頻信號。 (相比用于 HSP 和 HFP 的單聲道加密,質量要好得多)。
- AVRCP(音頻/視頻遙控規格)–用于從控制器(如立體聲耳機)向目標設備(如裝有 Media Player 的電腦)發送命令(如前跳、暫停和播放)。
關于A2DP,安卓手機都是支持A2DP的,只需要通過廣播就可以獲取狀態了。
關于AVRCP,這部分嵌入式工程師的邏輯多,硬件上的按鍵可以控制手機app的,比如按鍵加減時,可以與app交互。
A2DP全名是Advanced Audio Distribution Profile,高質量音頻數據傳輸的協議,其定義里了傳送單聲道或立體聲等高質量音頻(區別于藍牙SCO鏈路上傳輸的普通語音)信息的協議和過程。A2DP的典型應用是將音樂播放器的音頻數據發送到耳機或音箱。?
參考文章:《Android 藍牙開發之A2DP基本功能》
參考項目:sample-bluetooth-audio(Bluetooth A2DP sample using Android Things)
二,上代碼,具體實現
經典藍牙開發文章:《Android藍牙開發—經典藍牙詳細開發流程》《android?經典藍牙開發》
BLE藍牙開發文章:《Android之低功耗藍牙的基本使用》《Android Kotlin&BLE(低功耗藍牙) 筆記》
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 《Android BLE藍牙詳細解讀》《Android 藍牙開發(三) -- 低功耗藍牙開發》
總結:
1)寫過經典藍牙的就知道,如果說兩者的搜索操作還差不多的話,連接操作和寫入操作就是完全不同的東西了。
經典藍牙可以獲取到一個類似 TCP 中 Socket 的對象,然后獲取?InputStream?和OutputStream,二者分別通過套接字以及?getInputStream()和?getOutputStream()來處理數據傳輸。
而 BLE 中需要通過不同的 UUID 獲取對應的服務、特征才可以寫入數據。
2)UUID:每個服務和特征都會有唯一的 UUID ,由硬件決定。
服務(Service):藍牙設備中可以定義多個服務,相當于功能的集合。
特征(Characteristic):一個服務可以包含多個特征,可以通過 UUID 獲取到對應的特征的實例,通過這個實例就可以向藍牙設備發送 / 讀取數據。
藍牙開源框架:《一款適用經典藍牙的快速開發框架》《開源藍牙框架 Android-BLE》
三,藍牙5.0
《古老無線再升級 深入了解藍牙5.0技術》
藍牙5.0是由藍牙技術聯盟在2016年提出的藍牙技術標準,藍牙5.0針對低功耗設備速度有相應提升和優化,藍牙5.0結合wifi對室內位置進行輔助定位,提高傳輸速度,增加有效工作距離。上一次藍牙4.2是公布于2014年12月。
補充一點內容
劃時代的藍牙 4.0?
藍牙技術聯盟(Bluetooth SIG)在2010年發布了跨時代的藍牙4.0,它并不是藍牙3.0的簡單升級版本,
而是全新的技術架構,藍牙4.0版本分兩種模式:單模藍牙和雙模藍牙。常見的藍牙音箱,是典型的雙模藍牙,它需要傳輸大量的音頻數據。
而小米手環,藍牙溫度計則屬于單模藍牙。行業里一般不講單模藍牙,而是統一稱為低功耗藍牙。
相對于經典藍牙,低功耗藍牙芯片有傳輸遠、功耗低、延遲低等優勢。傳輸距離方面,經典藍牙只有10-100米,而BLE最遠能傳輸300米;
連接方式上,經典藍牙只能通過點對點的方式傳輸,而BLE設備能夠能通過點對點、廣播、Mesh組網與其他設備相連;
在功耗上兩者的差別巨大,低功耗藍牙運行和待機功耗極低,使用一顆紐扣電池便能連續工作數月甚至數年之久。
經典藍牙主要用于大量音頻傳輸的情景,而低功耗藍牙主要用在非音頻數據傳輸上。
基于這個差距,經典藍牙和低功耗藍牙應用場景有所不同。經典藍牙主要應用在音頻傳輸設備上,?
而低功耗藍牙主要用在數據傳輸領域,尤其是以物聯網為主的數據傳輸。
如血糖儀、藍牙手環、藍牙手表、藍牙溫度槍、近程傳感器、心率監測儀和健身設備等等。
?藍牙音頻傳輸 - 手機端的音樂如何通過轉碼的方式傳輸到藍牙耳機進行播放。
參考文章:
《經典藍牙與低功耗藍牙芯片功能性能對比》
《BLE技術揭秘》
《說說藍牙音頻常用的編解碼格式》
《Audio/Video Remote Control Profile (AVRCP)》
總結
以上是生活随笔為你收集整理的Android蓝牙开发 — 经典蓝牙BLE蓝牙的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word2016(2013)页码、分节符
- 下一篇: Android 实现嵌套滑动