Android 蓝牙架构及其源码目录分析-a2dp-hfp-avrcp-ble

Android 蓝牙架构及其源码目录分析-a2dp-hfp-avrcp-ble,第1张

android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程
Android 蓝牙A2dp-Avrcp初始化-连接-播放源码分析文档大全 - 点击下载 一、Android Bluetooth 架构

 HAL:    Hardware Abstraction Layer硬件抽象层
BTIF:    Bluetooth Interface蓝牙接口
BTA:    Bluetooth Application蓝牙应用
BTU:    Bluetooth Upper layer蓝牙上层
BTE:    Bluetooth Embedded蓝牙嵌入系统
BTM:    Bluetooth Device Manager设备管理器
CO:    Call out呼出
CI:    Call in来电
HF:    Hands free Profile免提配置文件
HH:    HID Host Profile人机接口设备协议
HL:    Health Device Profile健康器械配置文件
AV:    Audio\Video 音频\视频
AG:    Audio Gateway音频网关
AR:    Audio/Video Registration音频/视频注册
GATTC:    GATT Client客户端
GATTS:    GATT Server服务端
BLE:    Bluetooth Low Energy低功耗蓝牙
PAN:    Personal Area Network个人局域网
L2CAP:    Logical Link Control and Adaptation Layer Protocol
    逻辑链路控制和适配层协议。
RFCOMM:    RFCOMM提供基于L2CAP协议的串口仿真

 

 二、源码架构分析—— Application

Android蓝牙应用程序,使用蓝牙API的程序;

代码路径
谷歌安卓源码地址:  http://androidxref.com/
1、Bluetooth的设置应用
路径: packages/apps/Settings/src/com/android/settings/bluetooth
BluetoothDevicePreference.java
蓝牙设备首选项,即蓝牙设备的配置信息,比如是否连接,是否配对,是否可见等等。该类继承了preference类,主要是提供获取蓝牙设备及通知蓝牙设备配置信息变化。

BluetoothDiscoverableEnabler.java
蓝牙搜索UI逻辑处理,包括搜索暂停,搜索恢复及蓝牙开启关闭时的蓝牙搜索处理,搜索超时等处理。该类同时使用了broadcast与handle机制,用来处理搜索的状态变化。

BluetoothEnabler.java
蓝牙功能的开启/关闭功能处理。

BluetoothEventRedirector.java
蓝牙事件转发处理,通过使用broadcast机制,在onstart里面注册了蓝牙的事件权限。
 

RequestPermissionHelperActivity.java
询问用户是否开启蓝牙及蓝牙搜索,一般由RequestPermissionActivity.java启动。

SettingsBtStatus.java
蓝牙各种状态的资源显示。

BluetoothSettings.java
蓝牙设置应用,蓝牙状态变化及设备绑定信息处理等。各个菜单处理主要是通过CachedBluetoothDevice.java来实现。主要有添加蓝牙设备,删除蓝牙设备,点击获取蓝牙设备信息,及创建具体蓝牙设备的菜单等。

ConnectSpecificProfilesActivity.java
蓝牙设备耳机、A2DP、SAP(SIM Access Profile)相关的设置处理。

DockService.java
蓝牙Dock相关服务,配置信息的修改,连接的修改等。

DockEventReceiver.java
接收各种dock事件,并启动DockService服务。并提供一个结束服务方法。

CachedBluetoothDevice.java
提供蓝牙设备的各种属性信息以及提供蓝牙设备连接,配对等方法。

CachedBluetoothDeviceManager.java
管理蓝牙设备,包括增加、删除蓝牙设备及通知。

LocalBluetoothManager.java
提供了一系列蓝牙方法,如开始扫描、结束扫描逻辑处理。

2. Bluetooth 服务
路径: packages/apps/Bluetooth/src/com/android/bluetooth
该层主要在Bluetooth Process里实现各种Bluetooth Service和各种配置文件(Profile),Service通过JNI调用到硬件抽象(HAL)层,最后编译形成一个Android Application包(Bluetooth.apk).

3. Bluetooth的framework层
路径: frameworks/base/core/java/android/Bluetooth
该层代码主要利用android.Bluetooth APIS和蓝牙进程进行交互,也就是通过Binder IPC机制调用了蓝牙进程的各个服务(Service)封装的接口。如BluetoothClass,BluetoothAdapter,BluetoothDevice等,Bluetooth应用就是通过这些类实现。里面有供java层使用一些类,也有对应的aidl文件联系C/C++部分的代码。

4. framework层的JNI接口
路径:frameworks/base/core/jni/
主要是为Bluetooth的JAVA类提供一些底层API支持(C++实现),如headset,socket等。

5.Profile对应的 JNI接口
路径: packages/apps/Bluetooth/jni
定义了蓝牙适配层和协议层对应的JNI服务,直接调用HAL层并给HAL层提供相应的回调。

