Hi,
When I used NCS V2.5.0,after two devices successfully establish a BLE connection but then disconnect due to a timeout, subsequent reconnection attempts fail with error code -22 . What could be causing this connection failure and how can it be resolved?(PS.The code added the 'bt_conn_unref(conn)',did it work?)
static void restart_scan_work_handler(struct k_work *work) {
int err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
if (err) {
printk("Scan restart failed (err %d)\n", err);
}
}
K_WORK_DEFINE(restart_scan_work, restart_scan_work_handler);
static void connected(struct bt_conn *conn, uint8_t conn_err)
{
if (conn_err) {
printk("Connection failed (err %d)\n", conn_err);
bt_conn_unref(conn);
int err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
if (err) {
printk("Scanning failed to start (err %d)\n", err);
}
return;
}
default_conn = bt_conn_ref(conn);
}
static void disconnected(struct bt_conn *conn, uint8_t reason)
{
printk("Client disconnected (reason 0x%02x)\n", reason);
// 释放连接对象并重置指针
if (default_conn) {
bt_conn_unref(default_conn);
default_conn = NULL;
}
k_work_submit(&restart_scan_work); // 使用工作队列
}
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
};
// 过滤器匹配后回调
static void scan_filter_match(struct bt_scan_device_info *device_info,
struct bt_scan_filter_match *filter_match,
bool connectable)
{
char addr_str[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(device_info->recv_info->addr, addr_str, sizeof(addr_str));
printk("Filter matched device: %s, RSSI: %d\n", addr_str, device_info->recv_info->rssi);
int err = bt_scan_stop();
if (err) {
printk("Stop LE scan failed (err %d)\n", err);
}
if (default_conn) {
bt_conn_disconnect(default_conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
printk("Warning: previous connection still exists, cleaning up\n");
bt_conn_unref(default_conn);
default_conn = NULL;
k_sleep(K_MSEC(500));
}
err = bt_conn_le_create(device_info->recv_info->addr,
&create_param,
&conn_param,
&default_conn);
if (err) {
k_work_submit(&restart_scan_work);
printk("Connection create failed (err %d)\n", err);
} else {
printk("Connecting to %s...\n", addr_str);
}
}
BT_SCAN_CB_INIT(scan_cb, scan_filter_match, NULL, NULL, NULL);
static void scan_init(void)
{
int err;
/* Use active scanning and disable duplicate filtering to handle any
* devices that might update their advertising data at runtime. */
struct bt_le_scan_param scan_param = {
.type = BT_LE_SCAN_TYPE_ACTIVE,
.interval = BT_GAP_SCAN_FAST_INTERVAL,
.window = BT_GAP_SCAN_FAST_WINDOW,
.options = BT_LE_SCAN_OPT_NONE
};
struct bt_scan_init_param scan_init = {
.connect_if_match = 0,
.scan_param = &scan_param,
.conn_param = NULL
};
bt_scan_init(&scan_init);
bt_scan_cb_register(&scan_cb);
static uint16_t my_app=(uint16_t)MY_APPEARANCE;
err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_APPEARANCE, &my_app);
if (err) {
printk("Failed to add appearance filter (err %d)\n", err);
return;
}
err = bt_scan_filter_enable(BT_SCAN_APPEARANCE_FILTER, false);
if (err) {
printk("Failed to enable filter (err %d)\n", err);
return;
}
}