This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Advertising with white list without peer manager

Hi,

I am working on nRF52832 with SDK 15.3.0 with SoftDevice s112.
I am actually shifting from nRF51 to nRF52.
I have merged nrf51 custom code to nrf52, and able to advertise without bonding but not able to advertise with whitelist.

Adding advertising part of code.

i got error value to "sd_ble_gap_adv_set_configure"  API NRF_ERROR_INVALID_PARAM, i think the issue with Use of whitelist requested but whitelist has not been set,
* see @ref sd_ble_gap_whitelist_set.
So i think i have to add sd_ble_gap_whitelist_set() API.


1. Where to add this API?


2. Is this sd_ble_gap_whitelist_set() API saves peer address.

3. How sd_ble_gap_whitelist_set() will react on power-on reset, this address need to set again?

4. Is anything needed after or before sd_ble_gap_whitelist_set() API.

5. Please check the code and tell me what is the reason of NRF_ERROR_INVALID_PARAM.

I dont want to use peer manager, is there is any example for bonding/whitelist without peer manager which i can refer.
Please help me on this.

void LDNVM::GetWhitelist(UINT8 &count, ble_whitelist_t &whiteList)
{
    static ble_gap_addr_t* s_whiteListAddr[LDBONDNVM_MAX_BONDED_MASTERS];
    static ble_gap_irk_t* s_whiteListIrk[LDBONDNVM_MAX_BONDED_MASTERS];

    count = 0;
    MasterBond* p = &s_bondDB[0];

    if ((p->header != 0) && (IsValidBond((MasterBond*) p)))
    {
        count = 1;

        s_whiteListAddr[0] = &p->keys_set.keys_peer.p_id_key->id_addr_info;
        s_whiteListIrk[0] = &p->keys_set.keys_peer.p_id_key->id_info;
        whiteList.addr_count = 1;
        whiteList.irk_count = 1;
        whiteList.pp_addrs = s_whiteListAddr;
        whiteList.pp_irks = s_whiteListIrk;
    }
}


/**@brief Whitelist structure. */
typedef struct
{
    ble_gap_addr_t   ** pp_addrs;        /**< Pointer to array of device address pointers, pointing to addresses to be used in whitelist. NULL if none are given. */
    uint8_t             addr_count;      /**< Count of device addresses in array, up to @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. */
    ble_gap_irk_t    ** pp_irks;         /**< Pointer to array of Identity Resolving Key (IRK) pointers, each pointing to an IRK in the whitelist. NULL if none are given. */
    uint8_t             irk_count;       /**< Count of IRKs in array, up to @ref BLE_GAP_WHITELIST_IRK_MAX_COUNT. */
} ble_whitelist_t;

bool LDSoftDevice::GapSetAdvertisingData( UINT16 advInterval, UINT16 advTimeout,INT8 txPowerLevel, UINT32* status1, UINT32* status2, UINT32* status3)
{
    bool retVal = false;
    ble_whitelist_t whiteList;
    UINT8 whiteListCount;
    GetWhitelist(whiteListCount, whiteList);
  
    if (GapAddVendorUUID(status1))
    {
        ble_advdata_t advdata;
        ble_advdata_t srdata;

        ble_uuid_t adv_uuids[] = { { PR_SERVICE_UUID, m_uuidBaseHandle } };

        // Build and set advertising data
        memset(&advdata, 0, sizeof(advdata));

        // Build and set scan response data
        memset(&srdata, 0, sizeof(srdata));

         // advertising indication
        advdata.name_type = BLE_ADVDATA_NO_NAME;
        advdata.include_appearance = false;
        advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
        advdata.uuids_complete.p_uuids = adv_uuids;

        // Flag to bonded device
        if (whiteListCount == 1)
        {
            advdata.flags   = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED ;
        }
        else
        {
            advdata.flags   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
        }

        // scan response data
        srdata.name_type = BLE_ADVDATA_FULL_NAME;

        // Variables used for manufacturer specific data
        ble_advdata_manuf_data_t adv_manuf_data;
        uint8_array_t            adv_manuf_data_array;
        uint8_t                  adv_manuf_data_data[3]; // up to 6 bytes

        // Configuration of manufacturer specific data
        adv_manuf_data_data[PAIRING_STATUS_INDEX] = 0x00;  //Zero initialization
        bool bonded = LDNVM::GetInstance()->IsBonded();
        adv_manuf_data_data[PAIRING_STATUS_INDEX] = (bonded) ? (adv_manuf_data_data[PAIRING_STATUS_INDEX] | PAIRED) : (adv_manuf_data_data[PAIRING_STATUS_INDEX] & ~(PAIRED));
        adv_manuf_data_data[DEVICE_TYPE_INDEX]    = PPM_WE;

        adv_manuf_data_array.p_data = adv_manuf_data_data;
        adv_manuf_data_array.size = sizeof(adv_manuf_data_data);

        adv_manuf_data.company_identifier = MFG_ID;
        adv_manuf_data.data = adv_manuf_data_array;

        advdata.p_manuf_specific_data = &adv_manuf_data;

        ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);

        ble_advdata_encode(&srdata, m_adv_data.scan_rsp_data.p_data, &m_adv_data.scan_rsp_data.len);

        ble_gap_adv_params_t adv_params;

        // Set advertising parameters.
        memset(&adv_params, 0, sizeof(adv_params));

        adv_params.primary_phy     = BLE_GAP_PHY_1MBPS;
        adv_params.duration        = advTimeout * CENTISEC_TO_SEC;
        adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
        adv_params.interval        = advInterval;

        // filter to bonded device
        if (whiteListCount == 1)
        {
            adv_params.filter_policy   = BLE_GAP_ADV_FP_FILTER_CONNREQ;
            adv_params.p_peer_addr     = *whiteList.pp_addrs;
        }
        else
        {
            adv_params.filter_policy   = BLE_GAP_ADV_FP_ANY;
            adv_params.p_peer_addr     = NULL;
        }

        *status2 = sd_ble_gap_adv_set_configure(&m_AdvHandle, &m_adv_data, &adv_params);
        if (*status2 == NRF_SUCCESS)
        {
            retVal = true;
        }
        
        // Set BLE TX Power level
        *status3 = GapSetTxPowerLevel(txPowerLevel);
        if(*status3 == NRF_SUCCESS)
        {
            retVal = true;
        }
        
    }
    return retVal;
}

  • Hi,

    1. Where to add this API?

    Try to set it before advertising init.

    2. Is this sd_ble_gap_whitelist_set() API saves peer address.

    No, the function will not save the address to flash. (this is something that the peer manager support).

    3. How sd_ble_gap_whitelist_set() will react on power-on reset, this address need to set again?

    Yes, you need to set it again.

    4. Is anything needed after or before sd_ble_gap_whitelist_set() API.

    You might also want to use sd_ble_gap_device_identities_set().

    5. Please check the code and tell me what is the reason of NRF_ERROR_INVALID_PARAM.

    What is the value of advInterval, advTimeout and CENTISEC_TO_SEC ?

    I dont want to use peer manager, is there is any example for bonding/whitelist without peer manager which i can refer.

    In components/libraries/bootloader/ble_dfu/nrf_dfu_ble.c, a whitelist is configured without the use of peer manager.

    Even if you don't want to use the peer manager, you should take a look at how the peer manager configures the whitelist.

Related