6. Bluetooth HAL
路径: hardware/libhardware/include/hardware
定义了android.Bluetooth APIs和Bluetooth Process调用的标准接口,通过调用这些接口使得硬件(Hardware)运行正常。
 bluetooh.h 包含蓝牙硬件 *** 作,设备管理和设备 *** 作抽象接口。
在HAL层并没有实现定义的蓝牙协议与属性,默认实现在Bluedroid中,位于system/bt下,用户可以根据自己的需求增加属性。

7. BlueDroid 协议栈代码
路径: system/bt
该层代码实现了HAL层中的定义,可以通过扩展和改变配置来自定义。最后编译形成一个so库文件(libbluetooth.so)
BlueDroid包含一下4个重要部分:
7.1  Bluetooth Embedded System(BTE),即蓝牙嵌入系统。它实现了BT的核心功能,通过HCI与蓝牙芯片交互实现蓝牙协议栈的通用功能和相关协议。BTE还包括一个统一的内核接口(GKI),蓝牙芯片厂商可通过GKI快速、轻松地移植蓝牙协议栈到其他 *** 作系统或手机平台。

7.2  Bluetooth Application Layer(BTA),即蓝牙应用层。它用于和Android Bluetooth Service(Android蓝牙服务)层交互,实现蓝牙设备管理、状态管理以及一些应用规范。
7.3 Bluetooth Interface Layer(BTIF),即蓝牙接口层。它是Android Bluetooth Service层和BTA层的Profile接口层,相当于桥接的作用。此外它还提供协议栈和内核(Kernel)的之间的相互桥接。
7.4 HCI层,位于蓝牙系统层的L2CAP和LMP层之间的一些封装,为上层协议提供了进入LM的统一接口和进入基带的统一方式,同时也是蓝牙芯片向协议栈报告事件的通道。HCI层其实不包含在协议栈里,提供so库供协议栈加载和使用。

8. Bluetooth Kernel
参考代码路径: http://androidxref.com/kernel_3.18/     3.18之后,谷歌暂无更新
安卓最新已经更新到kernel_4.19 ,假如协议(如HID)可在手机设备上不用适配,可在Kernel中进行配置( CONFIG_HID_SUPPORT, CONFIG_HIDRAW)等信息。流程为协议栈下发的数据,通过Kernel,音频数据下发到BT Chipset(蓝牙芯片),keycode按键数据下发到Input Drivers.
kernel层路径:/kernel/drivers/bluetooth、kernel/net/Bluetooth
linux系统上Bluetooth的核心代码;具体协议实现,包括hci,hid,rfcomm,sco,SDP等协议,对各种接口的Bluetooth device的驱动,例如:USB接口,串口等。

二、源码架构分析——上下层数据收发结构

 三、Bluedroid的代码架构分析

对system/bt的主要文件及其相应功能介绍:
1. system/bt /main
1.1 bte_main.c
该功能设计BTE核心栈的初始化和卸载。主要函数功能如下:
 post_to_hci_message_loop:将 HCI 事件发布到 hci 消息队列
 bte_main_boot_entry:调用 GKI_init,bte_main_in_init和bte_load_conf
 bte_main_shutdown:调用 GKI_shutdown
 bte_main_enable:创建所有的BTE task,调用BTE_Init,创建btu_task,调用bte_hci_enable,btsnoop_open。
 bte_main_disable:销毁所有的BTE task。
 bte_main_postload_cfg:stack加载配置。
 bte_main_enable_lpm:enable/disable低功耗模式选项。
 bte_main_lpm_allow_bt_device_sleep:允许BT Controller快速进入sleep模式。
 bte_main_lpm_wake_bt_device:将BT Controller从sleep模式唤醒。
 bte_main_hci_send:上层stack用来发送HCI消息。
 bte_main_post_reset_init:调用BTM_ContinueReset,BTE在HCI_Reset后自动调用。
 hc_callbacks:libbt-hci的回调函数表。

1.2 bte_init.c
 BTE_InitStack:初始化BTE控制块,包含GAP,A2DP,AVRCP,PAN,HID,RFCOMM等,核心stack必须在创建BTU task(任务)前调用。

2. system/bt/bta
 bta 用于和 Bluetooth process 层交互,实现蓝牙设备管理、状态管理以及一些 Profile 的 Bluedroid 实现。组件如下:
 AG :实现 BTA 音频网关(audio gateway)
 AR :负责 Audio/Video 注册
 AV :实现 BTA advanced audio/video
 DM :实现 BTA 设备管理
 GATT :实现通用属性配置文件(Generic Attribute Profile),此模块是 Bluetooth 4.0 新增加的核心协议。
 HL :实现 HDP (Health Device Profile)协议,此协议主要用于与健康设备的蓝牙连接,比如心率监护仪、血压测量仪、  体温计等。
 PAN :实现 PAN (蓝牙个人局域网)协议,使得设备可以连接以下设备:个人局域网用户(PANU)设备、组式临时网络(GN)设备或网络访问点(NAP)设备。
 HH :实现 HID (Human Interface Device)协议,典型的应用包括蓝牙遥控器、蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等。
 PBAP :实现 PBAP(Phone Book Access Profile)协议,用于从电话薄交换服务器上获取电话薄内容。
 SYS :主要实现 BTA 系统管理。 

