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 映射关系
Profile | Service | Protocol | Decs |
---|---|---|---|
BluetoothHeadset | HeadsetService | 耳机(远程控制端设备) | 提供手机与耳机之间通话所需的基本功能,实现了最基本的通话操作:接听、挂断、调节音量、音源输出切换 |
BluetoothA2dp | A2dpService | 音频数据流源 | 用于定义音频流的输入端 |
BluetoothA2dpSink | A2dpSinkService | 音频数据流接收端 | 定义音频流的输出端 |
BluetoothHidHost | HidHostService | 人机接口 | 我们常见的设备有蓝牙鼠标、键盘 |
BluetoothHealth | HealthService | 健康 | |
BluetoothPan | PanService | 个人局域网 | 定义两个或以上的蓝牙设备如何形成AD-HOC网络及如何通过网络接入点使用该机制访问远程网络 |
BluetoothGattServer | GattService | 通用属性 | 定义了属性类型并规定了如何使用,包括了一个数据传输和存储的框架和一些基本操作 |
BluetoothMap | BluetoothMapService | 信息访问 | 定义了设备之间交换信息的特征和程序(服务端) |
BluetoothHeadsetClient | HeadsetClientService | 耳机(远程控制端设备) | 客户端 |
AvrcpTargetService | 被控制目标设备(音频/视频远程控制]) | 接收命令并按命令响应的设备,如播放/录音设备,电视,手机等 | |
BluetoothAvrcpController | AvrcpControllerService | 远程控制端设备(音频/视频远程控制]) | 通过发送命令帧到目标发起传输,如车载系统,蓝牙耳机,蓝牙音响 |
BluetoothSap | SapService | SIM访问 | 定义了通过蓝牙链路访问GSM、SIM卡、UICC卡或R-UIM卡所使用的的协议和程序 |
BluetoothPbapClient | PbapClientService | 电话簿访问 | 定义推送客户端角色 |
BluetoothMapClient | MapClientService | 信息访问 | 定义了设备之间交换信息的特征和程序(客户端) |
BluetoothHidDevice | HidDeviceService | 人机接口 | 我们常见的设备有蓝牙鼠标、键盘 |
BluetoothOppService | 文件传输 | 面向对象传输协议,用于传输文件 | |
BluetoothPbap | BluetoothPbapService | 电话簿访问 | 定义推送服务器角色 |
BluetoothHearingAid | HearingAidService | 助听器 |
上述提及到的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常见的类
Class | Decs |
---|---|
LocalBluetoothAdapter | 绝大部分都是对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;文章来源:https://www.toymoban.com/news/detail-847707.html
总结文章来源地址https://www.toymoban.com/news/detail-847707.html
- SettingsLib主要供settings使用,封装一些操作;
- 主要设计4个部分:代理Adapter、管理配对设备、管理Profile、监听蓝牙状态;
到了这里,关于【Android】【Bluetooth Stack】Android Bluetooth架构分析(超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!