Android_Bluetooth

339 阅读7分钟

基于Android P版本分析

蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。

BT 汽车领域

在汽车领域,蓝牙基本上涉足几个方面:

  • 蓝牙免提通讯;
  • 车载蓝牙娱乐系统
  • 蓝牙车辆远程状况诊断
  • 汽车蓝牙防盗技术

架构

架构图

BT架构图.png

其实可以大致的分为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.png

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

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

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

BT 类图

Bluetooth类图.png

  • 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 映射关系

ProfileServiceProtocolDecs
BluetoothHeadsetHeadsetService耳机(远程控制端设备)提供手机与耳机之间通话所需的基本功能,实现了最基本的通话操作:接听、挂断、调节音量、音源输出切换
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

ProfileService基类.png

BluetoothProfile

BluetoothProfile基类.png

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

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

SettingsLib

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

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

SettingsLib常见的类

ClassDecs
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、监听蓝牙状态;