文章目录

  • 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;

暂时就写道这儿吧,原理啥的在参考的两篇博客里都有,代码经过验证可行。欢迎指正。