3. system/bt/btif
Bluetooth Interface: 提供所有 Bluetooth Process 需要的 API。
src/bluetooth.cc :      HAL 层定义数组和函数体的实现。
src/btif_av.cc :            Bluedroid 上 AV 的实现.
src/btif_core.cc :       该功能包含 HAL 层和 BTE 核心协议栈的核心接口函数。

src/btif_dm.cc :         该功能实现设备管理(Device Manage)相关的功能。

src/btif_gatt.cc :        实现 gatt 相关的接口。

src/btif_hf.cc :           该功能实现 handsfree 协议的接口。

src/btif_hh.cc :          该功能实现 HID Host 的蓝牙接口。

src/btif_hl.cc :           该功能实现健康设备(Health Device)的蓝口。

src/btif_media_task.cc :  btif中的多媒体模块处理,AV(Audio Video)、HS(Headset)、HF(Handsfree)中                       的 audio 和 video 任务的处理。

src/btif_pan.cc :        该功能实现 PAN 的蓝牙接口。

src/btif_rc.cc:             AVRCP 的实现,完成蓝牙耳机对音乐播放的控制。

src/btif_sock.cc:        Socket 相关接口。通过 btsock_listen 和 btsock_connect 来处理 SCO、L2CAP 和 RFCOMM 的监   听与连接的建立。

4. system/bt/hci
  HCI library 的实现,主要内容包括 HCI 接口的打开和收/发控制、Vendor 的 so 的打开和回调函数的注册、LPM(Low Power Mode) 的实现、btsnoop 的抓取等。
不同的 Android 版本 hci 实现可能不同,可以在system/bt/hci/src/ 下查看相关文件。

src/bt_hci_bdroid.cc :该功能主要处理 Bluedroid 中 Host/Controller 接口(HCI)的实现。
src/vendor.cc  :该功能定义了 vendor 的调用函数,加载 libbt-vendor.so 库(由 vendor 提供的 libbt 文件夹里 面的代码生成),初始化 vendor_interface,注册 vendor 需要的回调函数。
src/hci_h4.cc  :   该功能包含 HCI 传送/接收处理。
src/hci_mct.cc  : 该功能处理多链路的 HCI 发送和接收。
src/lpm.cc  : 低功耗模式(Low Power Mode,LPM)用于完成低功耗模式相关的处理。
src/packet_fragmenter.cc   实现只对 ACL 数据包进行拆包,确保更新使用正确的 ACL 数据包大小,释放旧的数据包缓冲区。

四、STACK

system/bt/stack
        stack 主要用于完成各协议在 Bluedroid 中的实现,协议包含 a2dp、avctp(音视频控制传输协议)、avdtp(音视频分发传输协议)、avrcp(远程控制)、bnep(蓝牙网络封装协议)、gap(通用访问协议)、gatt(通用属性协议)、hid(人机交互)、l2cap(逻辑链路控制与适配协议)、pan(蓝牙个人局域网)、rfcomm(基于L2CAP协议的串口仿真)、sdp(发现服务)、macp(Multi-Channel Adaptation Protocol,多通道适配协议)、smp(用于生成对等协议的加密密钥和身份密钥),还包含几个其他模块。
 1. system/bt/stack/btm    btm 主要涉及 Bluetooth Manger。
 btm_main.cc :包含 btm 控制块的定义。
    通过调用btm_inq_db_init()初始化inquiry数据库和结构;
    btm_acl_init()初始化acl数据库和结构;
    btm_sec_init(BTM_SEC_MODE_SP)初始化security manager数据库和结构;
    btm_sco_init()初始化SCO数据库和结构;
    btm_dev_init()初始化device manager结构和hci reset。
 btm_ble.cc :主要用于Low Energy的设备处理。
2. system/bt/stack/btu    btu功能主要用于核心协议层之间的事件处理与转换。
 btu_init.cc:为每个核心组件初始化控制块内存。
    btu_init_core():通过调用btm_init()、 2c_init()、 sdp_init()、gatt_init()、
    SMP_Init()、 btm_ble_init()初始化各个协议控制块。
btu_hcif.cc  :该文件包含与 HCI 传输接口的函数。 在接收端,它将事件路由到适当的处理程序,在传输端,它管理    命令传输。
    btu_hcif_send_cmd:发送命令给host/controller;
    btu_hcif_store_cmd:保存发出去的消息,用于超时机制;
    btu_hcif_process_event:处理来自底层的事件上报,会取出event code,不同的event code调用不同的函数        来处理。
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/721001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存