1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论

2. 欢迎大家关注和订阅,【精讲蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待!

目录

1. Android Bluetooth发展历程简介

2. Android Bluetooth架构

2.1 Android Bluetooth架构图

2.2 BT Framework

2.2.1 BT 类图

2.2.3 Profile Service 映射关系

2.3 SettingsLib

2.3.1 SettingsLib常见的类

1. Android Bluetooth发展历程简介

Android1.5 中增加了蓝牙功能,立体声 Bluetooth 支持:A2DP [Advanced Audio Distribution Profile]、AVCRP [Audio/Video Remote Control Profile],自动配对。Android2.0 中支持Bluetooth2.1协议。Android3.0 中能让应用查询已经连接上 Bluetooth 设备的 Bluetooth Profile、音频状态等,然后通知用户。Android3.1 中系统可以通过 Bluetooth HID 方式同时接入一到多款输入设备。Android4.0 中新增支持连接 Bluetooth HDP [Health Device Profile)] 设备,通过第三方应用的支持,用户可以连接到医院、健身中心或者家庭等场合中的无线医疗设备和传感器。Android4.2 中引入了一种新的针对 Android 设备优化的 Bluetooth 协议栈 BlueDroid,从而取代 BlueZ 协议栈。Bluedroid 协议栈由 Google 和 Broadcom 公司共同开发,相对于 BlueZ 协议栈,BlueDroid 提升了兼容性和可靠性。Android4.3 中增加了对低功耗蓝牙的支持,内置支持 Bluetooth AVRCP 1.3,基于 Google 和 Broadcom 公司功能研发的针对于 Android 设备优化的新的蓝牙协议栈 BlueDroid。Android4.4 中新增两种新 Proifle 支持:HID [Human Interface Device]、MAP [Message Access Profile]Android5.0 中支持Bluetooth4.1协议。Android6.0 中扫描蓝牙需要动态获取定位才行。Android7.0 中支持Bluetooth4.2协议。Android8.0 中支持Bluetooth5.0协议,强化了蓝牙音频的表现。比如编码/传输格式可选SBC、AAC、aptX/aptX HD、LDAC等四种,音质依次提高。Android10.0 中支持Bluetooth5.1协议,在5.0的基础上,增加了侧向功能和厘米级定位服务,大幅度提高了定位精度。使室内定位更精准。Android11.0 中支持Bluetooth5.2协议,增强版ATT协议,LE功耗控制和信号同步,连接更快,更稳定,抗干扰性更好。Android12.0 中支持Bluetooth5.3协议,增强了经典蓝牙BR/EDR(基础速率和增强速率)的安全性。蓝牙5.3的延迟更低、抗干扰性更强、提升了电池续航时间。系统引入了新的运行时权限 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT权限,用于更好地管理应用于附近蓝牙设备的连接。Android13.0 中引入LE Audio支持,LE Audio 是蓝牙技术联盟(SIG Q) 在 2020 年国际消费电子展上推出的新一代蓝牙低功耗音频技术,能以蓝牙低功耗状态下传递音频有利于提升蓝牙耳机续航力和性能,同时也导入新世代蓝牙音频编码 LC3(Low Complexity Communication Codec),以及多种音频分享、广播音频模式等,并且有利于助听器产品,能够达到低延迟、高音质等功能。 蓝牙低功耗音频LE Audio 算是蓝牙技术联盟发展 20 年全新的音频技术,中间历经8年发展与两次核心规格更新,也算是有史以来最大型开发项目,能够分许开发者通过23种不同文件配置与服务规范,开发出蓝牙高音质、新拓朴结构和省电音频装置。目前最新的蓝牙协议是蓝牙5.3版本(截止到2023年9月22日)

Android 4.3 开始,开始支持BLE功能,但只支持Central(中心角色or主机)Android 5.0开始,开始支持Peripheral(外设角色or从机)

中心模式和外设模式是什么意思?

Central Mode: Android端作为中心设备,连接其他外围设备。Peripheral Mode:Android端作为外围设备,被其他中心设备连接。在Android 5.0支持外设模式之后,才算实现了两台Android手机通过BLE进行相互通信。

2. Android Bluetooth架构

2.1 Android Bluetooth架构图

其实可以大致的分为4层:Application、Framework、Service和Driver层;

