Hello, I used s130, nRF5_SDK_12.1.0_0d23e2a, SoftDevice 8_9_0. Is there any example to study the central bond?
I use the examples->ble_central->ble_app_uart_c, the following is my code:
int main(void)
{
bool erase_bonds;
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, NULL);
uart_init();
buttons_leds_init(&erase_bonds);
ble_stack_init();
peer_manager_init(erase_bonds);
if (erase_bonds == true)
{
printf("Bonds erased!\r\n");
}
db_discovery_init();
nus_c_init();
whitelist_load();
printf("BLE Central Start!\r\n\r\n");
scan_start();
while(1)
{
power_manage();
}
}
static void on_ble_evt(ble_evt_t * p_ble_evt)
{
uint32_t err_code;
const ble_gap_evt_t * p_gap_evt = &p_ble_evt->evt.gap_evt;
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_ADV_REPORT:
{
if( ScanRepeat_Counter != 0 || Connect_Start == true)
on_adv_report(p_ble_evt);
}break; // BLE_GAP_EVT_ADV_REPORT
case BLE_GAP_EVT_CONNECTED:
err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
APP_ERROR_CHECK(err_code);
// start discovery of services. The NUS Client waits for a discovery result
err_code = ble_db_discovery_start(&m_ble_db_discovery, p_ble_evt->evt.gap_evt.conn_handle);
APP_ERROR_CHECK(err_code);
break; // BLE_GAP_EVT_CONNECTED
case BLE_GAP_EVT_TIMEOUT:
if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_SCAN)
{
//NRF_LOG_DEBUG("Scan timed out.\r\n");
scan_start();
}
else if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
{
printf("Connection Request timed out.\r\n");
}
break; // BLE_GAP_EVT_TIMEOUT
case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
// Pairing not supported
err_code = sd_ble_gap_sec_params_reply(p_ble_evt->evt.gap_evt.conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
APP_ERROR_CHECK(err_code);
break; // BLE_GAP_EVT_SEC_PARAMS_REQUEST
case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
// Accepting parameters requested by peer.
err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle,
&p_gap_evt->params.conn_param_update_request.conn_params);
APP_ERROR_CHECK(err_code);
break; // BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST
case BLE_GATTC_EVT_TIMEOUT:
// Disconnect on GATT Client timeout event.
//NRF_LOG_DEBUG("GATT Client Timeout.\r\n");
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
APP_ERROR_CHECK(err_code);
break; // BLE_GATTC_EVT_TIMEOUT
case BLE_GATTS_EVT_TIMEOUT:
// Disconnect on GATT Server timeout event.
//NRF_LOG_DEBUG("GATT Server Timeout.\r\n");
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
APP_ERROR_CHECK(err_code);
break; // BLE_GATTS_EVT_TIMEOUT
#if (NRF_SD_BLE_API_VERSION == 3)
case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST:
err_code = sd_ble_gatts_exchange_mtu_reply(p_ble_evt->evt.gatts_evt.conn_handle,
NRF_BLE_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);
break; // BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST
#endif
default:
break;
}
}
static void nus_c_init(void)
{
uint32_t err_code;
ble_nus_c_init_t nus_c_init_t;
nus_c_init_t.evt_handler = ble_nus_c_evt_handler;
err_code = ble_nus_c_init(&m_ble_nus_c, &nus_c_init_t);
APP_ERROR_CHECK(err_code);
}
static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, const ble_nus_c_evt_t * p_ble_nus_evt)
{
uint32_t err_code;
switch (p_ble_nus_evt->evt_type)
{
case BLE_NUS_C_EVT_DISCOVERY_COMPLETE:
printf("BLE_NUS_C_EVT_DISCOVERY_COMPLETE\r\n");
err_code = ble_nus_c_handles_assign(p_ble_nus_c, p_ble_nus_evt->conn_handle, &p_ble_nus_evt->handles);
APP_ERROR_CHECK(err_code);
/****************************************add 20161031*****************************************************/
// Initiate bonding.
err_code = pm_conn_secure(p_ble_nus_evt->conn_handle, false);//pm_conn_secure
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
/***************************************************************************************************************/
err_code = ble_nus_c_rx_notif_enable(p_ble_nus_c);
APP_ERROR_CHECK(err_code);
printf("The device has the Nordic UART Service\r\n");
break;
case BLE_NUS_C_EVT_NUS_RX_EVT:
//printf("BLE_NUS_C_EVT_NUS_RX_EVT\r\n"); //data in
for (uint32_t i = 0; i < p_ble_nus_evt->data_len; i++)
{
while (app_uart_put( p_ble_nus_evt->p_data[i]) != NRF_SUCCESS);
}
break;
case BLE_NUS_C_EVT_DISCONNECTED:
printf("Disconnected\r\n");
scan_start();
break;
}
}
When this BLE central connect to the BLE peripheral, It can't complete the bonding, I don't know how to bond, please help me, thanks