介绍结
参考:蓝牙 | Android 开源项目 | Android Open Source Projecthttps://source.android.com/docs/core/connect/bluetooth
蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:
应用框架
处于应用框架级别的是应用代码,它使用 android.bluetooth API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
蓝牙系统服务
蓝牙系统服务(位于 packages/apps/Bluetooth
中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。
JNI
与 android.bluetooth 相关联的 JNI 代码位于 packages/apps/Bluetooth/jni
中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。
蓝牙堆栈
AOSP 中提供了默认蓝牙堆栈(位于 system/bt
中)。该堆栈实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
供应商实现
供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互
HIDL
HIDL 定义了蓝牙堆栈和供应商实现之间的接口。如需生成蓝牙 HIDL 文件,请将蓝牙接口文件传入 HIDL 生成工具中。接口文件位于 hardware/interfaces/bluetooth 中。
蓝牙堆栈开发
Android 蓝牙堆栈是一个完全限定的蓝牙堆栈。限定列表位于蓝牙 SIG 网站上的 QDID 169365 下。
核心蓝牙堆栈位于 [system/bt](https://android.googlesource.com/platform/system/bt/+/master)
中。开发工作在 AOSP 中进行,欢迎贡献内容。
Android Bluetooth Stack代码具体实现
Android蓝牙协议栈的实现在system/bt目录
应用框架 android.bluetooth
以下类和接口 是为APP 提供的API,在API内部通过Binder 机制向下调用
Interfaces
BluetoothAdapter.LeScanCallback | Callback interface used to deliver LE scan results. |
BluetoothProfile | Public APIs for the Bluetooth Profiles. |
BluetoothProfile.ServiceListener | An interface for notifying BluetoothProfile IPC clients when they have been connected or disconnected to the service. |
Class
BluetoothA2dp | This class provides the public APIs to control the Bluetooth A2DP profile. |
BluetoothAdapter | Represents the local device Bluetooth adapter. |
BluetoothAssignedNumbers | Bluetooth Assigned Numbers. |
… | … |
蓝牙系统服务
代码位置:/aosp/packages/apps/Bluetooth/ ,这个文件夹中的代码实现了蓝牙服务和配置文件,并且最后编译时打包成一个APP,这个APP通过JNI调用蓝牙堆栈
JNI
“Bluetooth” 应用程序调用的JNI 位于/aosp/packages/apps/Bluetooth/jni 中。
JNI 负责调用原生的蓝牙协议栈。
蓝牙堆栈
蓝牙堆栈代码位于/aosp/system/bt 中
这层的代码通过调用hal 层代码 来调用底层硬件
因此厂商就可以通过HIDL 接口 来对接自己的硬件设备。
HDIL
hidl 接口代码位于/hardware/interfaces/bluetooth
我们就可以按照HIDL 实现自己的接口了
厂商蓝牙协议栈
已经集成到aosp源码中的厂商蓝牙代码定义在/aosp/hardware中
以瑞昱(realtek)为例
对于蓝牙厂商来说必须提供一个名字为 libbt-vendor.so的库文件,这个文件的接口在
/aosp/hareware/interfaces/bluetooth/1.0/default/bt_vendor_lib.h中定义好了,aosp 并没有实现,需要厂商提供这个文件的实现方法。
bt_vendor_lib.h源码:
#ifndef BT_VENDOR_LIB_H#define BT_VENDOR_LIB_H#include #include #include #ifdef __cplusplusextern "C" />
通过代码可以知道,厂商最终只需要实现
/* Entry point of DLib -- * Vendor library needs to implement the body of bt_vendor_interface_t * structure and uses the below name as the variable name. HCI library * will use this symbol name to get address of the object through the * dlsym call. */extern const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE;
通过这个结构体,蓝牙协议栈将厂商的实现的方法导入到协议栈内部。
bluetooth@1.0通过vendor_interface.cc 中“VendorInterface::Open ”函数加载 这个lib