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

Whitelist enabled in rnf51822 , but after restart the firmware unable to connect phone that are added in whitelist

I have created a whitelist in nrf51822 device its working fine. But i stored whitelist details (pp_irk and pp_addr) to an external flash memory( bacause i not using peer manager). once i bond and connect any phone irk details will store to whitelist  and memory. so after that i can only able to connect that phone only    (because i have set initially  whitelist.addr_count=1, whitelist.irk_count=1) ,  upto this everything is working fine.

But after firmware restart i cant able to connect that previously bonded phone. if i delete the bond information from my phone then its ok i can able to connect. i don't know why its happening ??

i found one thing that is , all the phone don't have this issue

after calling ble_advertising_whitelist_reply(&whitelist);    i have read whitelist.addr_count , whitelist.irk_count. 

if whitelist.addr_count=1 and  whitelist.irk_count=0 at this condition i dont have the above issue , only when whitelist.irk_count=1

pls anybody help me to solve this issue , i also attach my code

static void on_adv_evt(ble_adv_evt_t ble_adv_evt) {

    SEGGER_RTT_printf(0,"on_adv_evt\r\n");
    uint32_t err_code;

    switch (ble_adv_evt)
    {
        case BLE_ADV_EVT_IDLE:
            //Restart advertisement
            SEGGER_RTT_printf(0,"BLE_ADV_EVT_IDLE\r\n");
            uint32_t err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_ADV_EVT_FAST:
            SEGGER_RTT_printf(0,"BLE_ADV_EVT_FAST\r\n");
            break;

        case BLE_ADV_EVT_WHITELIST_REQUEST:
            SEGGER_RTT_printf(0,"BLE_ADV_EVT_WHITELIST_REQUEST\r\n");

            ble_gap_whitelist_t  whitelist;
            ble_gap_irk_t*          p_whitelist_irk[2];
            ble_gap_addr_t*      p_whitelist_addr[1];
            static ble_gap_irk_t whitelist_sensor_2;
            static ble_gap_addr_t       whitelist_sensor_1;
            static ble_gap_irk_t       whitelist_motog = {{0x87,0x8B,0x1B,0xFD,0xEC,0xED,0x14,0x2C,0xFE,0xC0,0x8B,0x7F,0x01,0x4A,0xEF,0x79}};
            static ble_gap_irk_t       whitelist_lenovo = {{0x2B,0x01,0xC2,0x99,0x61,0xCF,0xBF,0x4B,0xDD,0x6E,0xC0,0x80,0x85,0x2B,0x01,0x90}};

            if(whitelist_irk_count >= 1 && whitelist_addr_count==0){

                SEGGER_RTT_printf(0,"11111\r\n");
                for(char i=0;i<16;i++){
                    whitelist_sensor_2.irk[i]=whitelist_buf[i];
                }
                p_whitelist_irk[0]      = &whitelist_sensor_2;
                p_whitelist_irk[1]      = &whitelist_motog;
                whitelist.addr_count    = 0;
                whitelist.pp_addrs      = NULL;
                whitelist.pp_irks       = p_whitelist_irk;
                whitelist.irk_count     = 2;

                SEGGER_RTT_printf(0,"1addr_count=%d , irk_count=%d\r\n",whitelist.addr_count,whitelist.irk_count);
                for (int i=0;i<16;i++){
                    SEGGER_RTT_printf(0,"pp_irks[%d]=%02x\r\n",i,p_whitelist_irk[0]->irk[i]);
                }
                for (int i=0;i<16;i++){
                    SEGGER_RTT_printf(0,"pp_irks[%d]=%02x\r\n",i,p_whitelist_irk[1]->irk[i]);
                }
                err_code = ble_advertising_whitelist_reply(&whitelist);
                APP_ERROR_CHECK(err_code);

            }
            else if(whitelist_addr_count==1){
                SEGGER_RTT_printf(0,"222222\r\n");

                whitelist_sensor_1.addr_type=BLE_GAP_ADDR_TYPE_RANDOM_STATIC;
                for(char i=0;i<6;i++){
                    whitelist_sensor_1.addr[i]=whitelist_buf[i];
                }
                p_whitelist_addr[0]     = &whitelist_sensor_1;
                p_whitelist_irk[0]      = &whitelist_motog;
                whitelist.addr_count    = 1;
                whitelist.pp_addrs      = p_whitelist_addr;
                whitelist.pp_irks       = p_whitelist_irk;
                whitelist.irk_count     = 1;

                SEGGER_RTT_printf(0,"2addr_count=%d , irk_count=%d\r\n",whitelist.addr_count,whitelist.irk_count);
                for (int i=0;i<6;i++){
                    SEGGER_RTT_printf(0,"pp_addrs[%d]=%02x\r\n",i,p_whitelist_addr[0]->addr[i]);
                }
                err_code = ble_advertising_whitelist_reply(&whitelist);
                APP_ERROR_CHECK(err_code);

            }
            else{
                SEGGER_RTT_printf(0,"333333\r\n");

                uint8_t buffr[2];
                whitelist.addr_count = 1;
                whitelist.irk_count  = 2;
                whitelist.pp_addrs   = p_whitelist_addr;
                whitelist.pp_irks    = p_whitelist_irk;

                err_code = dm_whitelist_create(&m_app_handle, &whitelist);

                whitelist_irk_count=whitelist.irk_count;
                whitelist_addr_count=whitelist.addr_count;

                if(whitelist.irk_count >= 1){
                    SEGGER_RTT_printf(0,"writing irk count \r\n");

                    sectorErase(0x7FE000);
                    /* handling session number storing*/
                    buffr[0] = (uint8_t)((session_num & 0x00FF) >> 0);
                    buffr[1] = (uint8_t)((session_num & 0xFF00) >> 8);
                    writeByteBuffer(buffr , 2, 0x7FE000);

                    writeByteBuffer(p_whitelist_irk[0]->irk , 16, 0x7FE102);
                    for(char i=0;i<16;i++){
                        whitelist_buf[i]=p_whitelist_irk[0]->irk[i];
                    }

                    /* store irk and addr count */
                    buffr[0]=whitelist.irk_count;
                    buffr[1]=whitelist.addr_count;
                    SEGGER_RTT_printf(0,"[W]addr_count=%d , irk_count=%d\r\n",whitelist.addr_count,whitelist.irk_count);
                    writeByteBuffer(buffr , 2, 0x7FE100);

                }else if(whitelist.addr_count==1){
                    SEGGER_RTT_printf(0,"writing addr count \r\n");

                    sectorErase(0x7FE000);
                    /* handling session number storing*/
                    buffr[0] = (uint8_t)((session_num & 0x00FF) >> 0);
                    buffr[1] = (uint8_t)((session_num & 0xFF00) >> 8);
                    writeByteBuffer(buffr , 2, 0x7FE000);

                    writeByteBuffer(p_whitelist_addr[0]->addr , 6, 0x7FE102);
                    for(char i=0;i<6;i++){
                        whitelist_buf[i]=p_whitelist_addr[0]->addr[i];
                    }

                    /* store irk and addr count */
                    buffr[0]=whitelist.irk_count;
                    buffr[1]=whitelist.addr_count;
                    SEGGER_RTT_printf(0,"[W]addr_count=%d , irk_count=%d\r\n",whitelist.addr_count,whitelist.irk_count);
                    writeByteBuffer(buffr , 2, 0x7FE100);
                }


                err_code = ble_advertising_whitelist_reply(&whitelist);
                APP_ERROR_CHECK(err_code);
            }

            break;


        default:
            break;
    }

}

uint32_t advertising_init(void) {
    uint32_t err_code;
    ble_advdata_t advdata;

    // Build advertising data struct to pass into @ref ble_advertising_init.
    memset(&advdata, 0, sizeof(advdata));

    advdata.name_type = BLE_ADVDATA_FULL_NAME;
    advdata.include_appearance = true;
    advdata.flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
    advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids)
            / sizeof(m_adv_uuids[0]);
    advdata.uuids_complete.p_uuids = m_adv_uuids;

    ble_adv_modes_config_t options = { 0 };
    options.ble_adv_whitelist_enabled = BLE_ADV_WHITELIST_ENABLED;
    options.ble_adv_fast_enabled = BLE_ADV_FAST_ENABLED;
    options.ble_adv_fast_interval = APP_ADV_INTERVAL;
    options.ble_adv_fast_timeout = APP_ADV_TIMEOUT_IN_SECONDS;

    err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);
    return err_code;
}

Parents Reply Children
Related