Hi,
I am testing direct advertising with two nRF52-DK. One performs a direct advertising and the other scans for the directed adverts. Unfortunately, the scanning device cannot see the directed advertising packages.
For simplicty and to reduce variables, I have set a test where I use the below code on a nRF52 dk (nRF52832) and the BLE tool on the nRF Connect SDK for Desktop (using a nRF52840-donge). I have hardcoded the dongle address on the directed advertiser code. Unfortunately, I still cannot see the directed advertising packages. Why is that? Any help most welcome.
#
# Copyright (c) 2021 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(11_directed_adv)
# NORDIC SDK APP START
target_sources(app PRIVATE
src/main.c
)
# NORDIC SDK APP END
prj.conf file:
# # Copyright (c) 2019 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # #CONFIG_NCS_SAMPLES_DEFAULTS=y CONFIG_BOARD_ENABLE_DCDC=n CONFIG_BT=y CONFIG_BT_DEBUG_LOG=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_EXT_ADV=y CONFIG_BT_DEVICE_NAME="directed_adv" CONFIG_BT_PRIVACY=n CONFIG_BT_EXT_ADV_MAX_ADV_SET=1 CONFIG_BT_GATT_CLIENT=y CONFIG_BT_SETTINGS=y CONFIG_HEAP_MEM_POOL_SIZE=1024 CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_NVS=y CONFIG_SETTINGS=y # RTT Log Enanble CONFIG_LOG=y CONFIG_USE_SEGGER_RTT=y CONFIG_LOG_BUFFER_SIZE=4096 CONFIG_RTT_CONSOLE=y CONFIG_PRINTK=y
/*
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/** @file
* @brief Nordic Battery Service Client sample
*/
#include <zephyr/types.h>
#include <errno.h>
#include <sys/printk.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/gatt.h>
//#include <bluetooth/gatt_dm.h>
#include <bluetooth/uuid.h>
#include <settings/settings.h>
#include <logging/log.h>
#define BT_GAP_ADV_INT_MIN 0x0020 /* 20 ms */
#define BT_GAP_ADV_INT_MAX 0x0020 /* 20 ms */
#define BT_ADV_5S_TIMEOUT 0x01F4 /* N=500 ; Time = N * 10ms = 5s */
#define BT_ADV_30S_TIMEOUT 0x0BB8 /* N=3000 ; Time = N * 10ms = 30s */
#define BT_ADV_60S_TIMEOUT 0x1770 /* N=6000 ; Time = N * 10ms = 60s */
static uint8_t manu_data[7] = { 0xff, 0x3a, /* Manufacturer */
0x00, 0x00, /* Major */
0x00, 0x00, /* Minor */
0x00}; /* Nb of hops */
static const struct bt_data directed_b2b_ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_LIMITED | BT_LE_AD_NO_BREDR)),
BT_DATA_BYTES(BT_DATA_UUID16_ALL, BT_UUID_16_ENCODE(0xFFFE)),
BT_DATA(BT_DATA_MANUFACTURER_DATA, &manu_data, sizeof(manu_data)),
};
static bt_addr_le_t connecting_peer_addr;
static struct bt_le_adv_param directed_b2b_param =
BT_LE_ADV_PARAM_INIT( BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_USE_NAME |
BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY,
BT_GAP_ADV_FAST_INT_MIN_2, \
BT_GAP_ADV_FAST_INT_MAX_2, &connecting_peer_addr);
static struct bt_le_ext_adv *directed_b2b_adv;
//==============================================================================
// advertising: directed
//==============================================================================
static void directed_b2b_adv_sent(struct bt_le_ext_adv *adv,
struct bt_le_ext_adv_sent_info *info)
{
printk("Directed B2B adv timeout\n");
}
static void directed_b2b_adv_connected(struct bt_le_ext_adv *adv,
struct bt_le_ext_adv_connected_info *info)
{
printk("Directed B2B Connected\n");
}
static struct bt_le_ext_adv_cb directed_b2b_adv_callbacks =
{
.sent = directed_b2b_adv_sent,
.connected = directed_b2b_adv_connected,
.scanned = NULL
};
//==============================================================================
// bt_ready bluetooth init
//==============================================================================
static void bt_ready(int err)
{
// TODO: Handle init errors
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return;
}
printk("Bluetooth initialized\n");
if (IS_ENABLED(CONFIG_SETTINGS)) {
settings_load();
}
// Directed B2B Advetising Create
err = bt_le_ext_adv_create(&directed_b2b_param, &directed_b2b_adv_callbacks, &directed_b2b_adv);
if (err)
{
printk("Failed to create directed advertiser set (%d)", err);
return;
}
// set extended directed B2B advertising data
err = bt_le_ext_adv_set_data(directed_b2b_adv, directed_b2b_ad, ARRAY_SIZE(directed_b2b_ad), NULL, 0);
if (err)
{
printk("Failed to set directed advertising data (%d)", err);
return;
}
struct bt_le_ext_adv_start_param directed_b2b_adv_start_param = {
.timeout = BT_ADV_30S_TIMEOUT,
.num_events = 0};
connecting_peer_addr.type = 0x01;
connecting_peer_addr.a.val[0] = 0xf0;
connecting_peer_addr.a.val[1] = 0x0f;
connecting_peer_addr.a.val[2] = 0x34;
connecting_peer_addr.a.val[3] = 0x56;
connecting_peer_addr.a.val[4] = 0x45;
connecting_peer_addr.a.val[5] = 0xc7;
directed_b2b_param.peer = &connecting_peer_addr;
err = bt_le_ext_adv_update_param(directed_b2b_adv, &directed_b2b_param);
if (err)
{
printk("Failed to update directed advertising data (%d)", err);
return;
}
err = bt_le_ext_adv_start(directed_b2b_adv, &directed_b2b_adv_start_param);
if (err)
{
printk("Failed to start Directed advertising(%d)\n", err);
return;
}
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(directed_b2b_param.peer, addr, sizeof(addr));
printk("Directed B2B Advertising Started addr: %s\n", addr);
}
//==============================================================================
// main
//==============================================================================
void main(void)
{
int err;
printk("11-directed_adv init\n");
err = bt_enable(bt_ready);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return;
}
}
Direct Advertiser logs
*** Booting Zephyr OS build v2.7.0-ncs1 ***
11-directed_adv init
[00:00:01.327,239] [0m<inf> fs_nvs: 6 Sectors of 4096 bytes[0m
[00:00:01.327,270] [0m<inf> fs_nvs: alloc wra: 0, f70[0m
[00:00:01.327,270] [0m<inf> fs_nvs: data wra: 0, 118[0m
[00:00:01.327,392] [0m<inf> sdc_hci_driver: SoftDevice Controller build revision:
df c0 4e d6 1f 7c 66 09 0a f5 2b a0 98 f2 43 64 |..N..|f. ..+...Cd
62 c5 a6 2a |b..* [0m
[00:00:01.330,413] [0m<inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)[0m
[00:00:01.330,413] [0m<inf> bt_hci_core: HW Variant: nRF52x (0x0002)[0m
[00:00:01.330,413] [0m<inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 223.20160 Build 1719410646[0m
[00:00:01.330,718] [0m<inf> bt_hci_core: No ID address. App must call settings_load()[0m
Bluetooth initialized
[00:00:01.330,902] [1;31m<err> settings: set-value failure. key: bt/keys/e394a91ee9ef1 error(-2)[0m
[00:00:01.331,634] [0m<inf> bt_hci_core: Identity: F2:A4:36:CA:06:73 (random)[0m
[00:00:01.331,634] [0m<inf> bt_hci_core: HCI: version 5.2 (0x0b) revision 0x12b0, manufacturer 0x0059[0m
[00:00:01.331,634] [0m<inf> bt_hci_core: LMP: version 5.2 (0x0b) subver 0x12b0[0m
Directed B2B Advertising Started addr: C7:45:56:34:0F:F0 (random)
BLE Tool
