一、前言
上一篇文章中讲解了,如何打印配对第二阶段加密完成的log信息,本篇将结合代码讲解如何打印配对第三阶段和第二阶段的LOG信息,这里所说的第三阶段是指密钥分发完成阶段,第二阶段是指主机回复从机开始加密指令之后,详细的介绍请看文章中的描述。
二、阅读说明
1、泰凌微芯片学习者,前期使用过该芯片。
2、能够知道怎么进行创建工程,下载代码。
3、有一块开发板,板上的芯片可以是8251,8253或者8258。
三、正文
1、使用的SDK使用的sdk和demo为该篇文章描述的“手把手教你:打印配对第二阶段过程中的LOG信息”;
2、增加配对加密过程完成事件标志
blc_gap_setEventMask( GAP_EVT_MASK_SMP_PAIRING_BEGIN |GAP_EVT_MASK_SMP_PAIRING_SUCCESS |GAP_EVT_MASK_SMP_PAIRING_FAIL |GAP_EVT_MASK_SMP_CONN_ENCRYPTION_DONE |GAP_EVT_MASK_SMP_SECURITY_PROCESS_DONE |GAP_EVT_MASK_ATT_EXCHANGE_MTU);
如上图所示在app.c中的user_init_normal函数中增加GAP_EVT_MASK_SMP_SECURITY_PROCESS_DONE标志。增加了该事件标志之后,如果当前是第一次进行配对,那么该事件的回调函数会在第三阶段密钥分发完成之后触发。
如果当前属于重连,则会在第二阶段GAP_EVT_MASK_SMP_CONN_ENCRYPTION_DONE的回调触发后进行触发。
关于GAP_EVT_MASK_SMP_CONN_ENCRYPTION_DONE的回调触发时机请看这篇文章《手把手教你:打印配对第二阶段过程中的LOG信息》;
3、回调函数触发时机介绍
3.1、第一次配对回调函数触发时机
如上箭头所示,第一次配对回调函数触发时机是在密钥分发完成之后触发
3.2、重连时回调函数触发时机
如上图所示,重连时回调函数触发时机是在主机回复了LL_START_ENC_RSP之后。
4、配对加密过程完成回调函数
case GAP_EVT_SMP_SECURITY_PROCESS_DONE:{gap_smp_securityProcessDoneEvt_t *pEvt = (gap_smp_securityProcessDoneEvt_t *)para;tlkapi_send_string_data(APP_SMP_LOG_EN, "[APP][SMP] encryption process done:", pEvt, sizeof(gap_smp_securityProcessDoneEvt_t));}break;
如上图所示,配对加密过程完成回调函数在app.c中的app_host_event_callback函数中,我在里面增加一个打印的函数:
tlkapi_send_string_data(APP_SMP_LOG_EN, "[APP][SMP] encryption process done:", pEvt, sizeof(gap_smp_securityProcessDoneEvt_t));
该打印的内容主要为连接句柄,和重连的标志。如果说当前是第一次配对,那么该值为0,如果为重连,则该值为1。详细解释如下:
5、配对打印信息
[APP][EVT] connect, intA & advA:: 0d bf e4 12 82 77 f1 9f 18 38 c1 a4[APP][EVT] DLE exchange: 1b 00 1b 00/****************** 第一次配对 *************************/[APP][SMP] paring begin:: 40 00 00 00[APP][SMP] conn encryption done:: 40 00 00[APP][SMP] paring success:: 40 00 01 01[APP][SMP] encryption process done:: 40 00 00 // 回调信息/****************** end *******************************/[APP][EVT] disconnect, reason 0x13 // 断开连接[APP][EVT] connect, intA & advA:: fd 7d 16 c8 43 54 f1 9f 18 38 c1 a4[APP][EVT] DLE exchange: 1b 00 1b 00/****************** 重连 ******************************/[APP][SMP] conn encryption done:: 40 00 01[APP][SMP] encryption process done:: 40 00 01 // 回调信息/****************** end *******************************/
如上图所示,在第一次配对和重连的时候都会打印encryption process done信息,唯一不同的是后面的重连参数,一个为0,一个为1。
四、结尾
本篇结合代码讲解了第一次配对和重连都会用到的回调函数,该回调函数的作用可以用来判断加密是否完成,这样一来我们就不用分第一次配对和第二次配对了,如果当前的加密是成功的,我们统统可以看这个回调就可以了,下一篇讲解配对失败的回调函数。
我写了一个合集,不依赖 Nordic、泰凌、瑞萨等厂商商用 BLE 协议栈,从无线底层链路层入手,从零手写 BLE 广播扫描逻辑,拆解蓝牙广播包、信道切换、射频调度、广播数据解析完整流程,适合想吃透 BLE 底层、自主开发蓝牙工具、规避商用协议栈授权限制的嵌入式开发者。
236