文章目录
- nRF52832 配对和绑定
- 1、在连接时,nRF52832向蓝牙主机发送配对请求
- 2、主机收到配对请求后,向nRF52832发送安全参数请求,nRF52832收到后回复请求
- 3、判断配对是否成功
- 4、设置密码显示
- 5、设置静态密码
- 6、设置允许重复配对
nRF52832 配对和绑定
参考博客:链接1;链接2
1、在连接时,nRF52832向蓝牙主机发送配对请求
在连接发生时,协议栈会向应用层发送BLE_GAP_EVT_CONNECTED信号,在接收到连接发生时,唤起配对请求。将以下代码添加到ble_evt_handler函数下的BLE_GAP_EVT_CONNECTED分支的末尾。
/** 唤起配对请求*/
ble_gap_sec_params_t sec_params_auth;
sd_ble_gap_authenticate(m_conn_handle,&sec_params_auth);
2、主机收到配对请求后,向nRF52832发送安全参数请求,nRF52832收到后回复请求
收到主机发送的安全参数请求后,nRF52832需要对其进行回复,相应的标志信息为BLE_GAP_EVT_SEC_REQUEST。在ble_evt_handler函数中添加以下分支。
case BLE_GAP_EVT_SEC_REQUEST: /** 返回配对请求*/
ble_gap_sec_params_t sec_params;
memset(&sec_params,0,sizeof(ble_gap_sec_params_t));
err_code = sd_ble_gap_sec_params_reply(m_conn_handle,BLE_GAP_SEC_STATUS_SUCCESS,&sec_params,NULL);
APP_ERROR_CHECK(err_code);
break;
配对相关的配置参数在main.c文件前的宏定义里:
#define SEC_PARAM_BOND 1 /**< Perform bonding. */
#define SEC_PARAM_MITM 1 /**< Man In The Middle protection not required. */
#define SEC_PARAM_LESC 0 /**< LE Secure Connections not enabled. */
#define SEC_PARAM_KEYPRESS 0 /**< Keypress notifications not enabled. */
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_DISPLAY_ONLY /**< Display Only. */
#define SEC_PARAM_OOB 0 /**< Out Of Band data not available. */
#define SEC_PARAM_MIN_KEY_SIZE 7 /**< Minimum encryption key size. */
#define SEC_PARAM_MAX_KEY_SIZE 16 /**< Maximum encryption key size. */
需要修改的内容:
SEC_PARAM_BOND 是否绑定:改为1
SEC_PARAM_MITM 中间人保护:改为1
SEC_PARAM_IO_CAPABILITIES IO能力:改为BLE_GAP_IO_CAPS_DISPLAY_ONLY,如果不改的话,虽然也会弹出配对,但是没有输入框,即所有人均可配对。
3、判断配对是否成功
配对后需要判断配对是否成功,不成功则断开连接。相应的标志信息为 BLE_GAP_EVT_AUTH_STATUS 。在ble_evt_handler函数中添加以下分支:
case BLE_GAP_EVT_AUTH_STATUS:
if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS) {
NRF_LOG_INFO("Pair success!");
} else {
NRF_LOG_INFO("Pair failed!");
sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
}
break;
4、设置密码显示
上面第2步中设置了密码显示,在配对时会触发相应的标志信息:BLE_GAP_EVT_PASSKEY_DISPLAY,在ble_evt_handler函数中添加以下分支:
case BLE_GAP_EVT_PASSKEY_DISPLAY:
NRF_LOG_INFO("PASSKEY:%s",p_ble_evt->evt.gap_evt.params.passkey_display.passkey);
break;
5、设置静态密码
以上设置为动态密码,每次配对时随机生成配对密码,可设置为静态密码,在gap_params_init函数的结尾加上以下代码:
/** 设置静态密码*/
ble_opt_t passkey_opt;
uint8_t passkey[] = "123456";
passkey_opt.gap_opt.passkey.p_passkey = passkey;
err_code = sd_ble_opt_set(BLE_GAP_OPT_PASSKEY, &passkey_opt);
APP_ERROR_CHECK(err_code);
6、设置允许重复配对
当手机单方面取消配对时,nRF52832中还保存着相应的配对信息,所以在重新连接时会发生无法配对的问题,所以需要设置可以重复配对,在pm_evt_handler函数中添加以下分支代码:
/** 手机端取消配对之后无法连接,添加重新连接的代码*/
case PM_EVT_CONN_SEC_CONFIG_REQ://重新连接
{
// Reject pairing request from an already bonded peer.
pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};
//允许再次配对
pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
}
break;
暂时就写道这儿吧,原理啥的在参考的两篇博客里都有,代码经过验证可行。欢迎指正。