mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Avoid parsing characteristics and descriptors to reduce memory pressure (#4109)
This commit is contained in:
		| @@ -105,8 +105,6 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga | |||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|     case ESP_GATTC_UNREG_FOR_NOTIFY_EVT: { |     case ESP_GATTC_UNREG_FOR_NOTIFY_EVT: { | ||||||
|       if (this->get_characteristic(param->unreg_for_notify.handle) == nullptr)  // No conn_id in this event |  | ||||||
|         break; |  | ||||||
|       if (param->unreg_for_notify.status != ESP_GATT_OK) { |       if (param->unreg_for_notify.status != ESP_GATT_OK) { | ||||||
|         ESP_LOGW(TAG, "[%d] [%s] Error unregistering notifications for handle 0x%2X, status=%d", |         ESP_LOGW(TAG, "[%d] [%s] Error unregistering notifications for handle 0x%2X, status=%d", | ||||||
|                  this->connection_index_, this->address_str_.c_str(), param->unreg_for_notify.handle, |                  this->connection_index_, this->address_str_.c_str(), param->unreg_for_notify.handle, | ||||||
| @@ -122,8 +120,6 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga | |||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|     case ESP_GATTC_REG_FOR_NOTIFY_EVT: { |     case ESP_GATTC_REG_FOR_NOTIFY_EVT: { | ||||||
|       if (this->get_characteristic(param->reg_for_notify.handle) == nullptr)  // No conn_id in this event |  | ||||||
|         break; |  | ||||||
|       if (param->reg_for_notify.status != ESP_GATT_OK) { |       if (param->reg_for_notify.status != ESP_GATT_OK) { | ||||||
|         ESP_LOGW(TAG, "[%d] [%s] Error registering notifications for handle 0x%2X, status=%d", this->connection_index_, |         ESP_LOGW(TAG, "[%d] [%s] Error registering notifications for handle 0x%2X, status=%d", this->connection_index_, | ||||||
|                  this->address_str_.c_str(), param->reg_for_notify.handle, param->reg_for_notify.status); |                  this->address_str_.c_str(), param->reg_for_notify.handle, param->reg_for_notify.status); | ||||||
|   | |||||||
| @@ -9,6 +9,13 @@ namespace esphome { | |||||||
| namespace esp32_ble_client { | namespace esp32_ble_client { | ||||||
|  |  | ||||||
| static const char *const TAG = "esp32_ble_client"; | static const char *const TAG = "esp32_ble_client"; | ||||||
|  | static const esp_bt_uuid_t NOTIFY_DESC_UUID = { | ||||||
|  |     .len = ESP_UUID_LEN_16, | ||||||
|  |     .uuid = | ||||||
|  |         { | ||||||
|  |             .uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG, | ||||||
|  |         }, | ||||||
|  | }; | ||||||
|  |  | ||||||
| void BLEClientBase::setup() { | void BLEClientBase::setup() { | ||||||
|   static uint8_t connection_index = 0; |   static uint8_t connection_index = 0; | ||||||
| @@ -173,21 +180,33 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_ | |||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|     case ESP_GATTC_REG_FOR_NOTIFY_EVT: { |     case ESP_GATTC_REG_FOR_NOTIFY_EVT: { | ||||||
|       auto *descr = this->get_config_descriptor(param->reg_for_notify.handle); |       esp_gattc_descr_elem_t desc_result; | ||||||
|       if (descr->uuid.get_uuid().len != ESP_UUID_LEN_16 || |       uint16_t count = 1; | ||||||
|           descr->uuid.get_uuid().uuid.uuid16 != ESP_GATT_UUID_CHAR_CLIENT_CONFIG) { |       esp_gatt_status_t descr_status = | ||||||
|         ESP_LOGW(TAG, "[%d] [%s] Handle 0x%x (uuid %s) is not a client config char uuid", this->connection_index_, |           esp_ble_gattc_get_descr_by_char_handle(this->gattc_if_, this->connection_index_, param->reg_for_notify.handle, | ||||||
|                  this->address_str_.c_str(), param->reg_for_notify.handle, descr->uuid.to_string().c_str()); |                                                  NOTIFY_DESC_UUID, &desc_result, &count); | ||||||
|  |       if (descr_status != ESP_GATT_OK) { | ||||||
|  |         ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_get_descr_by_char_handle error, status=%d", this->connection_index_, | ||||||
|  |                  this->address_str_.c_str(), descr_status); | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|  |       esp_gattc_char_elem_t char_result; | ||||||
|  |       esp_gatt_status_t char_status = | ||||||
|  |           esp_ble_gattc_get_all_char(this->gattc_if_, this->connection_index_, param->reg_for_notify.handle, | ||||||
|  |                                      param->reg_for_notify.handle, &char_result, &count, 0); | ||||||
|  |       if (char_status != ESP_GATT_OK) { | ||||||
|  |         ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_get_all_char error, status=%d", this->connection_index_, | ||||||
|  |                  this->address_str_.c_str(), char_status); | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       /* |       /* | ||||||
|         1 = notify |         1 = notify | ||||||
|         2 = indicate |         2 = indicate | ||||||
|       */ |       */ | ||||||
|       uint16_t notify_en = descr->characteristic->properties & ESP_GATT_CHAR_PROP_BIT_NOTIFY ? 1 : 2; |       uint16_t notify_en = char_result.properties & ESP_GATT_CHAR_PROP_BIT_NOTIFY ? 1 : 2; | ||||||
|  |       esp_err_t status = | ||||||
|       auto status = |           esp_ble_gattc_write_char_descr(this->gattc_if_, this->conn_id_, desc_result.handle, sizeof(notify_en), | ||||||
|           esp_ble_gattc_write_char_descr(this->gattc_if_, this->conn_id_, descr->handle, sizeof(notify_en), |  | ||||||
|                                          (uint8_t *) ¬ify_en, ESP_GATT_WRITE_TYPE_RSP, ESP_GATT_AUTH_REQ_NONE); |                                          (uint8_t *) ¬ify_en, ESP_GATT_WRITE_TYPE_RSP, ESP_GATT_AUTH_REQ_NONE); | ||||||
|       if (status) { |       if (status) { | ||||||
|         ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_write_char_descr error, status=%d", this->connection_index_, |         ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_write_char_descr error, status=%d", this->connection_index_, | ||||||
| @@ -320,7 +339,7 @@ BLEDescriptor *BLEClientBase::get_config_descriptor(uint16_t handle) { | |||||||
|     if (!chr->parsed) |     if (!chr->parsed) | ||||||
|       chr->parse_descriptors(); |       chr->parse_descriptors(); | ||||||
|     for (auto &desc : chr->descriptors) { |     for (auto &desc : chr->descriptors) { | ||||||
|       if (desc->uuid.get_uuid().uuid.uuid16 == 0x2902) |       if (desc->uuid.get_uuid().uuid.uuid16 == ESP_GATT_UUID_CHAR_CLIENT_CONFIG) | ||||||
|         return desc; |         return desc; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user