Bluedroid總框架圖以下所示:linux
Java +--------------------------------+ +-----------------+ C++/C | BTIF | +-----------------+ | BTA | +-----------------+ | Bluedroid Stack | +-----------------+ user space +---------------------------------+ kernel space
下面對各個部分進行簡介。android
Bluetooth app運行於Java層,並經過JNI和協議棧的接口(stack’s Interface Layer,BTIF)進行以下交互:api
Bluetooth Profile Interface在Bluetooth Application task (BTA)和JNI層之間充當了膠水層的角色,對上層(JNI)提供了全部profile功能性的接口。這一層上有一個Bluetooth Interface Instance,全部Profile的操做函數都註冊在其中(GAP, AV, DM, PAN, HF,HH, HL, Storage, Sockets)。Client應用經過操做這個Instance來操做Profile。app
這一層實現了各類Profile狀態機。用戶經過驅動狀態機來操做Profile。
Profile狀態機包含如下幾個主要組成部分:框架
例如,調用「BTA_profilexx_act.c」中的API函數時,各部分的執行流程圖以下所示:函數
seq2 +---------------------+ seq3 +-----------------------+ +----> BTA_Profilexx_API.c <----------> BTA's SYS Msg Posting | | +----------^----------+ +-----------^-----------+ | | | | |seq7 | seq4 | | | +--------------+ seq1 +------------------+ | +----------v-----------+ seq5 +-----------v-------+ | User Command <---------> BTIF_Exposed_API +----+----> BTA_Profilexx_Main.c <---------> OS Message Posted | +--------------+ seq9 +------------------+ seq8 +----------^-----------+ +-------------------+ | |seq6 | +----------v---------+ | BTA_Profilexx.Ci.c | +--------------------+
核心協議棧(Core Stack)會被編譯成一個linux動態庫,其中包含的模塊以下圖所示。每個模塊都由api函數和函數回調接口組成。spa
+------------------------------------------+ | +--------------------+ | | | LIBBT_BRCM_Stack | | | +--------------------+ | | +---------+ +-----+ +------+ +-----+ | | | | |A2DP | |AVCTP | |AVDTP| | | | | +-----+ +------+ +-----+ | | | | +-----+ +------+ +-----+ | | | | |BNEP | | PAN | |HID | | | | BT | +-----+ +------+ +-----+ | | | Manager | +-----+ +------+ +-----+ | | | | |L2CAP| |RFCOMM| |SDP | | | | | +-----+ +------+ +-----+ | | | | +-----+ +------+ +-----+ | | | | |MCAP | |SMP | |GATT | | | +---------+ +-----+ +------+ +-----+ | | +------------------------+ | | | Host Control Interface | | | +------------------------+ | +------------------------------------------+
HCI層由libbt-hci共享庫組成,負責通信層(transport layer,如UART H4或者SMD channel)和協議棧之間的交互。
HAL層libbt-vendor共享庫組成,是各廠商的解決方案的特定實現。HAL層實現了各廠商對OPCODE的處理邏輯,這些OPCODE聲明在HCI層的bt_vendor_lib.h中。線程
Bluedroid中,協議棧,藍牙規範和藍牙應用都運行在一個用戶進程"com.android.bluetooth"之中。code
藍牙代碼在如下四種task表明的上下文(context)中運行:
* BTIF_TASK
* BTU_TASK
* A2DP_MEDIA_TASK
* GKI_TIMER_TASK
task之間經過消息(message)來交換信息。接口
調用JNI層的API函數會經過消息轉發機制,在BTIF_TASK中執行。 JNI,HAL回調在BTIF_TASK中執行。 有須要時,BTIF_TASK中的調用可切換到BTU_TASK中執行。 藍牙規範(Profiles)和協議的實現代碼在BTU_TASK中執行。 藍牙傳輸驅動程序中有一條rx線程(bt_hc_worker_thread)負責從UART/SMD中讀取數據。