[翻譯] Bluedroid架構簡介

Bluedroid總框架圖以下所示:linux

Java                                                                                   
+--------------------------------+                                                                              
  +-----------------+     C++/C                                                                                 
  |       BTIF      |                                                                                           
  +-----------------+                                                                                           
  |       BTA       |                                                                                           
  +-----------------+                                                                                           
  | Bluedroid Stack |                                                                                           
  +-----------------+  user space                                                                               
+---------------------------------+                                                                             
                      kernel space

下面對各個部分進行簡介。android

Java Application/JNI

Bluetooth app運行於Java層,並經過JNI和協議棧的接口(stack’s Interface Layer,BTIF)進行以下交互:api

  • 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。app

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函數和函數回調接口組成。spa

+------------------------------------------+
|          +--------------------+          |
|          |  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"之中。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中讀取數據。

相關文章
相關標籤/搜索