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);

流程图如下:


0 0
原创粉丝点击