New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gattc_multi_connect The number of connections can only be five (IDFGH-12799) #13776
Comments
@laopi333 |
@esp-cjh 非常感谢你的回复,这解决了我的问题。另外我还有一个问题,我不太清楚 BT_BTC_TASK_STACK_SIZE 和 BT_BTU_TASK_STACK_SIZE 这两个栈空间有什么区别,如果我想提升蓝牙多连接的稳定性,增大这两个栈空间会有帮助嘛,如果能回答我会非常感谢。 |
@laopi333 |
@esp-cjh 谢谢回复,我遇到的问题主要是在gatt客户端连接超过4个以上设备的时候,连接会不稳定,有时候会出现断开连接的现象,出现了这样的警告 |
@laopi333 GATT 服务器端用的是哪款芯片?连接上之后双方会不会进行数据交互?大概多久会出现连接断开的问题?我这边会尝试复现并找到问题原因。 |
@esp-cjh gatt客户端用的是ESP32-S3,gatt服务端用的都是NRF52840开发板,测试中连接后没有进行数据交互,但是我想要在确保连接稳定性的情况下进行数据交互。连接数量超过4个后,可能5分钟之内就会出现断连现象,连接数量越多出现的频率越高。 |
@laopi333 我使用 ESP32-S3 作为 client,连接 7 个 ESP32-C3(作为 server,使用 gatt_server example),测试了一个晚上,没有出现连接断开的问题。 所以我这边还需要再确认以下问题: |
@esp-cjh 非常感谢你的测试,首先:1.nrf52840在连接的时候发起了连接参数更新,这是我复现的日志: |
@laopi333 我查看了 log,你当前使用的连接参数是 interval = 50ms,timeout = 420ms,这导致如果连续 8 个连接事件都收不到包或者收错包就会导致超时断开。对于多连接和复杂环境下,这个 timeout 太小了,建议至少设置为 500(即 5 秒)。 我本地测试了一下,使用你这一组连接参数确实比较容易发生连接超时断开,使用我推荐的参数的话我测试过是很难发生超时断开的,你可以测试一下。 |
Answers checklist.
IDF version.
ESP-IDF v5.1.2-1-g2bbd2ec531
Espressif SoC revision.
esp32s3
Operating System used.
Linux
How did you build your project?
Command line with idf.py
If you are using Windows, please specify command line type.
None
Development Kit.
ESP32-S3-WROOM-1
Power Supply used.
USB
What is the expected behavior?
我尝试使用开发板gattc连接最大数量的蓝牙设备,在menuconfig里面设置了
(9) BT/BLE MAX ACL CONNECTIONS(1~9)
What is the actual behavior?
我期待最大能连接到9个或者7个设备,但是只能连接到5个,当连接第6个设备的时候,在 ESP_GATTC_OPEN_EVT 中产生了这样的错误:
W (290423) BT_L2CAP: L2CA_CancelBleConnectReq - no connection pending E (290423) GATTC_MULTIPLE_DEMO: connect device failed, status 133
开发板一直在尝试连接第6个设备,但是一直打印这样的错误,我找不到原因
Steps to reproduce.
修改 gattc_multi_connect demo,将连接的数量和相关参数增大
Debug Logs.
More Information.
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include "nvs.h"
#include "nvs_flash.h"
#include "esp_bt.h"
#include "esp_gap_ble_api.h"
#include "esp_gattc_api.h"
#include "esp_gatt_defs.h"
#include "esp_bt_main.h"
#include "esp_gatt_common_api.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define GATTC_TAG "GATTC_MULTIPLE_DEMO"
#define REMOTE_SERVICE_UUID 0x00FF
#define REMOTE_NOTIFY_CHAR_UUID 0xFF01
#define MAX_CONN_NUM 10
/* register three profiles, each profile corresponds to one connection,
which makes it easy to handle each connection event */
#define PROFILE_NUM 1
#define PROFILE_A_APP_ID 0
#define PROFILE_B_APP_ID 1
#define PROFILE_C_APP_ID 2
#define INVALID_HANDLE 0
/* Declare static functions */
static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
static void esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param);
static void gattc_profile_a_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param);
static esp_bt_uuid_t remote_filter_service_uuid = {
.len = ESP_UUID_LEN_16,
.uuid = {.uuid16 = REMOTE_SERVICE_UUID,},
};
static esp_bt_uuid_t remote_filter_char_uuid = {
.len = ESP_UUID_LEN_16,
.uuid = {.uuid16 = REMOTE_NOTIFY_CHAR_UUID,},
};
static esp_bt_uuid_t notify_descr_uuid = {
.len = ESP_UUID_LEN_16,
.uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,},
};
static int conn_device_num = 0;
static bool get_service_a = false;
static bool Isconnecting = false;
static bool stop_scan_done = false;
static esp_gattc_char_elem_t *char_elem_result_a = NULL;
static esp_gattc_descr_elem_t *descr_elem_result_a = NULL;
static const char remote_device_name[] = "GL_BOARD";
static esp_ble_scan_params_t ble_scan_params = {
.scan_type = BLE_SCAN_TYPE_ACTIVE,
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
.scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL,
.scan_interval = 0x50,
.scan_window = 0x30,
.scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE
};
struct gattc_profile_inst {
esp_gattc_cb_t gattc_cb;
uint16_t gattc_if;
uint16_t app_id;
uint16_t conn_id[MAX_CONN_NUM];
uint16_t service_start_handle;
uint16_t service_end_handle;
uint16_t char_handle;
esp_bd_addr_t remote_bda;
};
/* One gatt-based profile one app_id and one gattc_if, this array will store the gattc_if returned by ESP_GATTS_REG_EVT /
static struct gattc_profile_inst gl_profile_tab[PROFILE_NUM] = {
[PROFILE_A_APP_ID] = {
.gattc_cb = gattc_profile_a_event_handler,
.gattc_if = ESP_GATT_IF_NONE, / Not get the gatt_if, so initial is ESP_GATT_IF_NONE */
},
};
static void start_scan(void)
{
stop_scan_done = false;
Isconnecting = false;
uint32_t duration = 0;
esp_ble_gap_start_scanning(duration);
}
static void gattc_profile_a_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
{
}
static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
uint8_t *adv_name = NULL;
uint8_t adv_name_len = 0;
switch (event) {
case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
ESP_LOGI(GATTC_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d",
param->update_conn_params.status,
param->update_conn_params.min_int,
param->update_conn_params.max_int,
param->update_conn_params.conn_int,
param->update_conn_params.latency,
param->update_conn_params.timeout);
break;
case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: {
//the unit of the duration is second
uint32_t duration = 0;
esp_ble_gap_start_scanning(duration);
break;
}
case ESP_GAP_BLE_SCAN_START_COMPLETE_EVT:
//scan start complete event to indicate scan start successfully or failed
if (param->scan_start_cmpl.status == ESP_BT_STATUS_SUCCESS) {
// ESP_LOGI(GATTC_TAG, "Scan start success");
}else{
// ESP_LOGE(GATTC_TAG, "Scan start failed");
}
break;
case ESP_GAP_BLE_SCAN_RESULT_EVT: {
esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param;
switch (scan_result->scan_rst.search_evt) {
case ESP_GAP_SEARCH_INQ_RES_EVT:
// esp_log_buffer_hex(GATTC_TAG, scan_result->scan_rst.bda, 6);
// ESP_LOGI(GATTC_TAG, "Searched Adv Data Len %d, Scan Response Len %d", scan_result->scan_rst.adv_data_len, scan_result->scan_rst.scan_rsp_len);
adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv,
ESP_BLE_AD_TYPE_NAME_CMPL, &adv_name_len);
// ESP_LOGI(GATTC_TAG, "Searched Device Name Len %d", adv_name_len);
// esp_log_buffer_char(GATTC_TAG, adv_name, adv_name_len);
// ESP_LOGI(GATTC_TAG, "\n");
if (Isconnecting){
break;
}
}
static void esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
{
//ESP_LOGI(GATTC_TAG, "EVT %d, gattc if %d, app_id %d", event, gattc_if, param->reg.app_id);
}
void app_main(void)
{
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK( ret );
}
The text was updated successfully, but these errors were encountered: