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中读取数据。