NRF connect project.
SDL v2.5.1
Board: NRF5340
the application is running on it. the code support multiple connection to a pereferal.
Every thing is running properlly. But still only one phone can connect to the pereferal. The other phone only connects when the older one is dissconnected.
I am not understanding where can be the issue.
`proj.conf
`CONFIG_BT=y
CONFIG_BT_DEBUG_LOG=y
CONFIG_BT_SMP=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DIS=y
CONFIG_BT_DIS_PNP=n
CONFIG_BT_BAS=y
CONFIG_BT_HRS=y
CONFIG_BT_DEVICE_NAME="Zephyr Heartrate Sensor"
CONFIG_BT_DEVICE_APPEARANCE=833
CONFIG_BT_MAX_CONN=2``
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 <string.h>
#include <errno.h>
#include <sys/printk.h>
#include <sys/byteorder.h>
#include <zephyr.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/conn.h>
#include <bluetooth/uuid.h>
#include <bluetooth/gatt.h>
#include <bluetooth/services/bas.h>
#include <bluetooth/services/hrs.h>
#define NUM_CONN_MAX CONFIG_BT_MAX_CONN
static struct bt_conn *curr_conn[NUM_CONN_MAX];
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA_BYTES(BT_DATA_UUID16_ALL,
BT_UUID_16_ENCODE(BT_UUID_HRS_VAL),
BT_UUID_16_ENCODE(BT_UUID_BAS_VAL),
BT_UUID_16_ENCODE(BT_UUID_DIS_VAL))
};
static struct bt_conn **find_curr_conn(struct bt_conn *conn)
{
int i;
struct bt_conn **conn_found = NULL;
for (i = 0; i < NUM_CONN_MAX; i++) {
if (curr_conn[i] == conn) {
conn_found = curr_conn + i;
break;
}
}
return conn_found;
}
static void connected(struct bt_conn *conn, uint8_t err)
{
struct bt_conn **conn_room;
if (err) {
printk("Connection failed (err 0x%02x)n", err);
} else {
conn_room = find_curr_conn(NULL);
if (conn_room) {
*conn_room = bt_conn_ref(conn);
printk("Connectedn");
} else {
printk("No room to trace connection!n");
}
}
}
static void disconnected(struct bt_conn *conn, uint8_t reason)
{
struct bt_conn **conn_found;
printk("Disconnected (reason 0x%02x)n", reason);
conn_found = find_curr_conn(conn);
if (conn_found) {
bt_conn_unref(*conn_found);
*conn_found = NULL;
}
}
static struct bt_conn_cb conn_callbacks = {
.connected = connected,
.disconnected = disconnected,
};
static void bt_ready(void)
{
int err;
printk("Bluetooth initializedn");
err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), NULL, 0);
if (err) {
printk("Advertising failed to start (err %d)n", err);
return;
}
printk("Advertising successfully startedn");
}
static void auth_cancel(struct bt_conn *conn)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
printk("Pairing cancelled: %sn", addr);
}
static struct bt_conn_auth_cb auth_cb_display = {
.cancel = auth_cancel,
};
static void bas_notify(void)
{
uint8_t battery_level = bt_bas_get_battery_level();
battery_level--;
if (!battery_level) {
battery_level = 100U;
}
bt_bas_set_battery_level(battery_level);
}
static void hrs_notify(void)
{
static uint8_t heartrate = 90U;
/* Heartrate measurements simulation */
heartrate++;
if (heartrate == 160U) {
heartrate = 90U;
}
bt_hrs_notify(heartrate);
}
void main(void)
{
int err;
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)n", err);
return;
}
bt_ready();
bt_conn_cb_register(&conn_callbacks);
bt_conn_auth_cb_register(&auth_cb_display);
/* Implement notification. At the moment there is no suitable way
* of starting delayed work so we do it here
*/
while (1) {
k_sleep(K_SECONDS(1));
/* Heartrate measurements simulation */
hrs_notify();
/* Battery level simulation */
bas_notify();
}
}
I tried many working samples but always one device connects.
- Try to restart advertising after connected.
- Then try to increase CONFIG_BT_MAX_CONN to 3.
If this does not work, collect a sniffer trace of the Bluetooth LE traffic is a useful way to debug this issue.
You can for example use our nRF Sniffer for Bluetooth LE with Wireshark for this.
Here is a similar ticket I found on DevZone: Zephyr/nRF Connect SDK one peripheral with multiple central. I can recommend that you search our forum for other similar tickets as well.
Disclaimer: I work for Nordic Semicondutor technical support over at DevZone.