Hi I am using SDK11 with S130, NRF51822 that using ANCS and facing bonding problems after reach the max bonds. Reference to nRF51-ble-peripheral-bond-handling example, I use the ble_app_ancs_c project example and add app_bond.c and app_bond.h to the project.
in main.c add:
#include "app_bond.h"
#include "nrf_nvic.h"
static app_bond_table_t m_app_bond_table;
In device_manager_int(), add the followings:
{
...
app_bond_init(&m_app_bond_table);
for(uint8_t i = 0; i < DEVICE_MANAGER_MAX_BONDS; i++)
{
printf("[APP][ID: %d], Application context : %08X\r\n",m_app_bond_table.device_id[i],(unsigned int) m_app_bond_table.app_bond_cnt[i]);
}
}
in device_manager_evt_handler add the followings:
{
static bool device_delete_all_started;
// Recovery in the event of DM_DEVICE_CONTEXT_FULL
if(event_result == DM_DEVICE_CONTEXT_FULL)
{
/* Clear all devices from the bond table*/
err_code = dm_device_delete_all(&m_app_handle);
APP_ERROR_CHECK(err_code);
device_delete_all_started = true;
}
else
{
APP_ERROR_CHECK(event_result);
}
if (p_evt->event_id == DM_EVT_DEVICE_CONTEXT_STORED)
{
table_index_t table_index;
//Find first and last bond created from m_bond_index_table
app_bond_find(&m_app_bond_table,&table_index);
//Increment counter if a new bond was created
if(!(table_index.mr_cnt_val >= m_app_bond_table.app_bond_cnt[p_handle->device_id]))
{
table_index.mr_cnt_val++;
m_app_bond_table.app_bond_cnt[p_handle->device_id] = table_index.mr_cnt_val;
}
//Delete first created bond if bond table is full
if(((table_index.mr_cnt_val-table_index.lr_cnt_val)== DEVICE_MANAGER_MAX_BONDS-1)
&& (table_index.lr_cnt_val != NO_APP_CONTEXT))
{
uint32_t err_code;
dm_handle_t device;
device.appl_id = 0;
m_app_bond_table.app_bond_cnt[table_index.lr_index]=NO_APP_CONTEXT;
device.device_id = m_app_bond_table.device_id[table_index.lr_index];
err_code = dm_device_delete(&device);
APP_ERROR_CHECK(err_code);
}
//Update the app context for new device
app_bond_update_context(&m_app_bond_table,p_handle);
}
else if (p_evt->event_id ==DM_EVT_DEVICE_CONTEXT_DELETED)
{
/* Wait for all devices to be cleared before perfoming a sys reset */
if(device_delete_all_started && (p_handle->device_id == DEVICE_MANAGER_MAX_BONDS -1))
{
err_code = sd_nvic_SystemReset();
APP_ERROR_CHECK(err_code);
}
}
}
Disable whitelist in advertising_init(): options.ble_adv_whitelist_enabled = BLE_ADV_WHITELIST_DISABLED ;
In device_manager_peripheral.c
#define DEVICE_MANAGER_MAX_BONDS 4
#define DEVICE_MANAGER_APP_CONTEXT_SIZE 4
Then, I compile and run the program. I bond and remove the bonding with a iPhone over 4 times. ANCS works perfectly. Then I bond this to another iPhone, There is no ANCS response anymore. Open and close the bluetooth setting in iPhone is also same. it stop at notification enable but no ancs:
DB]: Discovery of service with UUID 0xf431 completed with success for Connectionhandle 0
[ANCS]: Database Discovery handler called with event 0x0
[ANCS]: Control Point Characteristic found.
[ANCS]: Notification point Characteristic found.
[ANCS]: Data Source Characteristic found.
[ANCS]: Data Source Characteristic found.
[ANCS]: Control Point Characteristic found.
Apple Notification Service discovered on the server.
[ANCS]: Enable Notification Source notifications. writing to handle: 31
[ANCS]: Enable Data Source notifications. Writing to handle: 34
Notifications Enabled.
this project is attached. ble_app_ancs_c_try3.zip
It seems the bonding have some problem when it is over the maximum value. I repeat the above procedure in sdk10, it works perfectly. Is there anything I have to add in sdk11 in order to work perfectly?
Thank you.