一般我们认为AG侧为headset服务器端,因为它提供音频,而我们的HF侧,例如车载蓝牙为客户端,那么从HF侧发起连接的时候,从上层自然是调用BluetoothHeadsetClient中的connect函数
接着我们跟着调用,来到BluetoothHeadsetClientBinder类中,这个类中继承了接口,调用里面的connect函数
在这里面我们看到最终调用到来hf状态机,通过状态机发送连接请求
来到hf状态机类中,因为我们刚开始,hfp协议是没有连接的,所以状态为Disconnected,在这里面有一个processMessage函数专门用来处理信息,因为我们发送的是connect消息,所以这里最终可以看到调用connectNative函数,也是从这里进入到c++的接口
这里是hfp client接口的对象,这个hfp client接口是在hfp协议初始化的时候得到的,由于之前介绍了很多协议的初始化,套路都是一样的,所以这里就不过多的介绍的,里面有很多成员函数,在这里我们调用的是connect函数
我们看到,在connect函数中,将要进行hfp连接的蓝牙设备放入队列中
来到btif_queue_connect函数中,我们看到实际的处理函数是queue_int_handle_evt,其中事件类型为BTIF_QUEUE_CONNECT_EVT
在queue_int_handle_evt函数中,我们的事件类型为BTIF_QUEUE_CONNECT_EVT,所以在里面调用queue_int_add函数,将进行连接的hfp设备加入队列,然后接着调用queue_int_connect_next进行进一步处理
在这里我们看到,调用了我们前面传递的连接回调函数,也就是connect_int函数
来到connect_int函数中,在里面调用到BTA_HfClientOpen函数进行连接
来到BTA_HfClientOpen函数,我们又看到了熟悉的消息发送事件,事件类型为BTA_HF_CLIENT_API_OPEN_EVT
hf client的事件最终都会调用到bta_hf_client_hdl_event函数来处理
在函数,根据事件类型,最终选择bta_hf_client_sm_execute函数执行,进入到hf client地状态机轮转
来到bta_hf_client_sm_execute函数,和我们之前大多数地状态机轮转一样,根据hf client当前地状态和接收到地事件,调用合适地处理函数执行
hf client状态机刚开始地状态为init
这里进入到init状态下地hf client状态表
在bta_hf_client_action数组中找到对应地处理函数
在函数地最后调用bta_hf_client_do_disc函数进行服务的搜索
在这里和我们之前的介绍的hfp协议的spec一样,进行sdp服务的搜索,搜索到hfp服务
sdp服务前先进行数据库的初始化,然后进行sdp服务搜索,同时设置了sdp服务搜索完成回调函数
当我们sdp服务搜索完成后,得到hfp服务后,调用我们之前注册的sdp服务搜索完成事件回调函数,也就是bta_hf_client_sdp_cback,在函数里面组装事件消息,然后发送消息