文章目录
-
- 1、preface
- 2、蓝牙技术方案
- 3、蓝牙架构
-
- [2)Android Blueroid架构](#2)Android Blueroid架构)
-
- [1.Android 4.2中BlueDroid](#1.Android 4.2中BlueDroid)
- [1.Android 7.x](#1.Android 7.x)
- 2.Android8-Android13
- [3.Android 14](#3.Android 14)
- 4.Android总体架构
- 5.Android总体架构-协议栈分层视图
- 3)蓝牙协议栈架构(协议视图)
- 4、源码目录
1、preface
1)资料快车
1、Android Bluetooth架构简析: https://blog.csdn.net/gang542725/article/details/124802302
2、Android 8~12蓝牙架构组件介绍 :https://wlink.blog.csdn.net/article/details/128433978
2)概述
1、注意蓝牙协议栈不在内核,而是运行在用户空间(native层) - 相当于蓝牙SDK;
2、不同平台下的蓝牙协议栈的实现是不同的,比如Linux下的bluez,Android下的bluedroid(Android原本也使用bluez,在Android 4.2之后,Bluedroid取代了之前的BlueZ,Bluedroid是Broadcom提供的一个协议栈实现),值得注意bluez架构不同,部分实现在kernel下,因此会AOSP代码会看到bluedroid和bluez;
3、车载蓝牙协议栈是全新的,因此使用场景不同导致不能复用旧的协议栈;
4、不同系统版本(host) 搭配 不同蓝牙芯片(controller),行为是否一致?
1)由于host端软件和controller端软件 存在多个版本,并且功能在持续迭代,因此总体流程一致,但通信细节有可能是不同的,这部分是需要适配;
3)对比WIFI/ETHENET架构?
WIFI/BT基本类似,是一个较为独立且体量大的模块,有专门的组织去开发维护,并且技术升级速度快,因此相对其它模块,音频/显示/视频/输入子系统,架构上会有点独树一帜!
1)协议栈部分:ETHENET/WIFI 网络协议栈都在kernel下实现;BT则上移到用户空间实现;
2)Framework部分:WIFI native层有supplicant(控制认证连接)、bt则有单独的Bluetooth process(apk)提供基础API给应用;
4)BlueDroid和BlueZ区别
1、资料快车
1)BlueDroid 和 BlueZ区别: https://blog.csdn.net/jly_20220520/article/details/149941783
2)深入理解Bluez协议栈: https://blog.csdn.net/wanguofeng8023/article/details/129933584
2、概述
1)bluez与Wi-Fi类似,都使用socket和sk buff;
3、BlueZ架构图

4、源码目录
kernel/net/bluetooth
kernel/drivers/bluetooth
include/net/bluetooth
5、BlueDroid和BlueZ的核心差异对比

2、蓝牙技术方案
1)WIFI/BT都是一样的,市面上有三种方案
1、SOC(运行BT Host) + 蓝牙HCI架构芯片(运行BT Controller) -> 复杂度高,完全开放接口,功能取决于上层;比如安卓TV,手机等,
2、蓝牙芯片(运行BT Controller + BT Host + 主控功能) -> 一个蓝牙芯片当做主控,可以做到极致成本,小产品场景;
2、MCU + 蓝牙模组(运行BT Controller+BT Host) -> 使用AT指令,使用简单,灵活性差,实现简单功能可以选择;比如智能门锁,开发难度最低;
3、蓝牙架构
2)Android Blueroid架构
1、Android中的蓝牙协议栈的实现就是Blueroid,Bluedroid是运行在用户空间的庞大 C/C++ 协议栈(android8开始使用cpp写),其内部模块划分清晰,共同协作处理蓝牙通信,注意Bluedroid是指代蓝牙协议部分,Android的蓝牙架构还有其它部分组成!
1.Android 4.2中BlueDroid

1.Android 7.x

2.Android8-Android13

3.Android 14

1)通讯路径
应用层 (Java/Kotlin) -> Bluetooth Manager Service (Binder) -> Bluedroid (C++) -> HCI 层 -> Vendor HAL (libbt-vendor) -> 内核驱动 -> 蓝牙硬件
4.Android总体架构
1)Android架构、Android组件、蓝牙协议栈的关系如下

5.Android总体架构-协议栈分层视图

3)蓝牙协议栈架构(协议视图)
1.协议全景图

1)HOST定义 :运行在主控芯片上的软件(包括驱动)
2)Controller定义 :运行在蓝牙芯片上的软件(Firmware)
2.协议体系分层视图

1)蓝牙协议栈大体可以分为应用层(profile)、中间协议层(protocol)、底层(相当于网络架构中的数据链路层)
3.HOST层的分层
4.通信模型

5.BLE官方协议栈架构

