基于Android P版本分析
蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。
BT 汽车领域
在汽车领域,蓝牙基本上涉足几个方面:
- 蓝牙免提通讯;
- 车载蓝牙娱乐系统
- 蓝牙车辆远程状况诊断
- 汽车蓝牙防盗技术
架构
架构图
其实可以大致的分为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给上层;
BT Framework
BT Framework层的作用只是用于连接Bluetooth Service,为其他应用提供使用蓝牙的接口,起到承上启下的作用,没有太多的实质性操作的逻辑;
Framework中主要涉及到了两个概念:状态机和回调,基本上整个BT Framework层也是依托上述的两个概念支撑着整个流程调度的控制;
每一个ProfileService基本上都会对应一个状态机用于控制该service的调度逻辑;
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客户端连接到服务(即运行特定配置文件的内部服务)或断开服务连接时向其发送通知的接口
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层;
SettingsLib
settingsLib是封装了BT提供的一些API的接口,基本上就是操作BluetootAdapter,更加方便Settings模块的调用和管理;
settingslib只有在用于系统级权限的应用中才可以使用,普通三方应用无法使用;
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;
总结
- SettingsLib主要供settings使用,封装一些操作;
- 主要设计4个部分:代理Adapter、管理配对设备、管理Profile、监听蓝牙状态;