Trying to do ADV_DIRECT_IND - Connectable not scannable

Trying to do ADV_DIRECT_IND advertisement.

We are trying to do the following advertisements

// ADV_IND Scannable and Connectable
// ADV_DIRECT_IND - Connectable not scannable
// ADV_NONCONN_IND - neither scanning nor connection is allowed
// ADV_SCAN_IND - allows scanning but not connection

ADV_IND  is working

adv_param.options |= (BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_SCANNABLE);
adv_param.id = BT_ID_DEFAULT;
adv_param.peer = NULL;

err = bt_le_adv_start(&adv_param, adv_data, ARRAY_SIZE(adv_data), scan_url_data, ARRAY_SIZE(scan_url_data));

Device found MAC: FF:EE:DD:CC:BB:AA (random) SNIF: E7:09:68:43:C6:2C (RSSI: -53), type 0x00 = ADV_IND (Connect+Scan)
    Flags: 0x06 [LE General Discoverable Mode, BR/EDR Not Supported (LE Only)]
    Name: nrf54
    Manufacturer: 0x0059 (Nordic Semiconductor ASA), (data length: 2)
    Data: 00 00



ADV_NONCONN_IND is working

adv_param.options = 0;
adv_param.peer = NULL;

err = bt_le_adv_start(&adv_param, adv_data, ARRAY_SIZE(adv_data), NULL, 0);

Device found MAC: 24:E0:11:A4:89:7D (random) SNIF: E7:09:68:43:C6:2C (RSSI: -51), type 0x03 = ADV_NONCONN_IND
    Flags: 0x06 [LE General Discoverable Mode, BR/EDR Not Supported (LE Only)]
    Name: nrf54
    Manufacturer: 0x0059 (Nordic Semiconductor ASA), (data length: 2)
    Data: 00 00

ADV_SCAN_IND is working

adv_param.options = BT_LE_ADV_OPT_SCANNABLE;
adv_param.peer = NULL; // needs to be not null

err = bt_le_adv_start(&adv_param, adv_data , ARRAY_SIZE(adv_data), scan_uuid_data, ARRAY_SIZE(scan_uuid_data));

Device found MAC: 1F:4E:E4:14:18:75 (random) SNIF: E7:09:68:43:C6:2C (RSSI: -49), type 0x02 = ADV_SCAN_IND
    Flags: 0x06 [LE General Discoverable Mode, BR/EDR Not Supported (LE Only)]
    Name: nrf54
    Manufacturer: 0x0059 (Nordic Semiconductor ASA), (data length: 2)
    Data: 00 00

ADV_DIRECT_IND trying to debug

have tried:

low_duty

static bt_addr_le_t peer_addr_2 = {
.type = BT_ADDR_LE_RANDOM, // or BT_ADDR_LE_RANDOM BT_ADDR_LE_PUBLIC if the peer uses random address
.a.val = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 } // Example: FF:EE:DD:CC:BB:AA (reverse byte order!)
};
// For low-duty cycle directed (add DIR_MODE_LOW_DUTY)
static const struct bt_le_adv_param adv_param_low = {
.id = BT_ID_DEFAULT,
.sid = 0,
.options = (BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_USE_IDENTITY),
.interval_min = BT_GAP_ADV_SLOW_INT_MIN,
.interval_max = BT_GAP_ADV_SLOW_INT_MAX,
.peer = &peer_addr_2,
};

int err = bt_le_adv_start(&adv_param_low, NULL, 0, NULL, 0);

Have also tried these options

adv_param.options = BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_DIR_ADDR_RPA | BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY;

hi duty

static bt_addr_le_t peer_addr_2 = {
.type = BT_ADDR_LE_RANDOM, // or BT_ADDR_LE_RANDOM BT_ADDR_LE_PUBLIC if the peer uses random address
.a.val = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 } // Example: FF:EE:DD:CC:BB:AA (reverse byte order!)
};

// For high-duty cycle directed (ADV_DIRECT_IND high duty)
static const struct bt_le_adv_param adv_param_high = {
.id = BT_ID_DEFAULT,
.sid = 0, // Advertising set ID (0 for legacy)
.options = (BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_USE_IDENTITY),
.interval_min = 20, // 0 for high duty
.interval_max = 20,
.peer = &peer_addr_2,
};

int err = bt_le_adv_start(&adv_param_high, NULL, 0, NULL, 0);

Any help on getting the ADV_DIRECT_IND working would be helpful.  

Related