Bluetooth_状态机

750 阅读4分钟

基于Android P版本分析

状态机

AdapterService 状态机

BT状态机顺序图.png

从蓝牙开启的流程上看,整体的状态机流转图如上;

STATEVALUEDESC
STATE_OFF10蓝牙模块处于关闭状态
STATE_TURNING_ON11蓝牙模块正在打开
STATE_ON12蓝牙模块处于开启状态
STATE_TURNING_OFF13蓝牙模块正在关闭
STATE_BLE_TURNING_ON14低功耗蓝牙模块正在打开
STATE_BLE_ON15低功耗蓝牙模块处于开启状态
STATE_BLE_TURNING_OFF16低功耗蓝牙模块正在关闭

主要是描述了蓝牙开关状态信息;

BT状态机.png

对应的上述状态在各个情况下的一个跳转逻辑;

AdapterStateMachine.png

在各个状态下能够响应的指令划分,基本上每一个message对应一个transitionTo指令,用于跳转到执行的状态下;

在进入到下一个状态的时候,在每一个State中都存在一个enter方法,这个方法类似于类构造函数,只要调用了transitionTo方法之后,在刚刚进入新的状态的时候首先执行enter方法,这个方法中一般会执行一些对应状态下需要初始化或者是配置操作;

A2DP 状态机

A2DP状态机顺序图.png

大致的connect过程分为3步,初始化状态为Disconnected;

STATEDESC
Disconnected蓝牙A2DP模块未连接
Connecting蓝牙A2DP模块正在连接
Disconnecting蓝牙A2DP模块正在断连
Connected蓝牙A2DP模块已连接

主要是描述了A2DP Service中状态信息;

A2DP状态机.png

主要包括4种状态,每种状态都可以响应Message和Event,这个和AdapterService模块的状态机有一点不一样的地方,AdapterService模块状态机不支持Event事件的响应;

A2DP状态机Message.png

  • 绿色:代表了该状态支持的Message
  • 橘色:代表了该状态支持的Event
  • 红色:代表了对应场景下的响应指令,即状态跳转指令

A2DP Service模块的状态机只包含了4个状态,有些Service模块对应的状态机状态是比较多的,例如HeadsetService;

其中框选中的代表该状态支持跳转到两个不同的状态;

A2dpsink 状态机

STATEDECS
Disconnected未连接状态
Pending等待状态
Connected已连接状态

A2dpsink状态机.png

描述了3个状态之间的跳转逻辑;

A2dpsink状态机Message&Event.png

描述了哪些状态可以进行状态机跳转,同时整理了3个状态对应可以响应的Message和Event;

在A2dpSink的Connected状态中,其中支持了很多AVRCP的指令,这些指令的响应都在A2dpSinkStreamHandler中进行指令处理。本质上就是对AVRCP协议的控制;

AvrcpController 状态机

AVRCP(音视频远程控制协议)子协议的作用是支持CT(主动发起端)控制TG(目标设备),例如手机连接车载蓝牙之后,车载蓝牙就可以控制手机的播放、暂停、切歌以及获取手机上播放歌曲的信息,如专辑、歌名、歌手、时长等信息;

AVRCP协议定义了蓝牙设备和audio/video控制功能通信的特点和过程;

AvrcpController状态机总览.png

AvrcpController的状态和上述的状态有一点不一样的地方,就是该状态中存在两个主状态,而Connected状态下又存在6个子状态机,这样设计的目的就是,这6个状态的基状态都是Connected,一些公共的操作可以放置到Connected状态进行处理,而对应各个子状态的操作处理可以由对应的子状态机处理,不影响基状态;

STATEPARENT_STATEDECS
Disconnected未连接状态
Connected已连接状态
SetBrowsedPlayerConnected设置浏览播放器状态
SetAddresedPlayerAndPlayItemConnected设置地址播放器和播放项
ChangeFolderPathConnected文件夹路径变化状态
GetFolderListConnected获取文件夹列表状态
GetPlayerListingConnected获取播放器清单状态
MoveToRootConnected移动到主目录状态

将所有的Message划分到这6个状态中,在指定的STATE下对应的不同的Message集合;

AvrcpController状态跳转映射图.png

描述了所有状态下所支持的所有的Message;

HearingAidStackEvent 状态机

A2DP状态机顺序图.png

HearingAidStackEvent 的状态机基本上和A2DP的状态机类似;

STATEDESC
Disconnected蓝牙HearingAid模块未连接
Connecting蓝牙HearingAid模块正在连接
Disconnecting蓝牙HearingAid模块正在断连
Connected蓝牙HearingAid模块已连接

HearingAidStateMachine状态机.png

HearingAidStateMachine状态机映射.png

Headset 状态机

hfp状态机顺序图.png

STATEDECS
Disconnected未连接状态
Connecting正在连接状态
Disconnecting正在断开连接状态
Connected已连接状态
AudioOn音频工作状态
AudioConnecting音频正在连接状态
AudioDisconnecting音频正在断开状态

Headset状态机图.png

基本上,各个模块对应的状态机都是类似的,都是支持Message和Event的指令触发;

Headset Client 状态机

hfpclient顺序图.png

STATEDECS
Disconnected未连接状态
Connecting正在连接状态
Connected已连接状态
AudioOn音频工作状态

headset client状态机.png

headset client状态机映射.png

MapClient 状态机

STATEDECS
Disconnected未连接状态
Connecting正在连接状态
Connected已连接状态
Disconnecting正在断开连接状态

MapClient的状态机和其余的状态不同的地方在于,该状态机的初始化状态位Connecting;

MapClient状态机.png