[翻译] Bluedroid架构简介
Bluedroid总框架图如下所示:
Java +--------------------------------+ +-----------------+ C++/C | BTIF | +-----------------+ | BTA | +-----------------+ | Bluedroid Stack | +-----------------+ user space +---------------------------------+ kernel space
下面对各个部分进行简介。
Java Application/JNI
Bluetooth app运行于Java层,并通过JNI和协议栈的接口(stack’s Interface Layer,BTIF)进行如下交互:
- JNI层的作用是将Java调用转化为C函数的调用,同时为应用和协议栈提供了调用/回调的交互能力。
BTIF (Bluetooth Profile Interface)
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。
BTA
这一层实现了各种Profile状态机。用户通过驱动状态机来操作Profile。
Profile状态机包含以下几个主要组成部分:
- BTA_profilexx_act.c => 包含对应Profile的“Action”函数,一般来说由Profile状态机调用。
- BTA_profilexx_api.c => 对应Profile的API的具体实现。通常它们是提供给用户使用,完成usecase的函数和回调
- BTA_profilexx_ci.c => 对应Profile的“call-in”函数的实现(供Profile以外的模块调用)
- BTA_profilexx_co.c => 对应Profile的“call-out”函数的实现(调用Profile以外的模块)
- BTA_profilexx_main.c => 对应Profile的状态机和处理协议栈上传消息的handler的具体实现。主要负责维护Profile状态的变化及其引起的“Action”
例如,调用“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
核心协议栈(Core Stack)会被编译成一个linux动态库,其中包含的模块如下图所示。每一个模块都由api函数和函数回调接口组成。
+------------------------------------------+ | +--------------------+ | | | LIBBT_BRCM_Stack | | | +--------------------+ | | +---------+ +-----+ +------+ +-----+ | | | | |A2DP | |AVCTP | |AVDTP| | | | | +-----+ +------+ +-----+ | | | | +-----+ +------+ +-----+ | | | | |BNEP | | PAN | |HID | | | | BT | +-----+ +------+ +-----+ | | | Manager | +-----+ +------+ +-----+ | | | | |L2CAP| |RFCOMM| |SDP | | | | | +-----+ +------+ +-----+ | | | | +-----+ +------+ +-----+ | | | | |MCAP | |SMP | |GATT | | | +---------+ +-----+ +------+ +-----+ | | +------------------------+ | | | Host Control Interface | | | +------------------------+ | +------------------------------------------+
HCI and HAL Layers
HCI层由libbt-hci共享库组成,负责通讯层(transport layer,如UART H4或者SMD channel)和协议栈之间的交互。
HAL层libbt-vendor共享库组成,是各厂商的解决方案的特定实现。HAL层实现了各厂商对OPCODE的处理逻辑,这些OPCODE声明在HCI层的bt_vendor_lib.h中。
TASK管理
Bluedroid中,协议栈,蓝牙规范和蓝牙应用都运行在一个用户进程"com.android.bluetooth"之中。
蓝牙代码在以下四种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中读取数据。