How to use public-addr and non-resolvable-addr on nrf connect SDK

I want to use  public-addr and non-resolvable-addr for advertising on nrf connect SDK.

I was able to advertise using a random static addr.

But,
1. can not set public addr.
2. can not create non-resolvable-addr 's bt_id.

Following test code.

static bt_addr_le_t random_bdaddr = {
	.type = BT_ADDR_LE_RANDOM,
	.a = {
		.val = {0xC1, 0x11, 0x11, 0x11, 0x11, 0xC1},
	}
};

static struct bt_le_adv_param adv_param = {
	.id				= 0,
	.options		= BT_LE_ADV_OPT_USE_IDENTITY | BT_LE_ADV_OPT_EXT_ADV,
	.interval_min	= 0x20,
	.interval_max	= 0x20,
};

	bt_ctlr_set_public_addr(public_addr);
	(or sdc_hci_cmd_vs_zephyr_write_bd_addr(&public_addr);)

	bt_enable(NULL);

	int id0 = bt_id_create(&random_bdaddr, NULL);

	bt_addr_le_t nrpa_bdaddr;
	bt_addr_le_create_nrpa(&nrpa_bdaddr);
	int id1 = bt_id_create(&nrpa_bdaddr, NULL); /* this is ERROR!! */

	adv_param.id = 0; /* bt_id */
	bt_le_ext_adv_create(&adv_param, &adv_cb, &adv);
	bt_le_ext_adv_set_data(adv, bdata, 1, NULL, 0);
	bt_le_ext_adv_start(adv, &adv_start_param);

  • I try,

    bt_le_adv_param.id=0 / bt_le_adv_param.options=BT_LE_PER_ADV_OPT_NONE
    BDADDR=non-resolvable-private address

    bt_le_adv_param.id=0 / bt_le_adv_param.options=BT_LE_ADV_OPT_USE_IDENTITY
    BDADDR=random static address (FICR.DEVICEADDR)

    call bt_ctlr_set_public_addr() before bt_enable()
    bt_le_adv_param.id=0 / bt_le_adv_param.options=BT_LE_PER_ADV_OPT_NONE
    BDADDR=non-resolvable-private address

    call bt_ctlr_set_public_addr() before bt_enable()
    bt_le_adv_param.id=0 / bt_le_adv_param.options=BT_LE_ADV_OPT_USE_IDENTITY
    BDADDR=random static address (FICR.DEVICEADDR)

  • I am still confused. What is the expected result? And what is the actual result? Please elaborate.

  • My Code (simply)

    static void set_public_addr(void)
    {
    	uint8_t pub_addr[BT_ADDR_SIZE] = {0xba, 0xde, 0xba, 0x11, 0xca, 0xfe};
    	bt_ctlr_set_public_addr(pub_addr);
    }
    
    static struct bt_le_adv_param adv_param = {
    	.id				= BT_ID_DEFAULT,
    	.options		= BT_LE_PER_ADV_OPT_NONE,
    	.interval_min	= 0x00a0,
    	.interval_max	= 0x00a0,
    };
    
    main()
    ...
    	set_public_addr();
    	bt_enable(NULL);
    	bt_le_ext_adv_create(&adv_param, &adv_cb, &ext_adv0);
    	bt_le_ext_adv_set_data(ext_adv0, bdata, 1, NULL, 0);
    	bt_le_ext_adv_start(adv, &adv_start_param);
    ...

    If adv_param.options = BT_LE_PER_ADV_OPT_NONE
    Result
    001845.151 37 ___ 15:0B:7D:17:CF:B9 -45 10FF112233445566778899AABBCCDDEEFF
    (non resolvable private address)

    If adv_param.options = BT_LE_ADV_OPT_USE_IDENTITY
    Result
    001962.104 37 ___ xx:xx:xx:xx:xx:xx -40 10FF112233445566778899AABBCCDDEEFF
    (xx is FICR.DEVICEADDR (Random Static Address))


    what i want
    BA:DE:BA:11:CA:FE 10FF112233445566778899AABBCCDDEEFF
    (public address)

  • Hi,

    Can you share a minimal but complete example that does this so that I can test your exact code on my end?

  • Sorry.
    Projects cannot be provided.
    Instead, it only provides main.c/proj.conf.

    main.c

    /* main.c - Application main entry point */
    
    /*
     * Copyright (c) 2015-2016 Intel Corporation
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    #include <zephyr/types.h>
    #include <stddef.h>
    #include <zephyr/sys/printk.h>
    #include <zephyr/sys/util.h>
    
    #include <zephyr/bluetooth/bluetooth.h>
    #include <zephyr/bluetooth/hci.h>
    #include <sdc_hci_vs.h> 
    #include <mpsl_timeslot.h>
    #include <mpsl.h>
    #include <hal/nrf_timer.h>
    
    static void adv_sent(struct bt_le_ext_adv *adv, struct bt_le_ext_adv_sent_info *info);
    
    
    static struct bt_le_adv_param adv_param = {
    	.id				= BT_ID_DEFAULT,
    	.options		= BT_LE_ADV_OPT_USE_IDENTITY,
    	.interval_min	= 0x00a0,
    	.interval_max	= 0x00a0,
    };
    
    static const struct bt_le_ext_adv_cb adv_cb = {
    	.sent			= adv_sent,
    };
    
    static const uint8_t ManufData[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
    static const struct bt_data bdata[1] = {
    	BT_DATA(0xFF, ManufData, sizeof(ManufData))
    };
    
    static struct bt_le_ext_adv* ext_adv0;
    static struct bt_le_ext_adv_start_param adv_start_param = { 0, 0 };
    
    static bt_addr_le_t bdaddr0 = {
    	.type = BT_ADDR_LE_RANDOM,
    	.a = {
    		.val = {0xC1, 0x11, 0x11, 0x11, 0x11, 0xC1},
    	}
    };
    
    static bt_addr_le_t bdaddr1 = {
    	.type = BT_ADDR_LE_RANDOM,
    	.a = {
    		.val = {0xC2, 0x22, 0x22, 0x22, 0x22, 0xC2},
    	}
    };
    
    static void set_public_addr(void)
    {
    	uint8_t pub_addr[BT_ADDR_SIZE] = {0xba, 0xde, 0xba, 0x11, 0xca, 0xfe};
    	bt_ctlr_set_public_addr(pub_addr);
    }
    
    static void adv_sent(struct bt_le_ext_adv *adv, struct bt_le_ext_adv_sent_info *info)
    {
    }
    
    void main(void)
    {
    	int err;
    
    	printk("Starting Scanner/Advertiser Demo\n");
    
    	set_public_addr();
    
    	/* Initialize the Bluetooth Subsystem */
    	err = bt_enable(NULL);
    	if (err) {
    		printk("Bluetooth init failed (err %d)\n", err);
    		return;
    	}
    
    	printk("Bluetooth initialized\n");
    
    	err = bt_le_ext_adv_create(&adv_param, &adv_cb, &ext_adv0);
    	if (err) {
    		printk("adv create failed (err %d)\n", err);
    		return;
    	}
    
    	err = bt_le_ext_adv_set_data(ext_adv0, bdata, 1, NULL, 0);
    	if (err) {
    		printk("adv set data failed (err %d)\n", err);
    		return;
    	}
    
    	err = bt_le_ext_adv_start(ext_adv0, &adv_start_param);
    	if (err) {
    		printk("Advertising failed to start (err %d)\n", err);
    		return;
    	}
    
    
    	do {
    		k_sleep(K_MSEC(400));
    
    	} while (1);
    }
    

    proj.conf

    CONFIG_FPU=y
    CONFIG_BT=y
    CONFIG_BT_PERIPHERAL=y
    CONFIG_BT_BROADCASTER=y
    CONFIG_BT_OBSERVER=y
    CONFIG_BT_EXT_ADV=y
    CONFIG_BT_EXT_ADV_MAX_ADV_SET=4
    CONFIG_BT_PER_ADV=y
    CONFIG_BT_PER_ADV_SYNC=y
    CONFIG_BT_PER_ADV_SYNC_MAX=64
    CONFIG_BT_ASSERT=n
    CONFIG_BT_ASSERT_VERBOSE=n
    CONFIG_BT_DEVICE_NAME="EXBeacon"
    CONFIG_BT_ID_MAX=5
    CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
    CONFIG_BT_CTLR_PHY_2M=y
    CONFIG_BT_CTLR_PHY_CODED=y
    CONFIG_BT_CTLR_ADV_EXT=y
    CONFIG_BT_CTLR_ADV_SET=4
    CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=191
    CONFIG_BT_CTLR_SCAN_DATA_LEN_MAX=200
    CONFIG_MPSL_TIMESLOT_SESSION_COUNT=1
    CONFIG_NRFX_GPIOTE_NUM_OF_EVT_HANDLERS=2
    CONFIG_THREAD_CUSTOM_DATA=y
    CONFIG_BT_DEBUG_NONE=y
    CONFIG_BT_RECV_WORKQ_SYS=y
    CONFIG_BOOT_BANNER=n
    CONFIG_ASSERT_VERBOSE=n
    CONFIG_CONSOLE=n
    CONFIG_USE_SEGGER_RTT=n
    CONFIG_SERIAL=n
    CONFIG_UART_CONSOLE=n
    CONFIG_CPLUSPLUS=y
    CONFIG_STD_CPP17=y
    CONFIG_EVENTS=y
    CONFIG_NRFX_WDT0=y
    CONFIG_NRFX_GPIOTE_NUM_OF_EVT_HANDLERS=4
    

Related