连接时触发配对

连接时触发配对 


基于动态密码的例子上修改,

动态密码篇 和 静态密码篇是连接后点击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;

}








  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值