This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Advertising init as nonconnectable but still shows as connectable?

I can not seem to figure out why when I init the advertising and then issue a start to the advertising the advertising beacon shows up as a connectable when viewing under nRFConnect app.

I have put the defines, and the two functions that I am using for advertising init and start.  I have included main as well.  All the other functions that have been omitted are the same as the ble_beacon_app example from SDK v17.1

#define APP_BLE_CONN_CFG_TAG            1                                  /**< A tag identifying the SoftDevice BLE configuration. */

#define NON_CONNECTABLE_ADV_INTERVAL    MSEC_TO_UNITS(5000, UNIT_0_625_MS)  /**< The advertising interval for non-connectable advertisement (100 ms). This value can vary between 100ms to 10.24s). */

#define APP_BEACON_INFO_LENGTH          0x18                               /**< Total length of information advertised by the Beacon. */
#define APP_ADV_DATA_LENGTH             0x16                               /**< Length of manufacturer specific data in the advertisement. */
#define APP_DEVICE_TYPE                 0x02                               /**< 0x02 refers to Beacon. */
#define APP_MEASURED_RSSI               0xC3                               /**< The Beacon's measured RSSI at 1 meter distance in dBm. */
#define APP_BATT_PCNT_LVL               80                                 /**< The percentage amount of battery left. */
#define APP_COMPANY_IDENTIFIER          0x0059                             /**< Company identifier for Nordic Semiconductor ASA. as per www.bluetooth.org. */
#define APP_PRD_ID_OFS                  0x00                               /**< Product ID Offset. */
#define APP_PCB_REV                     0x00                               /**< PCB Revision Level. */
#define APP_FW_MAJ_VERS                 0x00                               /**< Firmware Major Version. */
#define APP_FW_MIN_VERS                 0x80                               /**< Firmware Minor Version. */
#define APP_BEACON_UUID                 0x01, 0x12, 0x23, 0x34, \
                                        0x45, 0x56, 0x67, 0x78, \
                                        0x89, 0x9a, 0xab, 0xbc, \
                                        0xcd, 0xde, 0xef, 0xf0            /**< Proprietary UUID for Beacon. */

//-----------------------------------------------------------------------------
// data structure intialization
  BLE_ADVERTISING_DEF(f_advertising);        //< Advertising module instance. 

  typedef struct{

    ble_advdata_manuf_data_t  f_manuf_specific_data;
    ble_advertising_init_t    f_init; 

  }f_ble_adv_data_t;

  static f_ble_adv_data_t         f_ble_data;
  
  static ble_advdata_manuf_data_t  f_manuf_data;   // This is where the advertising beacon data will be updated.
  
//-----------------------------------------------------------------------------
static uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH] =  /**< Information advertised by the Beacon. */
{
 APP_DEVICE_TYPE,     // Manufacturer specific information. Specifies the device type in this
                      // implementation.
 APP_ADV_DATA_LENGTH, // Manufacturer specific information. Specifies the length of the
                      // manufacturer specific data in this implementation.
 APP_BEACON_UUID,     // 128 bit UUID value.
 APP_PRD_ID_OFS,      // Manufacturer specific information.  Product ID offset value.
 APP_PCB_REV,         // Manufacturer specific information.  PCB Revision Level.
 APP_FW_MAJ_VERS,     // Manufacturer specific information.  Firmware Major Version
 APP_FW_MIN_VERS,     // Manufacturer specific information.  Firmware Minor Version
 APP_MEASURED_RSSI,   // Manufacturer specific information.  The Beacon's measured TX power in this implementation.
 APP_BATT_PCNT_LVL    // Manufacturer specific information.  The Beacon's measured Battery power in percent
};

//-----------------------------------------------------------------------------
static uint8_array_t ary_beacon_info = 
{
 .size   = 0x0001,          // Number of array entries
 .p_data = m_beacon_info    // pointer to the data
};

