ESP32从Arduino迁移至IDF:寻找对应BLE写特征值函数
Arduino转ESP-IDF:BLE特征值写入的对应实现
问题场景
原Arduino代码片段:
static BLEUUID charUUID_tx("0000ff02-0000-1000-8000-00805f9b34fb"); uint8_t reqBasicInfo[7] = {0xdd, 0xa5, 0x3, 0x0, 0xff, 0xfd, 0x77}; BLERemoteCharacteristic *pRemoteCharacteristicTX; pRemoteCharacteristicTX->writeValue(reqBasicInfo, sizeof(reqBasicInfo));
需要找到ESP-IDF中的对应实现,疑问点:是否使用esp_ble_gattc_write_char?句柄是否为0xff02?
解答
对应函数确认:是的,
esp_ble_gattc_write_char就是ESP-IDF中实现BLE客户端写入远程特征值的核心函数,对应Arduino的writeValue方法。句柄注意事项:不能直接使用0xff02作为句柄。BLE特征值的句柄是设备动态分配的,同一个UUID在不同设备或不同连接会话中对应的句柄可能不同,必须通过UUID搜索获取实际句柄,步骤如下:
- 发起服务/特征值搜索:调用
esp_ble_gattc_search_service,传入目标设备的连接ID和服务UUID(若已知),或直接搜索所有服务。 - 在GATTC回调中捕获特征值发现事件:触发
ESP_GATTC_CHAR_EVT时,遍历返回的特征值参数,对比UUID找到目标特征值,保存其handle字段。 - 使用获取到的句柄执行写入操作。
- 发起服务/特征值搜索:调用
示例代码
1. 回调中获取目标特征值句柄
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) { switch (event) { case ESP_GATTC_CHAR_EVT: { esp_gattc_char_evt_param_t *char_param = ¶m->char_char; // 目标UUID的小端序字节数组(对应0000ff02-0000-1000-8000-00805f9b34fb) const uint8_t target_uuid[16] = {0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x02, 0xff, 0x00, 0x00}; // 对比特征值UUID if (memcmp(char_param->char_val.uuid.uuid.uuid128, target_uuid, sizeof(target_uuid)) == 0) { // 保存目标特征值句柄 uint16_t tx_char_handle = char_param->char_val.handle; // 可触发写入操作,或全局存储句柄供后续调用 } break; } // 其他事件处理... } }
2. 执行写入操作
// 假设已获取到tx_char_handle、gattc_if、conn_id uint8_t reqBasicInfo[7] = {0xdd, 0xa5, 0x3, 0x0, 0xff, 0xfd, 0x77}; esp_err_t err = esp_ble_gattc_write_char( gattc_if, // GATTC接口句柄 conn_id, // 设备连接ID tx_char_handle, // 从回调中获取的特征值句柄 sizeof(reqBasicInfo), reqBasicInfo, ESP_GATT_WRITE_TYPE_NO_RSP // 无响应写入,对应Arduino默认行为;如需响应改用ESP_GATT_WRITE_TYPE_RSP ); if (err != ESP_OK) { // 处理写入失败逻辑 }
额外说明
- UUID字节序:ESP-IDF中UUID128采用小端序存储,需将标准UUID字符串按段倒序转换为字节数组。
- 写入类型:根据设备要求选择写入类型,无响应写入速度更快但无法确认送达,响应式写入会收到设备的确认回复。
内容的提问来源于stack exchange,提问作者RadioPutter
相关产品推荐
相关产品推荐

