乐鑫技术交流
直播中

李艺银

7年用户 1016经验值
私信 关注
[问答]

请问如何创建Characteristic User Description?

工程师,你好。在ESP_GATTS_ADD_CHAR_EVT事件当中,可以利用
gl_profile_tab[PROFILE_A_APP_ID].char_handle                  = param->add_char.attr_handle;
gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len              = ESP_UUID_LEN_16;
gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG;

esp_err_t add_descr_ret = esp_ble_gatts_add_char_descr(gl_profile_tab[PROFILE_A_APP_ID].service_handle,
                                                                 &gl_profile_tab[PROFILE_A_APP_ID].descr_uuid,
                                                                ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, NULL, NULL);

可以产生client Characteristic  Configuration
UUID:0x2902.

但是我看到其他服务还有一个这样的描述,
characteristic User Description
UUid:0x2901

我尝试了很多次,将ESP_GATT_UUID_CHAR_CLIENT_CONFIG改为ESP_GATT_UUID_CHAR_DESCRIPTION,就可以出现characteristic User Description. 但是我不明白,怎么让这两个特征值描述符同时存在?能否举下例子。
                                                                                                                                                                                         

回帖(1)

刘敏

2024-6-22 15:35:28
创建Characteristic User Description(特性用户描述)是一个在蓝牙低功耗(BLE)设备中为特性(Characteristic)添加描述的过程。在这个例子中,我们将使用ESP32开发板和ESP-IDF框架。以下是创建Characteristic User Description的详细步骤:

1. 首先,确保您已经安装了ESP-IDF开发环境,并为您的项目设置了正确的路径。

2. 在您的项目中,找到或创建一个用于处理GATT服务的C文件,例如`gatt_service.c`。

3. 在`gatt_service.c`文件中,定义一个全局变量`gl_profile_tab`,用于存储服务、特性和描述符的句柄。例如:

```c
static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
    [PROFILE_A_APP_ID] = {
        .gatts = {
            .service_handle = 0,
            .char_handle = 0,
            .descr_handle = 0,
        },
    },
    // 其他配置...
};
```

4. 在`gatt_service.c`文件中,实现`esp_gatts_add_char_evt_handler`函数,用于处理`ESP_GATTS_ADD_CHAR_EVT`事件。在这个函数中,您可以使用以下代码来添加Characteristic User Description:

```c
static void esp_gatts_add_char_evt_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) {
    switch (event) {
        case ESP_GATTS_ADD_CHAR_EVT: {
            if (param->add_char.char_uuid.uuid.uuid16 == your_char_uuid) {
                gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len = ESP_UUID_LEN_16;
                gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_USER_DESC;
                esp_err_t add_descr_ret = esp_ble_gatts_add_char_descr(gl_profile_tab[PROFILE_A_APP_ID].service_handle,
                                                                        &gl_profile_tab[PROFILE_A_APP_ID].descr_uuid,
                                                                        ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE);
                if (add_descr_ret) {
                    ESP_LOGE(GATTS_TAG, "add char descr failed, error code = %x", add_descr_ret);
                }
            }
            break;
        }
        default:
            break;
    }
}
```

5. 在`gatt_service.c`文件中,实现`esp_ble_gatts_register_callback`函数,用于注册GATT服务的回调函数:

```c
void gatts_profile_init() {
    esp_err_t ret = esp_ble_gatts_register_callback(esp_gatts_add_char_evt_handler);
    if (ret) {
        ESP_LOGE(GATTS_TAG, "gatts register error, error code = %x", ret);
    }
    // 其他初始化代码...
}
```

6. 在您的主程序文件中(例如`main.c`),调用`gatts_profile_init()`函数以初始化GATT服务。

7. 编译并烧录您的程序到ESP32开发板。

8. 当您的设备接收到`ESP_GATTS_ADD_CHAR_EVT`事件时,它将自动添加Characteristic User Description。

请注意,您需要将`your_char_uuid`替换为您要添加描述的特性的UUID。此外,根据您的需求,您可能需要修改权限位(例如,ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE)以允许读取和写入描述符。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分