nrf51822开发指导之静态密钥配对--在SDK9.0的ble_app_uart例程修改

1.定义配对过程使用到的参数

#define SEC_PARAM_BOND                   0                                        
#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                                         


static ble_gap_sec_params_t sec_param;


2.静态密钥初始化,初始化协议栈之后可以调用该函数

static void static_passkey_pair_init(void)
{
    uint32_t err_code;
    sec_param.bond         = SEC_PARAM_BOND;
    sec_param.mitm         = SEC_PARAM_MITM;
    sec_param.io_caps      = SEC_PARAM_IO_CAPABILITIES;
    sec_param.oob          = SEC_PARAM_OOB;
    sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE;
    sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE;
    
    static uint8_t passkey[]="123456";
    static ble_opt_t m_ble_opt;
    m_ble_opt.gap_opt.passkey.p_passkey = &passkey[0];   
    
    err_code = sd_ble_opt_set(BLE_GAP_OPT_PASSKEY,&m_ble_opt);
    APP_ERROR_CHECK(err_code);
}

3.配对过程处理

static void on_ble_evt(ble_evt_t * p_ble_evt)
{
    uint32_t                         err_code;
    
    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
            err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
            APP_ERROR_CHECK(err_code);
            m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;


         
            err_code =  sd_ble_gap_authenticate(m_conn_handle,&sec_param);  //连接上之后,提示主机启动配对
            APP_ERROR_CHECK(err_code);

            break;
            
        case BLE_GAP_EVT_DISCONNECTED:
            err_code = bsp_indication_set(BSP_INDICATE_IDLE);
            APP_ERROR_CHECK(err_code);
            m_conn_handle = BLE_CONN_HANDLE_INVALID;
            break;


        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
            // Pairing not supported
            
//            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
//            APP_ERROR_CHECK(err_code);
            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &sec_param, NULL);   //收到主机配对请求,把自己的配对安全参数回应给主机
            APP_ERROR_CHECK(err_code);

            break;
   
        case BLE_GAP_EVT_AUTH_STATUS:
            if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status != BLE_GAP_SEC_STATUS_SUCCESS)   //如果配对不成功处理,这里直接断开连接
            {
                err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
               APP_ERROR_CHECK(err_code);
            }

            break;
        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
            // No system attributes have been stored.
            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
            APP_ERROR_CHECK(err_code);
            break;


        default:
            // No implementation needed.
            break;
    }
}


你可能感兴趣的:(nrf51822开发指导之静态密钥配对--在SDK9.0的ble_app_uart例程修改)