蓝牙设备的配对流程,通常始于首次尝试连接时。当本端搜索流程结束并成功获取到目标设备的BluetoothDevice信息后,即可启动配对流程。
配对,顾名思义,是一种技术手段,用于将两个设备进行绑定,使它们能够相互识别。在技术层面,我们通常理解为通过蓝牙技术进行的设备配对。随着蓝牙技术在消费市场的普及,蓝牙配对已成为使用蓝牙功能时不可或缺的步骤。
在安卓系统中,Application层通过framework层中BluetoothDevice提供的接口createBond()来开启配对流程。而createBondOutOfBand()则是一种较少使用的OOB技术配对接口。应用层需根据实际使用场景选择合适的接口。
在配对流程中,蓝牙服务层操作相对简单。成功下发指令后,通过JNI层的异步回调处理配对状态变化,并将这一变化对外广播。其时序图清晰地展示了这一过程。
开始配对流程前,需注意停止正在进行的搜索扫描流程(如果底层正在执行)。这是为了确保配对流程能够顺利进行,避免搜索扫描和配对流程中的Discovery操作产生冲突,导致配对失败。
当协议栈接收到开始配对的指令后,它会按照预设的配对状态机进行状态切换。例如,在Numeric Comparison模式下,状态机会依次经过IDLE、GET_REM_NAME、WAIT_PIN_REQ等状态。
这些状态切换在HCI上的交互如图所示,具体时机和细节可在图中找到。对此感兴趣的用户可以进一步研究HCI命令并代码流程。
协议栈的配对状态会在鉴权完成事件Authentication Complete上报后返回到初始值。但这并不意味着整个配对流程已经完成。因为在安卓系统中,协议栈在完成配对流程的主要工作后,还会尝试对该设备进行SDP服务发现,搜索设备支持哪些协议服务。只有当SDP服务搜索完成后,才会上报JNI层,将配对状态变为Bonded。
SDP服务发现的触发时机是在处理上报Link Key的回调bta_dm_new_link_key_cback中,通过特定的事件如BTA_DM_AUTH_CMPL_EVT来触发。随后在相应的函数中尝试对该设备进行SDP服务发现。
SDP服务发现完成后,通过回调处理函数btif_dm_search_services_evt中的特定事件BTA_DM_DISC_RES_EVT上报JNI层,将配对状态变化处理至Bonded。
至此,安卓系统中的蓝牙配对流程得以闭环完成。我以Numeric Comparison配对模型为例介绍了整个流程,其他配对模型虽然有所不同,但基本都是在这几种状态机的组合下进行切换运行。