mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
fix(examples): improve bluedroid BLE example error handling
Check GAP/GATT event status, fix prepare-write buffer lifecycle, and
align example code with updated Bluedroid API behavior.
(cherry picked from commit bfc47ace48)
Co-authored-by: zhiweijian <zhiweijian@espressif.com>
This commit is contained in:
+14
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@@ -7,6 +7,7 @@
|
||||
/********************************************************************************
|
||||
*
|
||||
* This file is for gatt server. It can send adv data, and get connected by client.
|
||||
* Only one BLE ACL connection is supported (see sdkconfig.defaults: CONFIG_BT_ACL_CONNECTIONS=1).
|
||||
*
|
||||
*********************************************************************************/
|
||||
|
||||
@@ -65,6 +66,7 @@ typedef struct {
|
||||
int prepare_len;
|
||||
} prepare_type_env_t;
|
||||
|
||||
/* This demo targets one connected client; a single prepare-write buffer is enough. */
|
||||
static prepare_type_env_t prepare_write_env;
|
||||
|
||||
//#define CONFIG_SET_RAW_ADV_DATA
|
||||
@@ -441,7 +443,11 @@ void example_prepare_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t
|
||||
memcpy(prepare_write_env->prepare_buf + param->write.offset,
|
||||
param->write.value,
|
||||
param->write.len);
|
||||
prepare_write_env->prepare_len += param->write.len;
|
||||
/* Extent of prepared value: max(offset+len), not sum(len) — overlaps/retries must not inflate length. */
|
||||
uint32_t span_end = (uint32_t)param->write.offset + (uint32_t)param->write.len;
|
||||
if (span_end > (uint32_t)prepare_write_env->prepare_len) {
|
||||
prepare_write_env->prepare_len = (int)span_end;
|
||||
}
|
||||
|
||||
}
|
||||
uint8_t long_write[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
|
||||
@@ -562,7 +568,7 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_
|
||||
break;
|
||||
case ESP_GATTS_EXEC_WRITE_EVT:
|
||||
// the length of gattc prepare write data must be less than GATTS_EXAMPLE_CHAR_VAL_LEN_MAX.
|
||||
ESP_LOGI(EXAMPLE_TAG, "ESP_GATTS_EXEC_WRITE_EVT, Length=%d", prepare_write_env.prepare_len);
|
||||
ESP_LOGI(EXAMPLE_TAG, "ESP_GATTS_EXEC_WRITE_EVT, Length=%d", prepare_write_env.prepare_len);
|
||||
example_exec_write_event_env(&prepare_write_env, param);
|
||||
break;
|
||||
case ESP_GATTS_MTU_EVT:
|
||||
@@ -581,6 +587,11 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_
|
||||
break;
|
||||
case ESP_GATTS_DISCONNECT_EVT:
|
||||
ESP_LOGI(EXAMPLE_TAG, "ESP_GATTS_DISCONNECT_EVT, reason = %d", param->disconnect.reason);
|
||||
if (prepare_write_env.prepare_buf) {
|
||||
free(prepare_write_env.prepare_buf);
|
||||
prepare_write_env.prepare_buf = NULL;
|
||||
}
|
||||
prepare_write_env.prepare_len = 0;
|
||||
esp_ble_gap_start_advertising(&adv_params);
|
||||
break;
|
||||
case ESP_GATTS_CREAT_ATTR_TAB_EVT:{
|
||||
|
||||
Reference in New Issue
Block a user