ESP32 ble ESP_GATTS_CREAT_ATTR_TAB_EVT
时间: 2025-05-31 15:41:53 浏览: 17
### 关于ESP32 BLE 中 `ESP_GATTS_CREAT_ATTR_TAB_EVT` 的使用
在ESP32蓝牙低功耗(BLE)开发中,`ESP_GATTS_CREATE_ATTR_TAB_EVT` 是 GATT 服务器端的一个重要事件。该事件用于通知应用程序属性表创建的结果状态。当调用 `esp_ble_gatts_create_service()` 或者其他服务注册函数时,会触发此事件。
以下是有关如何处理这一事件的关键点:
#### 属性表的定义与初始化
为了成功响应 `ESP_GATTS_CREATE_ATTR_TAB_EVT` 事件,开发者需要先定义一个属性表数组。这个数组包含了所有的特征和服务描述符的信息。通常情况下,这些数据会被传递给 `esp_ble_gatts_add_char_descr()` 函数来完成具体的服务配置[^1]。
```c
static esp_attr_value_t gatt_db[GATTS_TABLE_SIZE];
```
在此基础上,通过设置 `gatt_db[]` 数组中的每一项参数,可以指定各个特性的权限、UUID 和初始值等内容[^2]。
#### 处理 `ESP_GATTS_CREATE_ATTR_TAB_EVT`
一旦接收到 `ESP_GATTS_CREATE_ATTR_TAB_EVT` 事件,则意味着之前请求创建的服务已经被分配了一个唯一的句柄号。此时应该保存返回的服务句柄以便后续操作使用。例如,在回调函数内部可能有如下逻辑实现:
```c
if (event == ESP_GATTS_CREATE_EVT) {
uint16_t handle_table[HDL_IDX_MAX];
memcpy(handle_table, param->create.evt_param.attr_tab_handle, sizeof(handle_table));
}
```
这里需要注意的是,实际应用过程中还需要考虑错误情况下的异常恢复机制等问题[^3]。
#### 示例代码片段
下面给出一段简单的示例程序展示如何利用上述原理构建基本GATT Server功能模块:
```c
#include "nvs_flash.h"
#include "esp_bt_device.h"
void app_main(void){
nvs_flash_init();
// 初始化经典蓝牙和LE模式下设备名称等相关配置...
esp_bluedroid_enable();
/* 创建并启动GAP/GATT server */
esp_err_t ret = esp_ble_gatts_app_register(PROFILE_APP_ID);
}
// 定义全局变量存储各阶段产生的handle值
uint16_t service_handle;
uint16_t char_handles[CHARACTERISTIC_COUNT];
void gatts_event_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_REG_EVT:{
...
break;}
case ESP_GATTS_READ_EVT:{...break;}
case ESP_GATTS_WRITE_EVT:{...break;}
case ESP_GATTS_CREATE_EVT:{
if(param->create.status != ESP_GATT_OK){
return ;
}
service_handle = param->create.service_id.is_primary ?
param->create.srvc_id.inst_id :0;
uint16_t attr_tab_size=sizeof(gatt_db)/sizeof(*gatt_db);
memcpy(char_handles,param->add_incl_svc.handle_list,sizeof(uint16_t)*attr_tab_size);
break;}}
}
```
以上仅为简化版框架示意,更多细节需参照官方文档进一步完善。
---
阅读全文
相关推荐



















