Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years, 8 months ago.
Persistent Bonding Data
Hello, I'm trying to perform a bonding between nRF52-DK and my phone, while storing the bonding data on the board persistently.
While using the method "getAddressesFromBondTable" (which belongs to the SecurityManager at the BLE class) for some comparisons, I always get the error "BLE_ERROR_INVALID_STATE", no matter if the bonding table is empty or not.
I’ve attached the application code in which this error occurs (at the end of the function "bleInitComplete").
#include "events/mbed_events.h"
#include "mbed.h"
#include "ble/BLE.h"
#include "SecurityManager.h"
#include "LEDService.h"
DigitalOut g_led1(LED1, 0);
DigitalOut g_led2(LED2, 0);
DigitalOut g_led3(LED3, 0);
DigitalOut g_led4(LED4, 0);
Serial g_serial(USBTX, USBRX);
const static char DEVICE_NAME[] = "LED";
static const uint16_t g_uuid16_list[] =
{
LEDService::LED_SERVICE_UUID
};
static EventQueue g_eventQueue(/* event count */10 * /* event size */32);
LEDService *g_ledServicePtr;
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
BLE::Instance().gap().startAdvertising();
}
void blinkCallback(void)
{
g_led1 = !g_led1; /* Do blinky on LED1 to indicate system aliveness. */
}
/**
* This callback allows the LEDService to receive updates to the ledState Characteristic.
*
* @param[in] params
* Information about the characterisitc being updated.
*/
void onDataWrittenCallback(const GattWriteCallbackParams *params)
{
if ((params->handle == g_ledServicePtr->getValueHandle()) && (params->len == 1))
{
uint8_t val = *(params->data);
}
}
/**
* This function is called when the ble initialization process has failled
*/
void onBleInitError(BLE &ble, ble_error_t error)
{
/* Initialization error handling should go here */
}
/**
* Callback triggered when the ble initialization process has finished
*/
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
BLE& ble = params->ble;
ble_error_t error = params->error;
if (error != BLE_ERROR_NONE)
{
/* In case of error, forward the error handling to onBleInitError */
onBleInitError(ble, error);
return;
}
/* Ensure that it is the default instance of BLE */
if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE)
{
return;
}
/* Initialize BLE security */
uint8_t passkey[] = {'0', '1', '2', '3', '4', '5' };
bool enableBonding = true;
bool requireMITM = false;
ble_error_t status = ble.securityManager().init(enableBonding, requireMITM, SecurityManager::IO_CAPS_DISPLAY_ONLY, passkey);
if (status != BLE_ERROR_NONE)
{
while (true)
{
printf("Error! status: %u\r\n", status);
wait(1);
}
}
ble.gattServer().onDataWritten(onDataWrittenCallback);
bool initialValueForLEDCharacteristic = false;
g_ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic);
/* setup advertising */
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)g_uuid16_list, sizeof(g_uuid16_list));
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
ble.gap().startAdvertising();
/* Trying to retrieve list of bonded peers (should be empty right now) */
BLEProtocol::Address_t addresses[10];
Gap::Whitelist_t wl;
wl.size = 0;
wl.addresses = addresses;
wl.capacity = 10;
ble_error_t ret = ble.securityManager().getAddressesFromBondTable(wl); // This function always returns 6 (BLE_ERROR_INVALID_STATE)
printf("ble.securityManager().getAddressesFromBondTable(wl): %u\r\n", ret);
}
void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context)
{
BLE &ble = BLE::Instance();
g_eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
}
int main()
{
printf("BLE Demo\r\n");
g_eventQueue.call_every(3 * 1000, blinkCallback);
BLE &ble = BLE::Instance();
ble.onEventsToProcess(scheduleBleEventsProcessing);
ble.init(bleInitComplete);
g_eventQueue.dispatch_forever();
return 0;
}