介绍结

参考:蓝牙 | 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.LeScanCallbackCallback interface used to deliver LE scan results.
BluetoothProfilePublic APIs for the Bluetooth Profiles.
BluetoothProfile.ServiceListenerAn interface for notifying BluetoothProfile IPC clients when they have been connected or disconnected to the service.

Class

BluetoothA2dpThis class provides the public APIs to control the Bluetooth A2DP profile.
BluetoothAdapterRepresents the local device Bluetooth adapter.
BluetoothAssignedNumbersBluetooth 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