这个函数里,调用了两个函数,btm_process_remote_name:处理获取到的远端设备名称,我们之前介绍过
重点看下btm_sec_rmt_name_request_complete
这个函数首先创建一个tBTM_SEC_DEV_REC结构体p_dev_rec,也就是安全管理设备记录表,将对端蓝牙设备加入到这个record记录中,并且保存获取到的远端设备的名字到p_dev_rec的sec_bd_name这个成员中,同时将p_dev_rec的标志位设置为BTM_SEC_NAME_KNOWN
然后最重要的就是继续去创建连接,也就是和我们连接流程的第三步也就是connection request对应起来了,在这里调用btm_sec_dd_create_conn发送连接请求给到对端蓝牙设备
函数主要为绑定连接进程创建一条专用的acl通道,我们知道,根据之前的连接流程,当对端蓝牙设备接受连接请求后,就要开始授权认证了,所以,这里最后将配对状态改为BTM_PAIR_STATE_WAIT_PIN_REQ,也就是一切顺利,就进行授权认证
当我们发送完connection request命令后,controller会上报一个连接请求完成的事件,表示连接的完成
这个函数中,调用两个函数btm_sec_connected,l2c_link_hci_conn_comp,我们一个个分析
这个函数比较复杂,我们一段段来分析,首先在设备数据库中查找是否存在这个地址的设备的记录,如果没有,则申请一个空间,将这个设备记录,这个动作之前已经做过
创建一个专用的l2cap通道,用于进行绑定连接操作,并且将这个l2cap通道进行标记
然后调用btm_acl_create函数,表示对端蓝牙接收了连接请求,也就是我们蓝牙连接流程的第四步中的接受连接请求的情况,我们深入到这个函数里面
btm_acl_created函数发送请求远端蓝牙设备进行始终同步的请求,以及发送读取远端蓝牙版本信息的请求,回看我们的蓝牙连接流程的第五步,option AFH,在这里就是获取对方蓝牙设备的一些特性
在这里继续发送命令读取对端蓝牙设备的feature,可以看到,这些都是鉴权前的准备工作,和我们说的连接流程相一致
在这里,我们之前已经完成了名字的获取,所以这里省略,然后就是进行授权了,这里也就是我们连接流程的第六步了,进行授权,根据这个蓝牙设备的记录的安全标志位为BTM_SEC_AUTHENTICATION,需要进行授权,调用btm_sec_start_authentication
btm_sec_execute_procedure这个函数表示我们连接流程的第八,九步,表示以后需要做的事情,因为我们现在还在第六步授权阶段,即将要做的是授权
前面我们说过btu_hcif_connection_cmpl_evt中有两个函数,接下来介绍第二个,l2c_link_hci_conn_comp,之前我们不是建立一个l2cap专用通道吗,这里通过对端蓝牙地址获取这个链路控制块句柄,然后设置这条链路状态为已连接
这里主要对这条专用绑定连接链路做一些设置,设置监督链路超时时间,向对端设备发送回显请求,确认链路的连通性,等等
根据我们的连接流程,前面6步我们都完成了,那么这里就进入到了我们的配对流程,之前也介绍过,配对的主要作用就是获取link key,当host发送authentication请求后,controller会向host发送event,请求获取link key
在里面继续调用btm_sec_link_key_request
这个函数判断是否有link key,在连接流程中,我们也说过,
如果第一次连接,没有link key,host会返回Hci_Link_Key_Request_Negative_Reply,需要进行配对,
如果有link key的话,表示以前已经连接过,host会返回Hci_Link_Key_Request_Positive_Reply,也就是会调用btsnd_hcic_link_key_req_reply发送,不需要进行配对操作,直接可以连接成功
这里我们假定是第一次连接,需要进行配对
这里我们就介绍了蓝牙连接流程的前六步,也就是配对前的步骤,基本上和我们的连接流程吻合,接下来就是介绍配对流程了,下期再说