Application

Android蓝牙应用程序,我们常见的有Settings、BT Phone、BT Music等一些应用,使用了BT API实现;

Framework

提供给应用使用的API,我们平时使用的BluetoothAdapter、BluetoothDevice、BluetoothSocket等,通过使用BluetootoAdapter调用BT提供的API来开启BT,然后通过回调的方式获取到对应的RemoteDevice,即BluetoothDevice,然后通过具体的Device设备来进行连接和数据的传递;

Service

这一块的逻辑主要在package/apps/Bluetooth模块中使用,其中包含很多Service,提供所有的上层服务以及与Bluedroid底层进行交互。

其中BluetootAdapter主要提供蓝牙的基本操作,比如enable, disable, discovery, pair, unpair, createRfcomm等,对应了AdapterService,其余的就都是Profile对应的各自的Service;

Bluedroid

蓝牙协议层,提供所有蓝牙的实际操作,开关蓝牙、搜索管理、链路管理以及各种profile的实现;

整个系统的架构比较明确,基本上所有实际性的操作都是包含在Bluedroid中的,而Bluedroid之上的逻辑,主要适用于控制流程的调用以及状态信息的响应;

在Bluetooth中使用了状态机来控制流程调度,在指定的状态下执行相应的操作,将指令传递给底层之后,底层通过回调的方式将Bluetooth state callback给上层;

2.2 BT Framework

BT Framework层的作用只是用于连接Bluetooth Service,为其他应用提供使用蓝牙的接口,起到承上启下的作用,没有太多的实质性操作的逻辑;

Framework中主要涉及到了两个概念:状态机和回调,基本上整个BT Framework层也是依托上述的两个概念支撑着整个流程调度的控制;

每一个ProfileService基本上都会对应一个状态机用于控制该service的调度逻辑;

2.2.1 BT 类图

BluetoothService:BluetoothManager:Framework api,提供给应用层去调用相应的接口;IBluetoothManagerCallback:IBluetoothStateChangeCallback:BT状态变化的监听;BluetoothHandler:BluetoothManagerService:主要是framework层实现蓝牙功能的地方,我们从BluetoothAdapter调用的方法都会调用到BluetoothManagerService里,而BluetoothManagerService里的大部分实现又是通过绑定Bluetooth apk,即AdapterService来实现的。这样BluetoothManagerService既起到了统一framework蓝牙实现的地方,又让Bluetooth apk可以有丰富的profile具体功能实现;BluetoothAdapter:本地蓝牙适配器,是所有蓝牙交互的入口点,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。IBluetoothCallback:BT监听回调;AdapterServiceBinder:AdapterService的代理,面向Frameworks API,即面向BluetoothAdapter的使用;AdapterService:Service的子类,负责BT整个流程调度的中间服务,负责和JNI层进行交互,提供了控制蓝牙状态的调用逻辑;BluetoothDevice:表示远程的蓝牙设备,利用他可以通过BluetoothSocket请求与某个远程设备连接连接,或查询有关该设备的信息,例如设备的名称、地址、类和绑定状态BluetoothProfile:表示蓝牙配置文件的接口。蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范。BluetoothHeadset:提供蓝牙耳机支持,以便与手机配合使用,其中包括蓝牙耳机和免提配置文件BluetoothProfile.ServiceListener:在BluetoothProfile IPC客户端连接到服务(即运行特定配置文件的内部服务)或断开服务连接时向其发送通知的接口

2.2.3 Profile Service 映射关系

