Android4.4蓝牙耳机HFP流程分析-3
来源:互联网 发布:大数据全套视频百度云 编辑:程序博客网 时间:2024/04/28 21:47
手机连接蓝牙耳机后,当手机的CALL STATE 发生改变时,会通过PhoneStateChanged和HFP Bluetooth Interface同步CALL STATE,然后发送相应的AT命令给蓝牙耳机。
蓝牙耳机也可以发送AT命令给AG(语音网关)。然后通过JNI回调函数返回给上层,上层通过层层判断之后,会将相关信息传递到RILJ,然后封装好后使用AT指令的方式发送到Modem端执行相应操作。
音量控制主要是Headset状态机通过消息和AudioManager/AudioService的交互
通话状态的变化主要是CALL STATE状态的同步,Headset状态机通过BluetoothPhoneServer和RIL同步状态。
例如来电时用蓝牙耳机接听电话流程:
当收到蓝牙耳机发送过来的AT命令BTA_AG_HF_CMD_A时,通过btif_hf_upstreams_evt函数调用answer_call_cmd_cb,JNI对应的回调函数answer_call_callback,返回给Headset状态机onAnswerCall发送消息EVENT_TYPE_ANSWER_CALL,处理函数为processAnswerCall,通过Bluetooth Headset PhoneServer(BluetoothPhoneServer.java)处理后会调用acceptCall最终会调用到RILJ的acceptCall,使用AT指令的方式发送到Modem端,当手机的CALL STATE 发生改变时,会通过PhoneStateChanged和HFP BluetoothInterface同步CALL STATE,然后发送相应的AT命令给蓝牙耳机,同步蓝牙耳机和手机的通话状态。
蓝牙耳机挂断流程和接听的处理流程几乎一样。
1、AT命令的发送和接收。
(1).接收到AT命令的处理过程:
当从RFCOMM接收到数据的时候,先调用bta_ag_at_parse()进行AT命令的判断,
如果是正确的AT命令就会调用bta_ag_process_at()函数,解析出来AT命令参数,
调用bta_ag_at_hsp_cback()或者bta_ag_at_hfp_cback()来进行AT命令的处理。
在bta_ag_at_hfp_cback()函数里根据cmd来进行相应的处理,
通过bta_ag_send_ok()或者bta_ag_send_error()发送应答给RFCOMM,
最后调用bte_hf_evt()根据event消息(cmd)来判断是否需要返回给上层进行相应的处理。
(2).上层发送AT命令的处理过程:
上层的广播经过消息的分发和处理会发送给HeadsetStateMachine,
在状态机里有对每个消息的具体处理,然后通过JNI调用HAL层接口的函数指针结构体bthf_interface_t。在函数指针里会调用BTA_AgResult发送AT命令到RFCOMM。
2、Headset状态机的处理:
Headset和A2DP的蓝牙耳机连接过程基本一致。都是根据mTargetDevice、
mCurrentDevice、mIncomingDevice这三个变量来改变状态机。
在Headset状态机里会处理很多来自上层的广播分发出来的消息,然后通过JNI调用HAL层结构体bthf_interface_t里的函数指针发送给协议栈。
具体函数指针定义请参考Bt_hf.h里的bthf_interface_t。
协议栈返回的消息通过HAL层结构体bthf_callbacks_t返回到JNI,然后调用Headset状态机对消息进行分发处理。
具体回调函数定义请参考Bt_hf.h里的bthf_callbacks_t。
(1).init初始化流程图
(2).连接过程
当底层调用connection_state_cb第一次返回时,返回的是BTHF_CONNECTION_STATE_CONNECTED已连接的消息,状态机此时在Pending状态,会调用
mCurrentDevice =mTargetDevice;
mTargetDevice = null;
transitionTo(mConnected);
第二次返回时,返回的是BTHF_CONNECTION_STATE_SLC_CONNECTED消息,状态机此时在mConnected状态,会调用processSlcConnected()函数
mPhoneState.listenForPhoneState(true);
mPhoneProxy.queryPhoneState();
流程图如下:
(3).SCO的建立
当底层audio_state_cb返回BTHF_AUDIO_STATE_CONNECTED的消息时,状态机此时在mConnected状态,会调用
mAudioManager.setBluetoothScoOn(true);直接设置音频策略为BT_SCO。
broadcastAudioState(device,BluetoothHeadset.STATE_AUDIO_CONNECTED,
BluetoothHeadset.STATE_AUDIO_CONNECTING);
transitionTo(mAudioOn);
流程图如下:
- Android4.4蓝牙耳机HFP流程分析-3
- Android4.4蓝牙耳机HFP流程分析-3
- Android4.4蓝牙耳机HFP流程分析-1
- Android4.4蓝牙耳机HFP流程分析-2
- 蓝牙耳机简单的流程分析
- android4.2 bluetooth蓝牙HFP/HSP/A2DP
- 蓝牙系列之android4.2:整体框架分析(a2dp socket/hfp socket)为例
- Android4.0蓝牙打开流程分析
- [学习记录]Android4.0耳机插入广播发送流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- [学习记录]Android4.0耳机插入广播发送流程分析
- Android4.0耳机插入广播发送流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- 安卓中蓝牙免提HFP的一些分析
- 蓝牙耳机Priority设置流程
- android4.4 PowerManagerService流程分析
- android4.4 PowerManagerService流程分析
- 02. Oracle 11g 服务启动与停止批处理文件
- 算法提高 打水问题
- #学志#项目进度01
- CSVファイルを読み込む
- 功能测试用例基础设计模型
- Android4.4蓝牙耳机HFP流程分析-3
- 关于mybatis sql语句的错误笔记
- hdoj2824 The Euler function(欧拉函数)
- JavaSE 学习参考:类的封装
- 初试Kotlin(一)
- GYM 100090 F.Asperger Syndrome(set)
- Importing theano: AttributeError: 'module' object has no attribute 'find_graphviz'
- 运输宝物
- Bluetooth in Android 4.2 and 4.3(一):综述