Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to receive manufacturer specific data when using the LE Coded PHY

Hello, I'm trying to get manufacturer specific data from peripheral, but I don't know how to do this when the peripheral is using extended advertisement with LE Coded PHY.

I'm using long_range_demo examples [ https://github.com/NordicPlayground/nRF52-ble-long-range-demo ] with some modifications as below

peripheral_long_range_demo_kit/main.c:

/* Add these code near the top of the source code */
/* add these lines */
#define MANUF_DATA 0x54, 0x00

static uint8_t manuf_data_block[] = {
    MANUF_DATA,
};

static uint8_array_t const manuf_data_array = {
    .size               = sizeof(manuf_data_block),
    .p_data             = manuf_data_block,
};

static ble_advdata_manuf_data_t manuf_data;
/* add these lines */

/* set non-connectable as default */
static adv_scan_type_seclection_t   m_adv_scan_type_selected = SELECTION_NON_CONNECTABLE;   /**< Global variable holding the current scan selection mode. */

/* edit static ble_gap_adv_data_t m_adv_data */
/**@brief Struct that contains pointers to the encoded advertising data. */
static ble_gap_adv_data_t m_adv_data =
{
    .adv_data =
    {
        .p_data = NULL,
        .len    = 0
    },
    .scan_rsp_data =
    {
        .p_data = m_enc_scandata,
        .len    = BLE_GAP_SCAN_BUFFER_EXTENDED_MIN

    }
};
/* edit static ble_gap_adv_data_t m_adv_data */

/* In static void advertising_data_set(void), add/modify code as below */
/* add */
// initialize manufacturer specific data
manuf_data.company_identifier = 0x0059;
manuf_data.data = manuf_data_array;
/* add */

ble_advdata_t const adv_data =
{
    .name_type             = BLE_ADVDATA_FULL_NAME,
    .flags                 = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE,
    .include_appearance    = false,
    .p_manuf_specific_data = &manuf_data,  /* add this line */
};

else if(m_adv_scan_type_selected == SELECTION_NON_CONNECTABLE)
{
    NRF_LOG_INFO("Advertising type set to EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED ");
    adv_params.properties.type = BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED;

    /* uncomment these two lines */
    ret = ble_advdata_encode(&adv_data, m_adv_data_ext.scan_rsp_data.p_data, &m_adv_data_ext.scan_rsp_data.len);
    APP_ERROR_CHECK(ret);
    /* uncomment these two lines */

    ret = sd_ble_gap_adv_set_configure(&m_adv_handle, NULL, &adv_params);
    APP_ERROR_CHECK(ret);			
}

central_long_range_demo_kit/main.c:

/* in function static void on_adv_report(ble_gap_evt_adv_report_t const * p_adv_report)
edit these lines */
}else if (p_adv_report->primary_phy == BLE_GAP_PHY_CODED )
{
  NRF_LOG_INFO("Received ADV report, RSSI %d, phy: coded",rssi_value);
  // Dump BLE data
  uint16_t len = p_adv_report->data.len;
  if(p_adv_report->peer_addr.addr[5] == 0xD8) {   // change here to show data from specific MAC address
    NRF_LOG_DEBUG("type::status=%d", p_adv_report->type.status);
    NRF_LOG_DEBUG("%d", p_adv_report->data.len);
    NRF_LOG_HEXDUMP_DEBUG(p_adv_report->data.p_data, p_adv_report->data.len);
  }
}

If I debug peripheral_long_range_demo_kit, the encoded advertising data has manufacturer specific data. However the data is not showing up in the serial console of the central board.

I suppose the auxiliary advertising packet contains the manufacturer specific data and the device name, but I could not find helpful information about how to achieve this. Is there any ways to receive the manufacturer specific data when using the LE Coded PHY?

Parents Reply
  • I could confirm the example project is working with my boards. Investigating the diff file, I found I did the most of the configurations in the source code I posted first except setting buffer sizes in sdk_config.h and setting the advertising mode to fast mode. However, I don't see any related definitions in peripheral_long_range_demo_kit/sdk_config.h, and the peripheral project does not seems to be handling the advertising mode(instead specifies the advertising interval directly). Is there any other things I'm missing to do?

Children
Related