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:
-
Scans and builds a list of nearby reflectors.
-
Performs the Channel Sounding procedure sequentially for each reflector.
-
Determines which reflector (person) is closest.
Person (Reflector) behavior:
-
Performs connectable advertising for discovery.
-
Participates in the Channel Sounding procedure.
-
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?