4、源码目录
1)基本目录
1.system_ui / setting
2.framework层
/android/packages/modules/Bluetooth/framework/java/android/bluetooth/BluetoothAdapter.java
3.BluetoothManagerService
/android/packages/modules/Bluetooth/service/src/com/android/server/bluetooth/BluetoothManagerService.java
4.从BMS到AdapterService的桥梁 - 服务绑定
1)绑定机制doBind
/android/packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterService.java
5.AdapterService
/android/packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterService.java
6.JNI
/android/packages/modules/Bluetooth/android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp
enableNative()
7.native (Android11及以前Bluetooth/system/bt/* 、之后Bluetooth/system/* Bluetooth/system/gd/*)
Bluetooth的native层就是对应协议栈
8.hal
/android/hardware/interfaces/bluetooth/1.0/default/vendor_interface.cc
VendorInterface::Open()
--load_bluetooth_driver(device_id)
9.libbt-vendor
/android/vendor/cvte/wifi_bt/bluetooth/aic/aic8800d80n/20251222/libbt/libbt
10.kernel&driver
1) 字符设备驱动+usb驱动
/android/vendor/cvte/wifi_bt/bluetooth/aic/aic8800d80n/20251222/bt_driver - 内核驱动的工作也不是很多,主要工作在蓝牙芯片端(controller)
2)注意BLUEDROID协议栈实现都在用户态,内核态只有驱动,BLUEZ有所不同,kernel有hci/transport的实现;
1.Android的驱动代码,对于CONFIG_BLUEDROID,不包含kernel bluetooth头文件
#if CONFIG_BLUEDROID
#else
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
#include <net/bluetooth/hci.h>
#endif
3) 对于BLUEZ,内核只负责提供最基础的HCI传输通道(比如UART或USB),此目录有不同厂商实现的vendor、bt driver参考
/android/common/common14-5.15/common/drivers/bluetooth/*
2)目录介绍
1.Fluoride与Gabeldorsche
1)Fluoride协议栈 - Android11 及之前的版本 - 源码路径 /system/bt/
2)gd协议栈 - Android11之后的版本 - 源码路径 /system/* , 重点是/system/gd/*
Gabeldorsche,是 Android 中一套现代化的蓝牙协议栈实现,你可以把它看作经典 Fluoride 协议栈的下一代版本
(1)GD 使用 Rust 语言重写了部分底层核心
(2)为了实现平稳过渡,GD 引入了一个 Shim 层,它像一个"翻译官",允许新旧两种协议栈在系统中共存并协同工作
(3)GD 提供了完善的测试框架,支持单元测试、集成测试
2.蓝牙协议栈
/android/packages/modules/Bluetooth/system
main/ :协议栈的主入口,负责整个蓝牙协议栈的初始化
btif/ : bluetooth interface 连接上层 JNI 与下层协议栈的**适配层**
btu/ : Bluetooth upper layer 核心协议栈的**任务调度与管理中心**
btm/ : bluetooth manager 负责蓝牙配对与链路管理(设备发现、连接、加密)
stack/ : 存放核心协议,如l2cap, sdp, gatt等
hci/ :主机控制器接口层,封装所有HCI命令、事件和数据发送接收
device/ : 存放特定蓝牙芯片交互的vendor库,
1.蓝牙协议栈
HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等一系列协议实现(用于不同的场景,蓝牙遥控、蓝牙音响采用不同的协议)
1) hci
/android/packages/modules/Bluetooth/system/gd/hci/controller.cc
协议栈配置文件
/android/packages/modules/Bluetooth/system/conf/bt_stack.conf
3)BTIF
负责处理HAL和BTA/BTE之间的消息。
重要文件有:
Btif_core.c:包含了HAL和BTE之间的全部核心功能性接口。
Btif_dm.c:包含与设备管理(Device Management,DM)相关的功能。
Btif_storage.c:负责存储与读取NVRAM中与本地蓝牙适配器(BT adapter)和远端设备属性相关的信息。在单板上,这些信息存储于Bt_config.conf中(data/misc/bluedroid/)。
BTIF task:
下行:
Framework层的java service调用bluedroid接口时,切换到这个线程执行调用程序。
jni_thread.StartUp() 通过bta_sys_sendmsg()来向Bta、btu发送消息。
上行:
Bta、btu向上发送的event,切换到bt_jni_msg_ready()处理event。
BTIF_task会调用上层初始化时注册的callback(bt_hal_cbacks),向上层发送event。
/android/packages/modules/Bluetooth/system/btif/src/bluetooth.cc
void set_hal_cbacks(bt_callbacks_t* callbacks) { bt_hal_cbacks = callbacks; }
3)BTA
Bluetooth Application,指蓝牙Profile的Bluedroid实现,实现了蓝牙设备管理、状态管理及一些应用规范。
均由BTIF层进行管理和调用。
Bta_dm_act.c:包含与设备管理状态机相关的所有动作函数。
Bta_dm_api.c:与BTA设备管理相关的API函数实现。

3)BTU
Bluetooth Upper Layer
作用:
1.承接BTA与HCI层
2.负责获取HCI层返回的事件并将该事件分发给处理者
3.负责命令的发送
4.Btu_task(蓝牙协议栈核心控制块)
BTU_task:
下行:
在收到BTIF_task发下来的消息后,bta_btu_thread处理完后,会调用 btu_hci_msg_process函数将消息分类发送给HCI层处理。
上行:
HCI层通过btu_hci_msg_queue发上来数据包后,bta_btu_thread处理 完后,会调用bta_sys_event函数交由BTA处理。
3)BTE
Bluetooth Embedded System
1.Bluedroid的内部处理,细分为BTA,BTU,BTM和HCI。
2.协议栈启动时调用bte_main_enable。
3.协议栈初始化时调用bte_main_boot_entry。
4.解析bt_did.conf文件,注册设备信息。
5.提供bte_main_hci_send函数给上层发送HCI消息给下层。
3)HCI
主要工作是收发命令(包括命令的超时管理),接收组包和发送拆包等。
向下发送HCI命令时,调用transmit_command。
向下发送数据包时,调用transmit_downward
向上发送数据或Event时,会通过upwards_data_queue来发送,该upwards_data_queue实际上就是btu_hci_msg_queue。