282 esp_ble_gattc_cb_param_t *param) {
283 if (event == ESP_GATTC_REG_EVT && this->
app_id != param->reg.app_id)
285 if (event != ESP_GATTC_REG_EVT && esp_gattc_if != ESP_GATT_IF_NONE && esp_gattc_if != this->
gattc_if_)
289 event, esp_gattc_if);
292 case ESP_GATTC_REG_EVT: {
293 if (param->reg.status == ESP_GATT_OK) {
298 this->
log_error_(
"gattc app registration failed status", param->reg.status);
299 this->
status_ = param->reg.status;
304 case ESP_GATTC_OPEN_EVT: {
305 if (!this->
check_addr(param->open.remote_bda))
314 if (this->
state() == espbt::ClientState::IDLE) {
315 ESP_LOGD(TAG,
"[%d] [%s] ESP_GATTC_OPEN_EVT in IDLE state (status=%d), ignoring", this->
connection_index_,
320 if (this->
state() != espbt::ClientState::CONNECTING) {
324 ESP_LOGE(TAG,
"[%d] [%s] ESP_GATTC_OPEN_EVT in %s state (status=%d)", this->
connection_index_,
327 if (param->open.status != ESP_GATT_OK && param->open.status != ESP_GATT_ALREADY_OPEN) {
342 this->
set_state(espbt::ClientState::CONNECTED);
353 esp_ble_gattc_search_service(esp_gattc_if, param->cfg_mtu.conn_id,
nullptr);
356 case ESP_GATTC_CONNECT_EVT: {
357 if (!this->
check_addr(param->connect.remote_bda))
360 this->
conn_id_ = param->connect.conn_id;
365 auto ret = esp_ble_gattc_send_mtu_req(this->
gattc_if_, param->connect.conn_id);
371 case ESP_GATTC_DISCONNECT_EVT: {
372 if (!this->
check_addr(param->disconnect.remote_bda))
375 if (param->disconnect.reason == ESP_GATT_CONN_TERMINATE_PEER_USER &&
376 this->state() == espbt::ClientState::CONNECTED) {
380 param->disconnect.reason);
385 if (this->
state() == espbt::ClientState::IDLE) {
386 this->
log_event_(
"DISCONNECT_EVT after CLOSE_EVT, already IDLE");
401 case ESP_GATTC_CFG_MTU_EVT: {
402 if (this->
conn_id_ != param->cfg_mtu.conn_id)
404 if (param->cfg_mtu.status != ESP_GATT_OK) {
406 param->cfg_mtu.mtu, param->cfg_mtu.status);
411 param->cfg_mtu.status, param->cfg_mtu.mtu);
412 this->
mtu_ = param->cfg_mtu.mtu;
415 case ESP_GATTC_CLOSE_EVT: {
416 if (this->
conn_id_ != param->close.conn_id)
423 case ESP_GATTC_SEARCH_RES_EVT: {
424 if (this->
conn_id_ != param->search_res.conn_id)
432#ifdef USE_ESP32_BLE_DEVICE
434 ble_service->
uuid = espbt::ESPBTUUID::from_uuid(param->search_res.srvc_id.uuid);
435 ble_service->
start_handle = param->search_res.start_handle;
436 ble_service->
end_handle = param->search_res.end_handle;
437 ble_service->
client =
this;
442 case ESP_GATTC_SEARCH_CMPL_EVT: {
443 if (this->
conn_id_ != param->search_cmpl.conn_id)
449 this->
update_conn_params_(MEDIUM_MIN_CONN_INTERVAL, MEDIUM_MAX_CONN_INTERVAL, 0, MEDIUM_CONN_TIMEOUT,
"medium");
450 }
else if (this->
connection_type_ != espbt::ConnectionType::V3_WITH_CACHE) {
451#ifdef USE_ESP32_BLE_DEVICE
452#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
454 char uuid_buf[espbt::UUID_STR_LEN];
455 svc->uuid.to_str(uuid_buf);
458 svc->start_handle, svc->end_handle);
467 case ESP_GATTC_READ_DESCR_EVT: {
468 if (this->
conn_id_ != param->write.conn_id)
473 case ESP_GATTC_WRITE_DESCR_EVT: {
474 if (this->
conn_id_ != param->write.conn_id)
479 case ESP_GATTC_WRITE_CHAR_EVT: {
480 if (this->
conn_id_ != param->write.conn_id)
485 case ESP_GATTC_READ_CHAR_EVT: {
486 if (this->
conn_id_ != param->read.conn_id)
491 case ESP_GATTC_NOTIFY_EVT: {
492 if (this->
conn_id_ != param->notify.conn_id)
497 case ESP_GATTC_REG_FOR_NOTIFY_EVT: {
505 esp_gattc_descr_elem_t desc_result;
507 esp_gatt_status_t descr_status = esp_ble_gattc_get_descr_by_char_handle(
508 this->
gattc_if_, this->
conn_id_, param->reg_for_notify.handle, NOTIFY_DESC_UUID, &desc_result, &count);
509 if (descr_status != ESP_GATT_OK) {
513 esp_gattc_char_elem_t char_result;
514 esp_gatt_status_t char_status =
515 esp_ble_gattc_get_all_char(this->
gattc_if_, this->
conn_id_, param->reg_for_notify.handle,
516 param->reg_for_notify.handle, &char_result, &count, 0);
517 if (char_status != ESP_GATT_OK) {
526 uint16_t notify_en = char_result.properties & ESP_GATT_CHAR_PROP_BIT_NOTIFY ? 1 : 2;
528 esp_ble_gattc_write_char_descr(this->
gattc_if_, this->
conn_id_, desc_result.handle,
sizeof(notify_en),
529 (uint8_t *) ¬ify_en, ESP_GATT_WRITE_TYPE_RSP, ESP_GATT_AUTH_REQ_NONE);
530 ESP_LOGV(TAG,
"Wrote notify descriptor %d, properties=%d", notify_en, char_result.properties);
537 case ESP_GATTC_UNREG_FOR_NOTIFY_EVT: {
558 case ESP_GAP_BLE_SEC_REQ_EVT:
559 if (!this->
check_addr(param->ble_security.auth_cmpl.bd_addr))
562 esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr,
true);
565 case ESP_GAP_BLE_AUTH_CMPL_EVT:
566 if (!this->
check_addr(param->ble_security.auth_cmpl.bd_addr))
568 char addr_str[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
571 if (!param->ble_security.auth_cmpl.success) {
572 this->
log_error_(
"auth fail reason", param->ble_security.auth_cmpl.fail_reason);
576 param->ble_security.auth_cmpl.addr_type, param->ble_security.auth_cmpl.auth_mode);