Android子系统之蓝牙架构
文章目录1、preface1资料快车2概述3对比WIFI/ETHENET架构4BlueDroid和BlueZ区别2、蓝牙技术方案3、蓝牙架构2Android Blueroid架构1.Android 4.2中BlueDroid1.Android 7.x2.Android8-Android133.Android 144.Android总体架构5.Android总体架构-协议栈分层视图3蓝牙协议栈架构(协议视图)1.协议全景图2.协议体系分层视图3.HOST层的分层4.通信模型5.BLE官方协议栈架构4、源码目录1基本目录2目录介绍3BTIF3BTA3BTU3BTE3HCI1、preface1资料快车1、Android Bluetooth架构简析 https://blog.csdn.net/gang542725/article/details/1248023022、Android 8~12蓝牙架构组件介绍 https://wlink.blog.csdn.net/article/details/1284339782概述1、注意蓝牙协议栈不在内核而是运行在用户空间native层 - 相当于蓝牙SDK2、不同平台下的蓝牙协议栈的实现是不同的比如Linux下的bluezAndroid下的bluedroidAndroid原本也使用bluez在Android 4.2之后Bluedroid取代了之前的BlueZBluedroid是Broadcom提供的一个协议栈实现值得注意bluez架构不同部分实现在kernel下因此会AOSP代码会看到bluedroid和bluez;3、车载蓝牙协议栈是全新的因此使用场景不同导致不能复用旧的协议栈4、不同系统版本(host) 搭配 不同蓝牙芯片(controller)行为是否一致1由于host端软件和controller端软件 存在多个版本并且功能在持续迭代因此总体流程一致但通信细节有可能是不同的这部分是需要适配3对比WIFI/ETHENET架构WIFI/BT基本类似是一个较为独立且体量大的模块有专门的组织去开发维护并且技术升级速度快因此相对其它模块音频/显示/视频/输入子系统架构上会有点独树一帜1协议栈部分ETHENET/WIFI 网络协议栈都在kernel下实现BT则上移到用户空间实现2Framework部分WIFI native层有supplicant(控制认证连接)、bt则有单独的Bluetooth process(apk)提供基础API给应用4BlueDroid和BlueZ区别1、资料快车1BlueDroid 和 BlueZ区别 https://blog.csdn.net/jly_20220520/article/details/1499417832深入理解Bluez协议栈 https://blog.csdn.net/wanguofeng8023/article/details/1299335842、概述1bluez与Wi-Fi类似都使用socket和sk buff3、BlueZ架构图4、源码目录kernel/net/bluetooth kernel/drivers/bluetooth include/net/bluetooth5、BlueDroid和BlueZ的核心差异对比2、蓝牙技术方案1WIFI/BT都是一样的市面上有三种方案1、SOC(运行BT Host) 蓝牙HCI架构芯片(运行BT Controller) - 复杂度高完全开放接口功能取决于上层比如安卓TV手机等2、蓝牙芯片(运行BT Controller BT Host 主控功能) - 一个蓝牙芯片当做主控可以做到极致成本小产品场景2、MCU 蓝牙模组(运行BT ControllerBT Host) - 使用AT指令使用简单灵活性差实现简单功能可以选择比如智能门锁开发难度最低3、蓝牙架构2Android Blueroid架构1、Android中的蓝牙协议栈的实现就是BlueroidBluedroid是运行在用户空间的庞大 C/C 协议栈android8开始使用cpp写其内部模块划分清晰共同协作处理蓝牙通信注意Bluedroid是指代蓝牙协议部分Android的蓝牙架构还有其它部分组成1.Android 4.2中BlueDroid1.Android 7.x2.Android8-Android133.Android 141通讯路径应用层 (Java/Kotlin) - Bluetooth Manager Service (Binder) - Bluedroid (C) - HCI 层 - Vendor HAL (libbt-vendor) - 内核驱动 - 蓝牙硬件4.Android总体架构1Android架构、Android组件、蓝牙协议栈的关系如下5.Android总体架构-协议栈分层视图3蓝牙协议栈架构(协议视图)1.协议全景图1HOST定义 运行在主控芯片上的软件(包括驱动)2Controller定义 运行在蓝牙芯片上的软件(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.kerneldriver 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.conf3BTIF负责处理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会调用上层初始化时注册的callbackbt_hal_cbacks)向上层发送event。 /android/packages/modules/Bluetooth/system/btif/src/bluetooth.cc void set_hal_cbacks(bt_callbacks_t* callbacks) { bt_hal_cbacks callbacks; }3BTABluetooth Application指蓝牙Profile的Bluedroid实现实现了蓝牙设备管理、状态管理及一些应用规范。 均由BTIF层进行管理和调用。 Bta_dm_act.c:包含与设备管理状态机相关的所有动作函数。 Bta_dm_api.c与BTA设备管理相关的API函数实现。3BTUBluetooth 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处理。3BTEBluetooth Embedded System 1.Bluedroid的内部处理细分为BTABTUBTM和HCI。 2.协议栈启动时调用bte_main_enable。 3.协议栈初始化时调用bte_main_boot_entry。 4.解析bt_did.conf文件注册设备信息。 5.提供bte_main_hci_send函数给上层发送HCI消息给下层。3HCI主要工作是收发命令包括命令的超时管理接收组包和发送拆包等。 向下发送HCI命令时调用transmit_command。 向下发送数据包时调用transmit_downward 向上发送数据或Event时会通过upwards_data_queue来发送该upwards_data_queue实际上就是btu_hci_msg_queue。