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

Switching between connectable and non connectable advertising - not getting advertising to stop

Hi community,

I have recently purchased the DK and have started developing my application. What I wish for it to to is able to change between connectable and non-connectable states.

I have used the the BLE_APP_UART example and copied the code from BLE_APP_BEACON across. When commenting out the connectable vs. non-connectable initialization functions they work independantly but not when switching between them. I have read that the advertising must be stopped completely before re-initializing the advertising parameters. I have used the combination of ble_advertising_start(&m_advertising, BLE_ADV_MODE_IDLE) and sd_ble_gap_adv_stop(m_advertising.adv_handle) as reccomended here. However, after stopping the advertising the non_connectable portion does not start up again.

Im quite new with this so any help would be highly appreciated Slight smile

/**@brief Function for initializing the Advertising functionality.
 */
static void advertising_init_Connectable(void)
{
    uint32_t               err_code;
    ble_advertising_init_t init;

    memset(&init, 0, sizeof(init));

    init.advdata.name_type          = BLE_ADVDATA_FULL_NAME;
    init.advdata.include_appearance = false;
    init.advdata.flags              = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;

    init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    init.srdata.uuids_complete.p_uuids  = m_adv_uuids;

    init.config.ble_adv_fast_enabled  = true;
    init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
    init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
    init.evt_handler = on_adv_evt;

    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);

    ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

static void advertising_init_NonConnectable(void)
{
    uint32_t      err_code;
    ble_advdata_t advdata;
    uint8_t       flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;

    ble_advdata_manuf_data_t manuf_specific_data;

    manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER;

#if defined(USE_UICR_FOR_MAJ_MIN_VALUES)
    // If USE_UICR_FOR_MAJ_MIN_VALUES is defined, the major and minor values will be read from the
    // UICR instead of using the default values. The major and minor values obtained from the UICR
    // are encoded into advertising data in big endian order (MSB First).
    // To set the UICR used by this example to a desired value, write to the address 0x10001080
    // using the nrfjprog tool. The command to be used is as follows.
    // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val <your major/minor value>
    // For example, for a major value and minor value of 0xabcd and 0x0102 respectively, the
    // the following command should be used.
    // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val 0xabcd0102
    uint16_t major_value = ((*(uint32_t *)UICR_ADDRESS) & 0xFFFF0000) >> 16;
    uint16_t minor_value = ((*(uint32_t *)UICR_ADDRESS) & 0x0000FFFF);

    uint8_t index = MAJ_VAL_OFFSET_IN_BEACON_INFO;

    m_beacon_info[index++] = MSB_16(major_value);
    m_beacon_info[index++] = LSB_16(major_value);

    m_beacon_info[index++] = MSB_16(minor_value);
    m_beacon_info[index++] = LSB_16(minor_value);
#endif

    manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
    manuf_specific_data.data.size   = APP_BEACON_INFO_LENGTH;

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

    advdata.name_type             = BLE_ADVDATA_NO_NAME;
    advdata.flags                 = flags;
    advdata.p_manuf_specific_data = &manuf_specific_data;

    // Initialize advertising parameters (used when starting advertising).
    memset(&m_adv_params, 0, sizeof(m_adv_params));

    m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;
    m_adv_params.p_peer_addr     = NULL;    // Undirected advertisement.
    m_adv_params.filter_policy   = BLE_GAP_ADV_FP_ANY;
    m_adv_params.interval        = NON_CONNECTABLE_ADV_INTERVAL;
    m_adv_params.duration        = 0;       // Never time out.

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

    err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);
    APP_ERROR_CHECK(err_code);
}

/**@brief Function for starting advertising.
 */
static void advertising_start_Connectable(void)
{
    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
    APP_ERROR_CHECK(err_code);
}

static void advertising_stop_Connectable(void)
{
    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_IDLE);
    sd_ble_gap_adv_stop(m_advertising.adv_handle);
    APP_ERROR_CHECK(err_code);
}

/**@brief Function for starting advertising.
 */
static void advertising_start_NonConnectable(void)
{
    ret_code_t err_code;

    err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG);
    APP_ERROR_CHECK(err_code);

    err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
    APP_ERROR_CHECK(err_code);
}


/**@brief Application main function.
 */
int main(void)
{
    bool erase_bonds;

    // Initialize.
    uart_init();
    log_init();
    timers_init();
    buttons_leds_init(&erase_bonds);
    power_management_init();
    ble_stack_init();
    gap_params_init();
    gatt_init();
    services_init(); 
    conn_params_init();
    advertising_init_Connectable();
    advertising_start_Connectable();
    advertising_stop_Connectable();
    advertising_init_NonConnectable();
    advertising_start_NonConnectable();

    // Start execution.
    printf("\r\nUART started.\r\n");
    NRF_LOG_INFO("Debug logging for UART over RTT started.");
    // Enter main loop.
    for (;;)
    {
        idle_state_handle();
    }
}

Parents
  • Hello,

    I did something similiar a while ago where I modified the ble_app_hrs example to make it broadcast beacon packets during connections. Maybe it's not exactly what you want to do here, but I have included the project below if you want to compare changes.

    However, after stopping the advertising the non_connectable portion does not start up again.

    Have you verified through debugging that advertising_start_NonConnectable() actually gets called, or is it possible that the program may have ended up in the error handler (Error module)? 

    ble_app_hrs_beacon project

    nRF5_SDK_15.2.0_ble_app_hrs_beacon.zip

     

Reply
  • Hello,

    I did something similiar a while ago where I modified the ble_app_hrs example to make it broadcast beacon packets during connections. Maybe it's not exactly what you want to do here, but I have included the project below if you want to compare changes.

    However, after stopping the advertising the non_connectable portion does not start up again.

    Have you verified through debugging that advertising_start_NonConnectable() actually gets called, or is it possible that the program may have ended up in the error handler (Error module)? 

    ble_app_hrs_beacon project

    nRF5_SDK_15.2.0_ble_app_hrs_beacon.zip

     

Children
No Data
Related