[翻译] 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中读取数据。

相关推荐