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.

  • Sorry, I did not notice that you were using the advertising module and just assumed you were working directly with the Softdevice APIs like how it's done in the original beacon example. As you have noticed, the problem with the advertising module is expose any options to select non-connectable advertising.

    I made a small demo showing how you can update the beacon data a while ago which I posted here: https://devzone.nordicsemi.com/f/nordic-q-a/78948/advertise-battery-level-in-beacon-advertising-packet/326766#326766. Is that something you can use? I used a timer interrupt to update the adv. payload in that example, but you can also use Radio Notification signals for the same if you want the update to be synchronized to the adv. events.

Reply Children
No Data
Related