Android 蓝牙架构及其源码目录分析-a2dp-hfp-avrcp-ble
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
调用关系:setting -->settinglib-->framework层->packet中的各个服务-->native层->jni->hal->btif->bta->btm_hci
Android蓝牙应用程序,使用蓝牙API的程序;
代码路径
谷歌安卓源码地址: http://www.aospxref.com/android-12.0.0_r3/xref/
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
提供了一系列蓝牙方法,如开始扫描、结束扫描逻辑处理。
BluetoothPairingRequest.java
蓝牙配对请求是任何蓝牙配对请求的接收器。它检查蓝牙设置当前是否可见,并显示PIN、密钥或确认输入对话框。否则,它将启动BluetoothPairingService,该服务在状态栏中启动一个通知,可以单击该通知打开相同的对话框。
2、Bluetoothlib api接口层
路径:frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth
改成主要是应用层(application)与framework层的中间接口层。
BluetoothEventManager.java
接收来自Bluetooth API的广播和回调,并将UI线程上的事件分派到设置中的正确类。
就是接收底层蓝牙打开关闭扫描等的事件上报,然后通知上层
CachedBluetoothDevice.java
表示远程蓝牙设备。它包含设备的属性(例如地址,名称,RSSI等)和可以在设备上执行的功能(连接,配对,断开连接等)
CachedBluetoothDeviceManager.java
管理远程蓝牙设备集。
3. Bluetooth的framework层
路径: frameworks/base/core/java/android/Bluetooth
该层代码主要利用android.Bluetooth APIS和蓝牙进程进行交互,也就是通过Binder IPC机制调用了蓝牙进程的各个服务(Service)封装的接口。如BluetoothClass,BluetoothAdapter,BluetoothDevice等,Bluetooth应用就是通过这些类实现。里面有供java层使用一些类,也有对应的aidl文件联系C/C++部分的代码。
BluetoothAdapter.java
代表本地蓝牙适配器,是所有蓝牙交互的入口。通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地址创建BluetoothDevice.
BluetoothAdapter代表设备自身的蓝牙适配器。整个系统只有一个蓝牙适配器,通过framework层提供的公共接口getDefaultAdapter方法来获取这个对象。应用如果要操作蓝牙首先就要获得BluetoothAdapter
BluetoothServerSocket.java
监听来自其它设备的通信。
BluetoothSocket.java
代表了一个蓝牙套接字的接口,它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。
BluetoothServerSocket.java
代表打开服务连接来监听可能到来的连接请求 (属于server 端) ,为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。 当远端设备发起连 接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket 类将会返回一个bluetoothsocket。
BluetoothClass.java
描述了一个设备的特性(profile)或该设备上的蓝牙大致可以提供哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备。Blueboothserversocket 设备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。
BluetoothDevice.java
表示远程蓝牙设备创建与相应设备的连接或查询有关它的信息,例如名称、地址、类和绑定状态。
4. Bluetooth 服务
路径: packages/apps/Bluetooth/src/com/android/bluetooth
该层主要在Bluetooth Process里实现各种Bluetooth Service和各种配置文件(Profile),Service通过JNI调用到硬件抽象(HAL)层,最后编译形成一个Android Application包(Bluetooth.apk).
btservice:这个目录下用来管理各个协议服务:
RemoteDevices.java
用于获取远端设备的详细信息
AdapterServiceBinder.java
实现IBluetooth接口,转发给AdapterService。
AdapterService.java = Ibluetooth.stub
通过AdapterServiceBinder暴露服务功能,创建AdapterState、BondStateMachine处理请求。
AdapterProperties.java
管理本地蓝牙设备信息,状态变化时发送广播。
AdapterState.java
管理蓝牙打开、关闭,状态管理。
BondStateMachine.java
配对远程设备,能够同时处理多个配对、解除配对请求。
ProfileService.java
协助实现各个Profile相关的服务。
5. framework层的JNI接口
路径:frameworks/base/core/jni/
主要是为Bluetooth的JAVA类提供一些底层API支持(C++实现),如headset,socket等。
6.Profile对应的 JNI接口
路径: packages/apps/Bluetooth/jni
定义了蓝牙适配层和协议层对应的JNI服务,直接调用HAL层并给HAL层提供相应的回调。
7. Bluetooth HAL
路径: hardware/libhardware/include/hardware
定义了android.Bluetooth APIs和Bluetooth Process调用的标准接口,通过调用这些接口使得硬件(Hardware)运行正常。
bluetooh.h 包含蓝牙硬件操作,设备管理和设备操作抽象接口。
在HAL层并没有实现定义的蓝牙协议与属性,默认实现在Bluedroid中,位于system/bt下,用户可以根据自己的需求增加属性。
8. BlueDroid 协议栈代码
路径: system/bt
该层代码实现了HAL层中的定义,可以通过扩展和改变配置来自定义。最后编译形成一个so库文件(libbluetooth.so)
BlueDroid包含一下4个重要部分:
8.1 Bluetooth Embedded System(BTE),即蓝牙嵌入系统。它实现了BT的核心功能,通过HCI与蓝牙芯片交互实现蓝牙协议栈的通用功能和相关协议。BTE还包括一个统一的内核接口(GKI),蓝牙芯片厂商可通过GKI快速、轻松地移植蓝牙协议栈到其他操作系统或手机平台。
8.2 Bluetooth Application Layer(BTA),即蓝牙应用层。它用于和Android Bluetooth Service(Android蓝牙服务)层交互,实现蓝牙设备管理、状态管理以及一些应用规范。
8.3 Bluetooth Interface Layer(BTIF),即蓝牙接口层。它是Android Bluetooth Service层和BTA层的Profile接口层,相当于桥接的作用。此外它还提供协议栈和内核(Kernel)的之间的相互桥接。
8.4 HCI层,位于蓝牙系统层的L2CAP和LMP层之间的一些封装,为上层协议提供了进入LM的统一接口和进入基带的统一方式,同时也是蓝牙芯片向协议栈报告事件的通道。HCI层其实不包含在协议栈里,提供so库供协议栈加载和使用。
9. 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调用不同的函数 来处理。
文章来自于网络,如果侵犯了您的权益,请联系站长删除!