//-----------------------------------------------------------------------------
static void advertising_init(void)
{
 uint32_t      err_code;

 NRF_LOG_INFO("advertising_init");

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

 f_manuf_data.company_identifier      = APP_COMPANY_IDENTIFIER;
 f_manuf_data.data                    = ary_beacon_info;

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

 f_ble_data.f_init.advdata.name_type             = BLE_ADVDATA_NO_NAME;
 f_ble_data.f_init.advdata.include_appearance    = false;
 f_ble_data.f_init.advdata.flags                 = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
 f_ble_data.f_init.advdata.p_manuf_specific_data = &f_manuf_data;

 f_ble_data.f_init.evt_handler                   = on_adv_evt;

 f_ble_data.f_init.config.ble_adv_fast_enabled   = true;
 f_ble_data.f_init.config.ble_adv_fast_interval  = NON_CONNECTABLE_ADV_INTERVAL;
 f_ble_data.f_init.config.ble_adv_fast_timeout   = 0;  // Never timeout

 err_code = ble_advertising_init(&f_advertising, &f_ble_data.f_init);
 APP_ERROR_CHECK(err_code);

 ble_advertising_conn_cfg_tag_set(&f_advertising, APP_BLE_CONN_CFG_TAG);
}

//-----------------------------------------------------------------------------
static void advertising_start(void)
{
 ret_code_t err_code;

 NRF_LOG_INFO("advertising_start");

 err_code = ble_advertising_start(&f_advertising, BLE_ADV_MODE_FAST);
 APP_ERROR_CHECK(err_code);
}

//-----------------------------------------------------------------------------
int main(void)
{
 // Initialize.
 log_init();
 timers_init();
 leds_init();
 power_management_init();
 ble_stack_init();
 advertising_init();

 // Start execution.
 NRF_LOG_INFO("Beacon example started.");
 advertising_start();

 // Enter main loop.
 for (;;)
   {
    idle_state_handle();
   }
}

I am running in Release mode and have tried Debug mode and get the same results.  The nRF_Log output is as below:

<info> app_timer: RTC: initialized.

<info> app: advertising_init

<info> app: Beacon example started.

<info> app: advertising_start

<info> app: Fast advertising.

On the nRF Connect app I am seeing under Raw:

0x02010404FF590002

I am seeing a five second advertisement so I know that parameter is being respected in the init sequence.

Any help or suggestions would be greatly appreciated.

Parents
  • Hello,

    I was able to reproduce the same when I did the following:

    1. Flashed some FW that did connectable advertising

    2. Started scanning in the nRF connect app and saw that the device was shown as connectable.

    3. Re-programmed the board with the beacon example

    4. Observed that the device was still displayed as connectable.

    But the connect button disappeared after I pressed the "Refresh" button indicating that it's a caching issue, either in the app or in the Android BT stack. Does the same work for you?

    Refresh button:

    Best regards,

    Vidar

  • Hello Vidar,

    I am able to do the same of what you are describing.  However, that is not my issue.  My issue is about using the ble_advertising_init function and not being able to create an advertising beacon that is non-connectable.  After looking at the structures that are available using this function, I have noticed there is no ble_gap_adv_params_t structure that is being initialized that allows for the setting of properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;

    The example of ble_beacon_app does allow for this property type to be set.  Therefore, when the example is run you get an advertising beacon with the data that is specified in p_manuf_specific_data.

    So, with that in mind, how would one go about updating a few bytes of the p_manuf_specific_data in the advertising beacon  prior to the advertising beacon being transmitted?  I have not found a way to specify an event handler to perform an update such as this in a non-connectable example.

Reply
  • Hello Vidar,

    I am able to do the same of what you are describing.  However, that is not my issue.  My issue is about using the ble_advertising_init function and not being able to create an advertising beacon that is non-connectable.  After looking at the structures that are available using this function, I have noticed there is no ble_gap_adv_params_t structure that is being initialized that allows for the setting of properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;

    The example of ble_beacon_app does allow for this property type to be set.  Therefore, when the example is run you get an advertising beacon with the data that is specified in p_manuf_specific_data.

    So, with that in mind, how would one go about updating a few bytes of the p_manuf_specific_data in the advertising beacon  prior to the advertising beacon being transmitted?  I have not found a way to specify an event handler to perform an update such as this in a non-connectable example.

Children
Related