android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程
Android 蓝牙配对连接源码分析文档大全 - 点击下载
当对端获取到我们的io capabilities后,根据蓝牙连接流程spec,对端会发送一个confirmation request事件,controller将上报这个event给到host
在函数里面接着调用btm_proc_sp_req_evt
首先进行一些信息确认,接下来根据传入的参数,来选择使用哪种鉴权方式来进行鉴权,传入的参数是BTM_SP_CFM_REQ_EVT,在这里就是选择使用Numeric confirmation方式来进行鉴权,然后改变配对状态为BTM_PAIR_STATE_WAIT_NUMERIC_CINFIRM
下面的就是如果是passkey Enter以及just work的处理方式,所以我们可以看到,和我们连接流程中第七步中介绍的鉴权方式相一致
由于我们设置了btm_cb.api.p_sp_callback,并且为bta_dm_sp_cback,所以这里调用bta_dm_sp_cback通知到上层,同时构建sec_event.cfm_req结构,保存本端和对端的io以及
接着将pin_evt,sec_event作为参数调用回调函数bte_dm_evt
在函数中,我们传递过来的event为BTA_DM_SP_CFM_REQ_EVT,实际的处理函数是btif_dm_upstreams_evt
在里面我们传入的事件是BTA_DM_SP_CFM_REQ_EVT,所以这里调用的是btif_dm_ssp_cfm_req_evt函数
在函数中,先进行更新,然后将绑定状态设置为BONDING,然后将pairing_cb.is_ssp=true,确认我们使用的是ssp配对
然后在下面调用btif_dm_ssp_reply发送回应命令,事件类型为BT_SSP_VARIANT_CONSENT
经过上面的鉴权,配对操作也就完成了,controller上报一个配对完成事件给到host
在里面接着调用btm_simple_pair_complete函数
在这个函数中,我们看到,组建evt_data结构,调用回调函数,也就是bta_dm_sp_cback回调函数,传入的事件为BTM_SP_COMPLT_EVT
当我们完成了鉴权配对的过程后,就得到了link key,这个也就是我们整个配对过程中所想要的,根据我们前面的蓝牙连接流程,得到了link key,controller会上报link key notification给到host
在这个函数中,调用btm_sec_link_key_notification函数
在函数里面,利用我们之前获得的p_dev_rec来保存key_type,还有安全认证标志,以及link key等等
将link key的信息保存完以后,调用回调函数也就是bta_dm_new_link_key_cback来进行处理
函数中,构造了tBTA_DM_AUTH_CMPL结构体,并对其进行填充赋值,保存link key,最后调用回调函数,也就是bte_dm_evt回调函数,事件类型为BTA_DM_AUTH_CMPL_EVT
又一次来到bte_dm_evt,处理函数还是btif_dm_upstreams_evt,event为BTA_DM_AUTH_CMPL_EVT
在btif_dm_upstreams_evt函数中,根据event调用相对应的函数进行处理
在函数中,将绑定状态改为已绑定,同时将已经绑定连接成功的设备的设备信息存储到bt_config.xml中
当我们的设备绑定连接成功后,接下来进行的自然是sdp发现服务了,查看对方设备支持哪些协议
最后在设备连接成功后,授权完成了,controller会上报一个授权完成事件
在里面接着调用btm_sec_auth_complete
btm_sec_auth_complete函数表示连接已经完成,这时候可以将配对状态改为idle,然后执行安全授权完成回调函数
认证完成回调函数为bta_dm_authentication_complete_cback,在里面主要完成错误处理
至此,蓝牙连接流程中的第七步,配对过程,也是最复杂的一个过程,终于说完了,它根据我们前面得到的io capabilities来选择鉴权方式,然后controller上报link key notification,以及authentication complete给到host,告知配对流程已完成,接下来就是加密,由于加密需要具体的数据,要结合具体的设备,这里不做介绍,连接流程第九步为LM controller发送setup complete事件给event,这个也非常简单。