Scanninf filter based on manufacturing data

I am trying to scan based on short name and manufacturing data, the short name filter is working, but the manufacturing data filter is throwing error. Can you help me with that, here is the code

static void start_scan(void)
{
int err;

struct bt_scan_init_param scan_init = {
.connect_if_match = 1,
.scan_param = NULL,
.conn_param = BT_LE_CONN_PARAM_DEFAULT
};

bt_scan_init(&scan_init);
bt_scan_cb_register(&scan_cb);


struct bt_scan_manufacturer_data manufac_data = {
.data = GROUP_ID,
.data_len = sizeof(GROUP_ID),
};

err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_MANUFACTURER_DATA, &manufac_data );
if (err) {
printk("\nScanning filters cannot be setted (err %d)\n", err); // this error, reason error type (-12)
return err;
}
struct bt_scan_short_name ble_shrt_name;
ble_shrt_name.name = "Nordic_ad";
ble_shrt_name.min_len = 9;

err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_SHORT_NAME, &ble_shrt_name );
if (err) {
printk("\nScanning filters cannot be set (err %d)\n", err);
return err;
}

err = bt_scan_filter_enable(BT_SCAN_FILTER_TYPE_SHORT_NAME, false);
if (err) {
printk("\nFilters cannot be turned on (err %d)\n", err);
return err;
}
err = bt_scan_filter_enable(BT_SCAN_FILTER_TYPE_MANUFACTURER_DATA, false);
if (err) {
printk("\nFilters cannot be turned on (err %d)\n", err);
return err;
}

uint16_t GROUP_ID = 5; in both advertisement and scanning code

  • Alright, lets get to some debugging then:

    Which version of the nRF Connect SDK do you use?

    but the manufacturing data filter is throwing error.

    Which error?

    Regards,
    Sigurd Hellesvik

  • i am using nRF52840 and nRF52840, and nRF Connect SDK 2.4.0

    the error was "printk("\nScanning filters cannot be setted (err %d)\n", err); // this error, reason error type (-12)"

    I changed the board, (from nRF52833 to nRF52840) and it started working, although It compiles and runs, but is not able to connect to any device, i dont know what is the error, i have another device and from that, i advertise with short name "Nordic" and manufacturing data

    const uint8_t manu_data[8] = {0x30, 0x32, 0x55, 0x23, 0x89, 0x12, 0x23, 0x34};



    here is the code for scanning

    static void start_scan(void)
    {
    int err;

    struct bt_scan_init_param scan_init = {
    .connect_if_match = 1,
    .scan_param = NULL,
    .conn_param = BT_LE_CONN_PARAM_DEFAULT
    };

    bt_scan_init(&scan_init);
    bt_scan_cb_register(&scan_data);

    struct bt_scan_manufacturer_data manufac_data;
    manufac_data.data = GROUP_ID;
    manufac_data.data_len = sizeof(GROUP_ID);
    struct bt_scan_short_name ble_shrt_name;
    ble_shrt_name.name = "Nordic";
    ble_shrt_name.min_len = 6;


    err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_SHORT_NAME, &ble_shrt_name );
    if (err) {
    printk("\nScanning filters cannot be set (err %d)\n", err);
    return err;
    }

    err = bt_scan_filter_enable(BT_SCAN_FILTER_TYPE_SHORT_NAME, false);
    if (err) {
    printk("\nFilters cannot be turned on (err %d)\n", err);
    return err;
    }

    err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_MANUFACTURER_DATA, &manufac_data);
    if (err) {
    printk("\nScanning filters cannot be setted (err %d)\n", err);
    return err;
    }
    err = bt_scan_filter_enable(BT_SCAN_FILTER_TYPE_MANUFACTURER_DATA, false);
    if (err) {
    printk("\nFilters cannot be turned on (err %d)\n", err);
    return err;
    }
    err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
    if (err) {
    printk("Scanning failed to start (err %d)", err);
    return;
    }

    printk("Scanning successfully started\n");
    }

    callbacks

    static void filter_match(struct bt_scan_device_info *device_infor, struct bt_scan_filter_match * filter_match, bool connectable)
    {
    printk("Works");
    }
    static void scan_error(struct bt_scan_device_info *device_infor)
    {
    printk("Works");
    }
    static void scan_connecting(struct bt_scan_device_info *device_infor, struct bt_conn *conn)
    {
    central_conn = bt_conn_ref(conn); // WHEN CONNECTED BY TO SCAN, CONN BECOMES SCAN ONE
    }

    the scanning starts but these callbacks never invokes

    th advertisement data is 

    static const struct bt_data ad[] = {
    BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
    BT_DATA(BT_DATA_NAME_SHORTENED, DEVICE_NAME, DEVICE_NAME_LEN),
    BT_DATA(BT_DATA_MANUFACTURER_DATA, manu_data, sizeof(manu_data)),
    };


    here is prj.conf file

    CONFIG_BT=y
    CONFIG_BT_CENTRAL=y
    CONFIG_LOG=y

    CONFIG_LOG=y
    CONFIG_BT_PERIPHERAL=y

    # Button and LED library
    CONFIG_DK_LIBRARY=y

    #
    CONFIG_BT_HCI=y
    CONFIG_BT_GATT_CLIENT=n
    CONFIG_BT_GATT_DM=n

    CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=3

    #important above^

    # Bluetooth LE
    # STEP 1 - Include the Bluetooth LE stack in your project

    # STEP 2 - Set the Bluetooth LE device name
    CONFIG_BT_DEVICE_NAME="MAIN"

    CONFIG_BT_LBS=y
    CONFIG_BT_LBS_POLL_BUTTON=y
    CONFIG_BT_MAX_CONN=4
    CONFIG_BT_MAX_PAIRED=4

    CONFIG_BT_SMP=y

    CONFIG_BT_SCAN=y
    CONFIG_BT_SCAN_FILTER_ENABLE=y
    CONFIG_BT_SCAN_UUID_CNT=1




    CONFIG_BT=y
    CONFIG_BT_CENTRAL=y
    CONFIG_BT_OBSERVER=y
    CONFIG_BT_SCAN=y
    CONFIG_BT_SCAN_FILTER_ENABLE=y

    #
    # Copyright (c) 2019 Nordic Semiconductor ASA
    #
    # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
    #
    CONFIG_NCS_SAMPLES_DEFAULTS=y

    CONFIG_BT=y
    CONFIG_BT_DEBUG_LOG=y
    CONFIG_BT_CENTRAL=y
    CONFIG_BT_SMP=y

    CONFIG_HEAP_MEM_POOL_SIZE=1024
    CONFIG_BT_BAS_CLIENT=y

    CONFIG_BT_SCAN=y
    CONFIG_BT_SCAN_FILTER_ENABLE=y
    CONFIG_BT_SCAN_UUID_CNT=1
    CONFIG_BT_PRIVACY=y
    CONFIG_LOG=y
    CONFIG_BT_SCAN_SHORT_NAME_CNT=1
    CONFIG_BT_SCAN_NAME_CNT=1
    CONFIG_BT_SCAN_MANUFACTURER_DATA_CNT=1

    CONFIG_BT_SETTINGS=y
    CONFIG_FLASH=y

    CONFIG_NVS=y
    CONFIG_SETTINGS=y




  • Hi,

    I created to samples to test filtering for advertisement data, based on samples from nRF Connect SDK bluetooth samples.
    Have a look at how the central sets up the filtering, and try to do the same in your code.
    central_bas_feat_manufacturer_data_filter.zip

    peripheral_lbs_manufacturer_data.zip

    Regards,
    Sigurd Hellesvik

Related