藍牙(Bluetooth)提供移動設備及其配件之間低功耗、低成本的無線通訊鏈接。藍牙技術的核心,是根據藍牙標準所實現的藍牙協議棧。藍牙能同時進行異步數據及同步語音傳輸,它的底層協議層包括衆多協議,如邏輯鏈路控制和適配協議(L2CAP)、服務發現協議(SDP)、串口模擬協議(RFCOMM)等,一塊兒爲上層提供傳輸支持。而主要控制接口則由主機控制接口層(HCI)體現,它是藍牙協議中軟硬件之間的接口。在各類協議及HCI之上,是藍牙的上層應用框架,框架裏每一個應用模式稱之爲一個Profile,供給外部不一樣的設備訪問,如無線立體聲耳機使用的A2DP(Advanced Audio Distribution Profile)以及打印機使用的無線打印機服務等,服務有數十種之多。
1.藍牙基本架構
Android提供了對藍牙的支持。藍牙系統的內容包括:
·Linux內核的藍牙驅動程序
·Linux內核的藍牙協議層
·bluez(藍牙在用戶空間的庫)
·bluez適配層
·android.bluetooth包中的各個類(藍牙在框架層的內容)
·藍牙相關的應用程序
Android的藍牙部分的結構以下:

2.藍牙用戶空間庫bluez
Android所採用的藍牙用戶空間庫是bluez,它是Linux平臺上一套完整的藍牙協議棧開源實現。在Android中,bluez提供了不少分散的應用,包括守護進程和一些工具;bluez經過D-BUS IPC機制來提供應用層接口。須要注意的是,bluez的底層協議實如今kernel代碼中,並不屬於用戶空間。
D-BUS是一套應用普遍的進程間通訊機制,相對於Socket等底層IPC,它是更加複雜的IPC機制,支持更系統化的服務名、函數名等,同時也能對衆多服務進程和客戶端進行管理,調度通訊消息的傳遞。D-BUS和Binder相似,可是應用範圍更普遍。
bluez的主要體現結構以下:

3.bluez適配層
bluez在Android中的使用,須要通過Android的bluez適配層的封裝來實現,bluez適配層源代碼及頭文件路徑爲:system/bluetooth/。該目錄除了包含生成適配層庫libbluedroid.so的源碼以外,還包含bluez頭文件、bluez配置文件等目錄。因爲bluez使用D-BUS做爲與上層溝通的接口,所以適配層構造比較簡單,封裝了藍牙的開關功能以及射頻開關。
4.藍牙的JNI和Java部分
藍牙的JNI源代碼文件爲:frameworks/base/core/jni/android_bluetooth_*.cpp。藍牙部分的JNI帶有android_bluetooth_前綴,它們將提供android.bluetooth包中多個類的支持,這些內容會與其它模塊JNI部分一塊兒生成libandroid_runtime.so。
藍牙的Java源代碼路徑爲:
·
frameworks/base/core/java/android/server:藍牙的服務部分
·
frameworks/base/core/java/android/bluetooth/:Android的藍牙類
Android支持藍牙設備的發現、配對、服務查找等基礎功能,服務方面支持耳機(Headset)、免提(Handsfree)和立體聲(A2DP)等部分。
①核心組成
框架核心組成部分是android.bluetooth包中以IBluetoothDevice.aidl爲接口的IBinder服務器端BluetoothDeviceService、客戶端BluetoothDevice以及android.server包中的BluetoothEventLoop。
BluetoothDeviceService實現藍牙功能的開啓/關閉、設備的發現和配對、服務的發現和綁定等功能,android_server_BluetoothDeviceService.cpp對其提供JNI本地代碼支持。
·開關功能經過直接調用bluez適配層提供的開關功能來實現
·服務發現和綁定等功能,均經過D-BUS調用bluez接口來實現。BluetoothDevice中其它的訪問服務流程與此相似。
Android藍牙Java部分和底層的關係以下:

②耳機及免提服務
對於服務實現部分的代碼,主要是耳機和免提。二者都支持通話,區別在於免提能夠支持一些操做按鍵,如拒接電話等,而耳機則不行。Android要支持這兩個服務,則須要支持兩種途徑:一是經過SDP發佈這兩個服務,讓配對的藍牙設備能夠發現這兩個服務並主動進行鏈接;二是Android經過SDP判斷設備是否支持鏈接到這兩個服務,若是支持則主動去鏈接設備。鏈接方式都是經過RFCOMM協議完成的。最終的音頻通道數據則由SCO協議傳輸。Android藍牙的耳機及免提服務的結構以下:

③A2DP服務
A2DP服務對藍牙立體聲耳機提供支持,相比SCO,它能傳輸更好音質的音頻數據。A2DP更多地用在音樂播放方面,而SCO則更多地用在電話語音等方面。A2DP結構以下:

bluez對A2DP的支持很好,
A2DP部分主要圍繞IBluetooth
A2DP來實現,Service部分經過D-BUS與bluez的Audio部分通訊,主要的控制接口是Audio的sink組件,sink用來鏈接支持
A2DP的Headset設備。若是Headset設備支持
A2DP,Android能夠自動完成SCO和
A2DP的切換。