nRF54L15 - Perform Channel Sounding While Reflector Advertises

Description

I’m developing a product designed to recognize people standing in front of gates.

Let’s consider the following scenario:

  • There are three gates, each 1 meter apart, equipped with a Channel Sounding Initiator.

  • Each person standing in front of a gate carries a Channel Sounding Reflector.

The goal is to determine which person is in front of which gate based on Channel Sounding range measurements. Because multiple gates and reflectors may be within range of each other, proper coordination is essential.


Concept

Each reflector advertises so that the gates can discover and maintain a list of nearby devices for Channel Sounding.
Each gate (initiator) should then perform Channel Sounding at least once per detected reflector.

Gate (Initiator) behavior:

  1. Scans and builds a list of nearby reflectors.

  2. Performs the Channel Sounding procedure sequentially for each reflector.

  3. Determines which reflector (person) is closest.

Person (Reflector) behavior:

  1. Performs connectable advertising for discovery.

  2. Participates in the Channel Sounding procedure.

  3. Performs non-connectable advertising during the Channel Sounding procedure so that other gates can detect the Prescence of this person.


Experiment

To demonstrate this, I set up two nRF54L15-DK boards:

  • Initiator: channel_sounding_ras_initiator (unmodified)

  • Reflector: channel_sounding_ras_reflector (modified to advertise after connection)

Code snippet used on the reflector main.c:

#define AME_BT_LE_ADV_NCONN_IDENTITY BT_LE_ADV_PARAM(BT_LE_ADV_OPT_USE_IDENTITY, \
						 BT_GAP_ADV_SLOW_INT_MIN, \
						 BT_GAP_ADV_SLOW_INT_MAX, \
						 NULL)

static void connected_cb(struct bt_conn *conn, uint8_t err)
{
	char addr[BT_ADDR_LE_STR_LEN];

	(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
	LOG_INF("Connected to %s (err 0x%02X)", addr, err);

	if (err) {
		bt_conn_unref(conn);
		connection = NULL;
	}

	connection = bt_conn_ref(conn);

	err = bt_le_adv_start(AME_BT_LE_ADV_NCONN_IDENTITY, ad, ARRAY_SIZE(ad), NULL, 0);
	if (err) {
		LOG_ERR("Advertising failed to start (err %d)", err);
	}

	k_sem_give(&sem_connected);

	dk_set_led_on(CON_STATUS_LED);
}


Observation:
The initiator logs contains many "E: Tried to parse empty step data." messages.

These messages occur less frequently when I increase the advertisement interval.


Question

Can a reflector continue advertising while it is engaged in the Channel Sounding procedure?
If it is possible how can i configure the timing so that the Connection, Channel Sounding and advertisement is maintained without collisions? 


Reference

Scheduling Priorities — nRF Connect SDK Documentation

Parents
  • Hi Dennis

    To answer your question, I'm afraid the advertising will be down prioritized while the ranging process itself is ongoing, since it requires channel sweeping, and the nRF54L15 only has one radio. So you will have to do advertising whenever the ranging process is not done.

    Other than that, I want to comment briefly on that if you are planning on a one to many connection topography with Channel Sounding we have found that it's easier to have the central being the reflector, and the advertiser being the initiator for channel sounding, so that the central device can handle all of the timing relevant jobs instead of that having to be split between the devices. So I think it would save you some headaches to consider switching the initiator/reflector roles around from what the sample projects are doing.

    Best regards,

    Simon

  • Hi Simon,

    Thank you for your quick response.

    In our system, it’s not suitable to switch the initiator/reflector roles, since the person (reflector) device has no user interface, and all decision-making is handled by the gate (initiator) which determines which persons are relevant to perform Channel Sounding with.

    Missing some advertisement packets due to down-prioritization is not a major issue for us. However, I’m a bit confused about how to properly configure the prioritization and timing between Channel Sounding and advertising activities.

    As I understand it, all messaging must occur within the ACL interval, so it’s important to correctly configure the ACL and Channel Sounding event lengths. In our case, we effectively need to maintain three BLE activities simultaneously:

    1. Connection

    2. Channel Sounding

    3. Advertising

    Could you provide an example or code snippet showing how to configure these scheduling parameters particularly how to balance Channel Sounding events with ongoing advertising?

    Best regards,
    Dennis

  • Hi again Dennis

    Unfortunately we don't have any sample projects or code snippets showcasing this, since it will be different dependent on the use case we can't cover all of them. How the scheduling is handled will ultimately be up to you to find what suits your use case in particular. 

    Not havingf all scheduling on one device will also mean the devices have to communicate with one another on when channel sounding should be done, and when connection/advertising is done. One idea is to have the connection initiate the channel sounding procedure immediately upon connection (if it hasn't been measured yet) to simplify the process, then afterwards the peripheral can start advertising again and central can start scanning for more devices.

    Best regards,

    Simon

Reply
  • Hi again Dennis

    Unfortunately we don't have any sample projects or code snippets showcasing this, since it will be different dependent on the use case we can't cover all of them. How the scheduling is handled will ultimately be up to you to find what suits your use case in particular. 

    Not havingf all scheduling on one device will also mean the devices have to communicate with one another on when channel sounding should be done, and when connection/advertising is done. One idea is to have the connection initiate the channel sounding procedure immediately upon connection (if it hasn't been measured yet) to simplify the process, then afterwards the peripheral can start advertising again and central can start scanning for more devices.

    Best regards,

    Simon

Children
  • Dear Simon,

    That is unfortunate but understandable. I'm having a hard time to figure-out the API calls I need to make to set the timing/priority. Could you at least point me to the documentation or provide a few lines of code to get me started?

    In our case I want to keep the reflector software as simple as possible. Advertise open to allow connections, perform channel sounding upon connect and advertise non-connectable to let other initiators (within range) know that this reflector exists and is busy performing the channel-sounding. Once the reflector finished channel-sounding it will reboot and go back to advertise open.

    All the 'smart' behavior is intended to be performed on the initiator side.

    Thanks a lot!

    Kind regards,

    Dennis

Related