连接时触发配对
基于动态密码的例子上修改,
动态密码篇 和 静态密码篇是连接后点击notify后才触发 输入配对码。
本文章是 连接时 就触发 输入配对码。
1、手机连接上后立刻调用安全请求api: sd_ble_gap_authenticate。
2、这样手机收到后就会发送配对请求 :BLE_GAP_EVT_SEC_PARAMS_REQUEST
3、回复手机的配对请求,设置不绑定。(这样手机每次收到设备的安全请求就会发配对请求过来从而启动配对)
err_code = sd_ble_gap_sec_params_reply();
4、之配对过程会自动进行。我们只需要根据收到的BLE_GAP_EVT_AUTH_STATUS事件,判断其状态是否是成功,来决定配对是不是成功了,从而决定断不断开链接。
//步骤一
//设置配对时要交换的信息:
//这里只是演示静态密码,不需要绑定
#define SEC_PARAM_BOND 0
//因为要输入密码,就是一种MITM攻击保护,所以这里设置MITM
#define SEC_PARAM_MITM 1
//这里设置只有现实屏(其实没有,但是我们用的是事先知道的静态密码,不需要显示)
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_DISPLAY_ONLY
//不使用带外数据
#define SEC_PARAM_OOB 0
//链路加密密钥的长度
#define SEC_PARAM_MIN_KEY_SIZE 7
#define SEC_PARAM_MAX_KEY_SIZE 16
//定义全局变量, 设置配对启动后交换的信息.
ble_gap_sec_params_t m_sec_params;
//初始化 配对启动后交换的信息.该函数放在 int main(void) 里的 conn_params_init();后.
void sec_params_init(void)
{ m_sec_params.bond = SEC_PARAM_BOND; m_sec_params.mitm = SEC_PARAM_MITM; m_sec_params.io_caps = SEC_PARAM_IO_CAPABILITIES; m_sec_params.oob = SEC_PARAM_OOB; m_sec_params.min_key_size = SEC_PARAM_MIN_KEY_SIZE; m_sec_params.max_key_size = SEC_PARAM_MAX_KEY_SIZE;
}
//步骤二
static void on_ble_evt(ble_evt_t * p_ble_evt)
{
case BLE_GAP_EVT_CONNECTED:
//1、连接时触发配对码
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
egBTLinkState = LINK_CONN;
sec_params_init(); err_code = sd_ble_gap_authenticate(m_conn_handle,&m_sec_params);
APP_ERROR_CHECK(err_code);
break;
case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
//2、收到主机配对请求,把自己的配对安全参数回应给主机
sec_params_init(); err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &m_sec_params, NULL);
APP_ERROR_CHECK(err_code);
break;
case BLE_GAP_EVT_PASSKEY_DISPLAY:
//3、打印passkey到串口,用户输入该配对码
printf("show passkey: ");
for ( int i = 0; i < 6; i++)
printf("%c",p_ble_evt->evt.gap_evt.params. passkey_display.passkey[i]);
break;
//4、判断配对是否成功,如果不成功断开连接,从而阻止他人任意连接。
case BLE_GAP_EVT_AUTH_STATUS:
if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
{
printf("pair success\r\n");
}
else
{
err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
APP_ERROR_CHECK(err_code);
}
break;
}
|