struct gatts_write_evt_param { uint16_t conn_id; /*!< Connection id */ uint32_t trans_id; /*!< Transfer id */ esp_bd_addr_t bda; /*!< The bluetooth device address which been written */ uint16_t handle; /*!< The attribute handle */ uint16_t offset; /*!< Offset of the value, if the value is too long */ bool need_rsp; /*!< The write operation need to do response */ bool is_prep; /*!< This write operation is prepare write */ uint16_t len; /*!< The write attribute value length */ uint8_t *value; /*!< The write attribute value */ } write; /*!< Gatt server callback param of ESP_GATTS_WRITE_EVT */
时间: 2025-07-16 19:16:56 浏览: 3
<think>好的,我需要帮助用户了解ESP32 BLE GATTS中的gatts_write_evt_param结构体的定义和用途。首先,我应该回忆一下之前用户提供的引用内容,特别是关于GATT回调函数和相关结构体的信息。
根据引用[3],GATT回调函数的类型是esp_gatts_cb_t,参数包括事件类型、GATT接口和回调参数指针。用户提到的gatts_write_evt_param应该是在某个事件(比如写操作)触发时使用的参数结构体。我需要确定在ESP_GATTS_WRITE_EVT事件中,对应的参数结构体是否是gatts_write_evt_param。
接下来,引用[4]提到每个Profile的结构体包含处理事件的回调函数,因此当有写事件发生时,回调函数会接收到相应的事件参数。用户提供的引用中没有直接说明gatts_write_evt_param的结构,但可以参考已有的类似结构,如gatts_mtu_evt_param(引用[1]),它包含conn_id和mtu字段。
可能需要查找ESP32的官方文档或头文件来确认gatts_write_evt_param的具体定义。通常,这类结构体可能包含连接ID、属性句柄、数据长度、数据指针等信息。例如,当客户端写入某个特征值时,服务器会收到写事件,参数结构体应包含这些详细信息。
此外,引用[2]中提到了服务属性值的设置,这可能与写操作相关,比如写入特征值的数据。因此,gatts_write_evt_param可能需要包含被写入的特征的句柄、数据内容以及连接信息。
总结,gatts_write_evt_param结构体用于处理GATT服务器接收到的写请求事件,包含连接ID、属性句柄、数据长度和指针等成员,以便应用程序处理写入的数据。需要确保回答中正确引用用户提供的参考资料,并符合格式要求。</think>关于ESP32 BLE GATTS的`gatts_write_evt_param`结构体定义及用途说明如下:
### 结构体定义
根据ESP-IDF蓝牙协议栈的实现,`gatts_write_evt_param`结构体属于`esp_ble_gatts_cb_param_t`的联合体成员,其定义通常包含以下核心字段:
```c
struct gatts_write_evt_param {
uint16_t conn_id; // 客户端连接ID
uint16_t trans_id; // 事务ID
esp_bd_addr_t bda; // 客户端蓝牙地址
uint16_t handle; // 被写入的GATT属性句柄
uint16_t offset; // 写入值的偏移量
bool need_rsp; // 是否需要响应
bool is_prep; // 是否为长写入准备阶段
uint16_t len; // 写入数据长度
uint8_t *value; // 写入数据的指针
};
```
(该结构体定义可通过ESP-IDF头文件`esp_gatts_api.h`验证[^3])
### 核心用途
当GATT服务器接收到客户端发起的**写操作**时(例如特征值写入或描述符配置),系统会触发`ESP_GATTS_WRITE_EVT`事件。此时回调函数中`param`参数将指向`gatts_write_evt_param`结构体,开发者可通过其成员:
1. `handle`判断被写入的特征/描述符
2. `value`和`len`获取写入数据内容
3. `need_rsp`决定是否发送响应
4. `is_prep`处理长数据分片写入
### 典型应用场景
```c
void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) {
if (event == ESP_GATTS_WRITE_EVT) {
uint16_t char_handle = param->write.handle;
if (char_handle == my_char_handle) {
// 从value字段提取客户端写入的数据
uint8_t *received_data = param->write.value;
uint16_t data_length = param->write.len;
// 处理数据并决定是否发送响应
if (param->write.need_rsp) {
esp_ble_gatts_send_response(...);
}
}
}
}
```
[^4]
阅读全文
相关推荐
















