I'm developing my project by nrf5 SDK in nrf52832.
Pairing and bonding used in my project and implemented by peer_manager.The pm_evt_handler() defined as follow:
static void pm_evt_handler(pm_evt_t const * p_evt) { ret_code_t err_code; NRF_LOG_DEBUG("PMID:%d EVT:%d",p_evt->peer_id,p_evt->evt_id); switch (p_evt->evt_id) { case PM_EVT_CONN_SEC_SUCCEEDED: { pm_conn_sec_status_t conn_sec_status; // Check if the link is authenticated (meaning at least MITM). err_code = pm_conn_sec_status_get(p_evt->conn_handle, &conn_sec_status); APP_ERROR_CHECK(err_code); if (conn_sec_status.mitm_protected) { NRF_LOG_INFO("Link secured. Role: %d. conn_handle: %d, Procedure: %d", ble_conn_state_role(p_evt->conn_handle), p_evt->conn_handle, p_evt->params.conn_sec_succeeded.procedure); uint8_t conn_num; for (uint8_t i = 0; i < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; i++) { if (conn_dev[i].dev_params.conn_handle == m_conn_handle) { conn_num = i; break; } } fds_record_desc_t desc = {0}; fds_find_token_t tok = {0}; fds_flash_record_t config = {0}; pm_peer_id_get(conn_dev[conn_num].dev_params.conn_handle,&conn_dev[conn_num].dev_info.peer_id); if (conn_dev[conn_num].dev_info.peer_id == PM_PEER_ID_INVALID) { conn_dev[conn_num].dev_info.peer_id = p_evt->peer_id; } conn_dev[conn_num].dev_info.peer_id = p_evt->peer_id; bool bonded = false; while (!fds_record_find(USR_FILE,USERDATA_KEY,&desc,&tok)) { struct flash_dev_t data; fds_record_open(&desc,&config); memcpy(&data,config.p_data,sizeof(data)); fds_record_close(&desc); if (data.peer_id == conn_dev[conn_num].dev_info.peer_id) { conn_dev[conn_num].dev_info = data; bonded = true; break; } } if (!bonded) { user_list.peer_id = conn_dev[conn_num].dev_info.peer_id; user_list.type = app_env_params.add_flag; user_list.open_rssi = 0xFF; user_list.keep_rssi = 0xFF; name_init(); conn_dev[conn_num].dev_info = user_list; ret_code_t err_code; struct fds_list_t *new_point; struct fds_list_t *end_point = &fds_list; for (uint8_t i = 0; i < fds_list.type; i++) { end_point = end_point->next; } new_point = (struct fds_list_t *)malloc(sizeof(struct fds_list_t)); if (new_point != NULL) { new_point->type = 0; new_point->mess = user_list; end_point->next = new_point; new_point->next = NULL; fds_list.type++; } } if (app_env_params.sp_dev_add) { struct conn_dev_t mess_dev; uint8_t data_array[] = {0xAA,0xCC,11,0x03,0x06,0,app_env_params.notify_id, p_evt->peer_id,0x01,0xFF,0x55}; for (size_t i = 0; i < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; i++) { if (app_env_params.notify_id == conn_dev[i].dev_info.peer_id) { mess_dev = conn_dev[i]; break; } } check_alg_xor(data_array); nus_send_data(mess_dev,data_array); app_env_params.sp_dev_add = false; } } else { // The peer did not use MITM, disconnect. NRF_LOG_INFO("Collector did not use MITM, disconnecting"); err_code = pm_peer_id_get(m_conn_handle, &m_peer_to_be_deleted); APP_ERROR_CHECK(err_code); err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); APP_ERROR_CHECK(err_code); } //conn_dev list output uint32_t periph_link_cnt = ble_conn_state_peripheral_conn_count(); if (periph_link_cnt < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT) { advertising_start(); } } break; case PM_EVT_CONN_SEC_FAILED: { NRF_LOG_INFO("Failed to secure connection. Disconnecting."); NRF_LOG_INFO("%d %04x %02x",p_evt->params.conn_sec_failed.procedure,p_evt->params.conn_sec_failed.error,p_evt->params.conn_sec_failed.error_src); if (app_env_params.sp_dev_add) { struct conn_dev_t mess_dev; uint8_t data_array[] = {0xAA,0xCC,11,0x03,0x06,0,app_env_params.notify_id, p_evt->peer_id,0x02,0xFF,0x55}; for (size_t i = 0; i < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; i++) { if (app_env_params.notify_id == conn_dev[i].dev_info.peer_id) { mess_dev = conn_dev[i]; break; } } check_alg_xor(data_array); nus_send_data(mess_dev,data_array); app_env_params.sp_dev_add = false; } err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); advertising_start(); } break; 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; case PM_EVT_STORAGE_FULL: { // Run garbage collection on the flash. err_code = fds_gc(); if (err_code == FDS_ERR_NO_SPACE_IN_QUEUES) { // Retry. } else { APP_ERROR_CHECK(err_code); } } break; case PM_EVT_PEERS_DELETE_SUCCEEDED: { //advertising_start(); } break; case PM_EVT_PEER_DATA_UPDATE_FAILED: { // Assert. APP_ERROR_CHECK(p_evt->params.peer_data_update_failed.error); } break; case PM_EVT_PEER_DELETE_FAILED: { // Assert. APP_ERROR_CHECK(p_evt->params.peer_delete_failed.error); } break; case PM_EVT_PEERS_DELETE_FAILED: { // Assert. APP_ERROR_CHECK(p_evt->params.peers_delete_failed_evt.error); } break; case PM_EVT_ERROR_UNEXPECTED: { // Assert. APP_ERROR_CHECK(p_evt->params.error_unexpected.error); } break; case PM_EVT_CONN_SEC_START: case PM_EVT_PEER_DATA_UPDATE_SUCCEEDED: case PM_EVT_PEER_DELETE_SUCCEEDED: case PM_EVT_LOCAL_DB_CACHE_APPLIED: case PM_EVT_LOCAL_DB_CACHE_APPLY_FAILED: // This can happen when the local DB has changed. case PM_EVT_SERVICE_CHANGED_IND_SENT: case PM_EVT_SERVICE_CHANGED_IND_CONFIRMED: default: break; } }
Due to the implementation of HID service, I can use my phone to connect directly to Bluetooth that advertised by my board.
After running for a while,I try to using my phone connect and bond with my board.The phone's Bluetooth keeps saying it's pairing.
The log of my board see as follow:
It tell me that PM_EVT_CONN_SEC_CONFIG_REQ and PM_EVT_CONN_SEC_PARAMS_REQ keeping be triggered.And it will keep until pairing failures are displayed on the phone.
How can I to deal it?
pm_evt_handler