ProfileServiceProtocolDecsBluetoothHeadsetHeadsetService耳机(远程控制端设备)提供手机与耳机之间通话所需的基本功能,实现了最基本的通话操作:接听、挂断、调节音量、音源输出切换BluetoothA2dpA2dpService音频数据流源用于定义音频流的输入端BluetoothA2dpSinkA2dpSinkService音频数据流接收端定义音频流的输出端BluetoothHidHostHidHostService人机接口我们常见的设备有蓝牙鼠标、键盘BluetoothHealthHealthService健康BluetoothPanPanService个人局域网定义两个或以上的蓝牙设备如何形成AD-HOC网络及如何通过网络接入点使用该机制访问远程网络BluetoothGattServerGattService通用属性定义了属性类型并规定了如何使用,包括了一个数据传输和存储的框架和一些基本操作BluetoothMapBluetoothMapService信息访问定义了设备之间交换信息的特征和程序(服务端)BluetoothHeadsetClientHeadsetClientService耳机(远程控制端设备)客户端AvrcpTargetService被控制目标设备(音频/视频远程控制])接收命令并按命令响应的设备,如播放/录音设备,电视,手机等BluetoothAvrcpControllerAvrcpControllerService远程控制端设备(音频/视频远程控制])通过发送命令帧到目标发起传输,如车载系统,蓝牙耳机,蓝牙音响BluetoothSapSapServiceSIM访问定义了通过蓝牙链路访问GSM、SIM卡、UICC卡或R-UIM卡所使用的的协议和程序BluetoothPbapClientPbapClientService电话簿访问定义推送客户端角色BluetoothMapClientMapClientService信息访问定义了设备之间交换信息的特征和程序(客户端)BluetoothHidDeviceHidDeviceService人机接口我们常见的设备有蓝牙鼠标、键盘BluetoothOppService文件传输面向对象传输协议,用于传输文件BluetoothPbapBluetoothPbapService电话簿访问定义推送服务器角色BluetoothHearingAidHearingAidService助听器

上述提及到的Profile都是在frameworks中实现了BluetoothProfile接口类,Service都是继承了ProfileService;

BluetoothA2dp:定义高质量音频如何通过蓝牙连接和流式传输,从一台设备传输到另一台设备,“A2DP”代表高级音频分发配置文件,是BluetoothProfile的实现类BluetoothHealth:表示用于控制蓝牙服务的健康设备配置文件代理。BluetoothProfile的实现类BluetoothGatt:与低功耗蓝牙通信有关的配置文件代理

ProfileService

BluetoothProfile

而ProfileService又继承了Service,所以这个Services都是通过startService的方式启动的;

调用关系为BluetoothProfile调用ProfileService中的Binder,Binder就是通过aidl实现的,Binder调用ProfileService,ProfileService调用BT的JNI层;

2.3 SettingsLib

settingsLib是封装了BT提供的一些API的接口,基本上就是操作BluetootAdapter,更加方便Settings模块的调用和管理;

settingslib只有在用于系统级权限的应用中才可以使用,普通三方应用无法使用;

2.3.1 SettingsLib常见的类

ClassDecsLocalBluetoothAdapter绝大部分都是对BluetoothAdapter间接调用CachedBluetoothDeviceManager管理已配对设备列表BluetoothEventManager接收蓝牙相关广播和蓝牙的一些回调,并根据UI操作执行到对应的事件LocalBluetoothProfileManager对外提供可用profile的访问LocalBluetoothManager统一管理CachedBluetoothDeviceManager、LocalBluetoothProfileManager、BluetoothEventManager创建和获取

 LocalBluetoothAdapter

LocalBluetoothAdapter使用的是装饰者模式,代理了BluetoothAdapter的一些方法,并扩展了极少功能;

CachedBluetoothDeviceManager 

CachedBluetoothDeviceManager管理已连接设备,里边用两个ArrayList一个Map来存储。助听器设备单独用了一个list存储;

 BluetoothEventManager

BluetoothEventManager接收蓝牙相关广播和蓝牙的一些回调,并根据UI操作执行到对应的事件。BluetoothEventManager设计思想也很简单,就是监听所有需要关心的蓝牙广播。收到状态后把传给CallBack或者其他Manager;

BluetoothEventManager的构造方法中,将所有需要监听的广播进行注册,然后一一匹配对应的Handler处理器进行Event处理;

LocalBluetoothProfileManager 

LocalBluetoothProfileManager是统一管理settings支持的profile的地方,提供profile的访问和状态变化监听;

注意,这里的Profile和package中的Profile的含义不一样,这个代表的是settings支持的Profile,而package中的Profile是定义了所有的Profile,从范围上看,package的范围要大于settings模块profile的范围;

该提供访问有效的蓝牙协议对象LocalBluetoothProfile;

 LocalBluetoothManager

LocalBluetoothManager是这个manager里最简单的了就是创建着几个manager,方便对外获取manager;

 总结

SettingsLib主要供settings使用,封装一些操作;主要设计4个部分:代理Adapter、管理配对设备、管理Profile、监听蓝牙状态;

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: