在Android中,常用的幾種Bluetooth Profile分別為:SPP (Serial Port Profile)、A2DP (Advanced Audio Distribution Profile)、AVRCP (Audio/Video Remote Control Profile)、HID (Human Interface Device Profile)、HFP (Hands-Free Profile)。其中Media相關度比較大的是A2DP和AVRCP,做資料通訊經常用到SPP。
Bluetooth Profile的概念
Profile定義了一種基於藍芽的應用,每個Profile規範主要包括針對開發人員的介面,訊息的格式和標準(例如音頻壓縮),使用藍芽協議棧的組件等等。每一種Profile對應於一個UUID,Bluetooth種UUID的概念類似於TCP/IP中連接埠的概念,每一個UUID運行一種服務。
Bluetooth通過SDP(Service Discovery Protocol)來發現配對裝置的所支援的Profile。在Bluetooth Device的SDP Servie Daemon中,儲存有支援的Service List和串連的Session等資訊,SDP Client利用這些資訊來完成Profile的發現和鑒別。
特殊說明的是,Bluetooth中比較基礎的Profile有Generic Access Profile (GAP)和上述的SDP,此外,SPP通常作為其他Profile的實現基礎。
Bluetooth UUID的概念
UUID的概念應用很普遍,是一種分布式(更確切說是局部式?)的ID產生方式。上述每種Profile均對應一個或多個UUID(同一Profile內不同UUID也對應不同的service)。
在Bluetooth SIG中已定義的Profile的UUID均採用如下方式產生:
BASE_UUID + uuid16 << 96 或 BASE_UUID + uuid32 << 96
其中,BASE_UUID為:
BASE_UUID00000000-0000-1000-8000-00805F9B34FB
因此,Bluetooth SIG預定義的UUID僅在後32位(實際為96~112位)發生變化。例如,
A2DP_UUID0000110B-0000-1000-8000-00805F9B34FB
在Android的logcat種經常看到00805F9B34FB的字串。
Android不同Profile實現情況
Bluetooth的Linux實現有一個官方庫BlueZ,但貌似是閉源的。
SPP
SPP是Android唯一完全開放的Bluetooth Profile,在Offical Tutorial中也採用00000000-0000-1000-8000-00805F9B34FB作為SPP的UUID。
事實上,SPP通訊是一個很基本的方式,UUID完全可以自訂,但Device雙方必須事先共用UUID。
具體實現上,SPP的編程方式非常接近於Linux的Tcp socket. 一些共同的問題如client接入之後處理,另開線程等等都非常類似。
A2DP
A2DP是做音頻和多媒體方面遇到比較多的一個Profile,在Android中已經包含了A2DP對應的API(大部為@hide)。需要自己用reflection的方式來獲得對應的API。
相關的API與Android API Level的對應關係隨後總結。
HID
HID是標準的鍵盤、滑鼠等的輸入輸出,例如可以用這個Profile來實現一些簡單的遠程按鍵控制。
Android種HID的事件捕獲與backKey等等方式相同,可以在使用View.OnKeyListener的onKey來捕獲對應的keyCode。
AVRCP
AVRCP主要是對應一些媒體播放控制,基本可以等價於HID,例如PC的“多媒體鍵盤”上的音量鍵、播放暫停鍵等等。
AVRCP事件可以看成HID的特殊情況,具體在Android的keybord layout中定義按鍵的具體含義。
HFP
在車載種經常用到的Profile。
音頻部分類似於A2DP。支援HFP和A2DP的裝置,Bluetooth在藍芽開啟的情況下會自動連接。