mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Merge branch 'connection_params' into integration
This commit is contained in:
		| @@ -11,7 +11,7 @@ ci: | |||||||
| repos: | repos: | ||||||
|   - repo: https://github.com/astral-sh/ruff-pre-commit |   - repo: https://github.com/astral-sh/ruff-pre-commit | ||||||
|     # Ruff version. |     # Ruff version. | ||||||
|     rev: v0.12.9 |     rev: v0.12.10 | ||||||
|     hooks: |     hooks: | ||||||
|       # Run the linter. |       # Run the linter. | ||||||
|       - id: ruff |       - id: ruff | ||||||
|   | |||||||
| @@ -7,17 +7,12 @@ | |||||||
|  |  | ||||||
| #include <esp_gap_ble_api.h> | #include <esp_gap_ble_api.h> | ||||||
| #include <esp_gatt_defs.h> | #include <esp_gatt_defs.h> | ||||||
|  | #include <esp_gattc_api.h> | ||||||
|  |  | ||||||
| namespace esphome::esp32_ble_client { | namespace esphome::esp32_ble_client { | ||||||
|  |  | ||||||
| static const char *const TAG = "esp32_ble_client"; | static const char *const TAG = "esp32_ble_client"; | ||||||
|  |  | ||||||
| // Default connection parameters matching ESP-IDF's BTM_BLE_CONN_INT_*_DEF |  | ||||||
| // These are conservative values that work well with most devices |  | ||||||
| static const uint16_t DEFAULT_MIN_CONN_INTERVAL = 0x0A;  // 10 * 1.25ms = 12.5ms |  | ||||||
| static const uint16_t DEFAULT_MAX_CONN_INTERVAL = 0x0C;  // 12 * 1.25ms = 15ms |  | ||||||
| static const uint16_t DEFAULT_CONN_TIMEOUT = 600;        // 600 * 10ms = 6s |  | ||||||
|  |  | ||||||
| // Intermediate connection parameters for standard operation | // Intermediate connection parameters for standard operation | ||||||
| // ESP-IDF defaults (12.5-15ms) are too slow for stable connections through WiFi-based BLE proxies, | // ESP-IDF defaults (12.5-15ms) are too slow for stable connections through WiFi-based BLE proxies, | ||||||
| // causing disconnections. These medium parameters balance responsiveness with bandwidth usage. | // causing disconnections. These medium parameters balance responsiveness with bandwidth usage. | ||||||
| @@ -117,19 +112,19 @@ void BLEClientBase::connect() { | |||||||
|            this->remote_addr_type_); |            this->remote_addr_type_); | ||||||
|   this->paired_ = false; |   this->paired_ = false; | ||||||
|  |  | ||||||
|   // Set default connection parameters before connecting |   // Determine connection parameters based on connection type | ||||||
|   // This ensures we use conservative parameters that work well with weak signal devices |   if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) { | ||||||
|   // rather than potentially aggressive parameters from a previous connection |     // V3 without cache needs fast params for service discovery | ||||||
|   this->set_default_conn_params_(); |     this->set_conn_params_(FAST_MIN_CONN_INTERVAL, FAST_MAX_CONN_INTERVAL, 0, FAST_CONN_TIMEOUT, "fast"); | ||||||
|  |   } else if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) { | ||||||
|   // Open the connection with default parameters |     // V3 with cache can use medium params | ||||||
|   auto ret = esp_ble_gattc_open(this->gattc_if_, this->remote_bda_, this->remote_addr_type_, true); |     this->set_conn_params_(MEDIUM_MIN_CONN_INTERVAL, MEDIUM_MAX_CONN_INTERVAL, 0, MEDIUM_CONN_TIMEOUT, "medium"); | ||||||
|   if (ret) { |  | ||||||
|     this->log_gattc_warning_("esp_ble_gattc_open", ret); |  | ||||||
|     this->set_state(espbt::ClientState::IDLE); |  | ||||||
|   } else { |  | ||||||
|     this->set_state(espbt::ClientState::CONNECTING); |  | ||||||
|   } |   } | ||||||
|  |   // For V1/Legacy, don't set params - use ESP-IDF defaults | ||||||
|  |  | ||||||
|  |   // Open the connection | ||||||
|  |   auto ret = esp_ble_gattc_open(this->gattc_if_, this->remote_bda_, this->remote_addr_type_, true); | ||||||
|  |   this->handle_connection_result_(ret); | ||||||
| } | } | ||||||
|  |  | ||||||
| esp_err_t BLEClientBase::pair() { return esp_ble_set_encryption(this->remote_bda_, ESP_BLE_SEC_ENCRYPT); } | esp_err_t BLEClientBase::pair() { return esp_ble_set_encryption(this->remote_bda_, ESP_BLE_SEC_ENCRYPT); } | ||||||
| @@ -213,6 +208,15 @@ void BLEClientBase::log_connection_params_(const char *param_type) { | |||||||
|   ESP_LOGD(TAG, "[%d] [%s] %s conn params", this->connection_index_, this->address_str_.c_str(), param_type); |   ESP_LOGD(TAG, "[%d] [%s] %s conn params", this->connection_index_, this->address_str_.c_str(), param_type); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void BLEClientBase::handle_connection_result_(esp_err_t ret) { | ||||||
|  |   if (ret) { | ||||||
|  |     this->log_gattc_warning_("esp_ble_gattc_open", ret); | ||||||
|  |     this->set_state(espbt::ClientState::IDLE); | ||||||
|  |   } else { | ||||||
|  |     this->set_state(espbt::ClientState::CONNECTING); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| void BLEClientBase::log_error_(const char *message) { | void BLEClientBase::log_error_(const char *message) { | ||||||
|   ESP_LOGE(TAG, "[%d] [%s] %s", this->connection_index_, this->address_str_.c_str(), message); |   ESP_LOGE(TAG, "[%d] [%s] %s", this->connection_index_, this->address_str_.c_str(), message); | ||||||
| } | } | ||||||
| @@ -251,24 +255,6 @@ void BLEClientBase::set_conn_params_(uint16_t min_interval, uint16_t max_interva | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void BLEClientBase::set_fast_conn_params_() { |  | ||||||
|   // Switch to fast connection parameters for service discovery |  | ||||||
|   // This improves discovery speed for devices with short timeouts |  | ||||||
|   this->update_conn_params_(FAST_MIN_CONN_INTERVAL, FAST_MAX_CONN_INTERVAL, 0, FAST_CONN_TIMEOUT, "fast"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void BLEClientBase::set_medium_conn_params_() { |  | ||||||
|   // Set medium connection parameters for balanced performance |  | ||||||
|   // This balances performance with bandwidth usage for normal operation |  | ||||||
|   this->update_conn_params_(MEDIUM_MIN_CONN_INTERVAL, MEDIUM_MAX_CONN_INTERVAL, 0, MEDIUM_CONN_TIMEOUT, "medium"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void BLEClientBase::set_default_conn_params_() { |  | ||||||
|   // Set default connection parameters before connecting |  | ||||||
|   // These conservative values work well with most devices including weak signal ones |  | ||||||
|   this->set_conn_params_(DEFAULT_MIN_CONN_INTERVAL, DEFAULT_MAX_CONN_INTERVAL, 0, DEFAULT_CONN_TIMEOUT, "default"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if, | bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if, | ||||||
|                                         esp_ble_gattc_cb_param_t *param) { |                                         esp_ble_gattc_cb_param_t *param) { | ||||||
|   if (event == ESP_GATTC_REG_EVT && this->app_id != param->reg.app_id) |   if (event == ESP_GATTC_REG_EVT && this->app_id != param->reg.app_id) | ||||||
| @@ -332,19 +318,13 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_ | |||||||
|       this->set_state(espbt::ClientState::CONNECTED); |       this->set_state(espbt::ClientState::CONNECTED); | ||||||
|       ESP_LOGI(TAG, "[%d] [%s] Connection open", this->connection_index_, this->address_str_.c_str()); |       ESP_LOGI(TAG, "[%d] [%s] Connection open", this->connection_index_, this->address_str_.c_str()); | ||||||
|       if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) { |       if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) { | ||||||
|         // Cached connections use medium connection parameters |         // Cached connections already connected with medium parameters, no update needed | ||||||
|         this->set_medium_conn_params_(); |  | ||||||
|         // only set our state, subclients might have more stuff to do yet. |         // only set our state, subclients might have more stuff to do yet. | ||||||
|         this->state_ = espbt::ClientState::ESTABLISHED; |         this->state_ = espbt::ClientState::ESTABLISHED; | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       // For V3_WITHOUT_CACHE, switch to fast params for service discovery |       // For V3_WITHOUT_CACHE, we already set fast params before connecting | ||||||
|       // Service discovery period is critical - we typically have only 10s to complete |       // No need to update them again here | ||||||
|       // discovery before the device disconnects us. Fast connection parameters are |  | ||||||
|       // essential to finish service resolution in time and avoid retry loops. |  | ||||||
|       else if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) { |  | ||||||
|         this->set_fast_conn_params_(); |  | ||||||
|       } |  | ||||||
|       this->log_event_("Searching for services"); |       this->log_event_("Searching for services"); | ||||||
|       esp_ble_gattc_search_service(esp_gattc_if, param->cfg_mtu.conn_id, nullptr); |       esp_ble_gattc_search_service(esp_gattc_if, param->cfg_mtu.conn_id, nullptr); | ||||||
|       break; |       break; | ||||||
| @@ -430,7 +410,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_ | |||||||
|       // For V3_WITHOUT_CACHE, switch back to medium connection parameters after service discovery |       // For V3_WITHOUT_CACHE, switch back to medium connection parameters after service discovery | ||||||
|       // This balances performance with bandwidth usage after the critical discovery phase |       // This balances performance with bandwidth usage after the critical discovery phase | ||||||
|       if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) { |       if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) { | ||||||
|         this->set_medium_conn_params_(); |         this->update_conn_params_(MEDIUM_MIN_CONN_INTERVAL, MEDIUM_MAX_CONN_INTERVAL, 0, MEDIUM_CONN_TIMEOUT, "medium"); | ||||||
|       } else if (this->connection_type_ != espbt::ConnectionType::V3_WITH_CACHE) { |       } else if (this->connection_type_ != espbt::ConnectionType::V3_WITH_CACHE) { | ||||||
| #ifdef USE_ESP32_BLE_DEVICE | #ifdef USE_ESP32_BLE_DEVICE | ||||||
|         for (auto &svc : this->services_) { |         for (auto &svc : this->services_) { | ||||||
|   | |||||||
| @@ -137,12 +137,10 @@ class BLEClientBase : public espbt::ESPBTClient, public Component { | |||||||
|                            const char *param_type); |                            const char *param_type); | ||||||
|   void set_conn_params_(uint16_t min_interval, uint16_t max_interval, uint16_t latency, uint16_t timeout, |   void set_conn_params_(uint16_t min_interval, uint16_t max_interval, uint16_t latency, uint16_t timeout, | ||||||
|                         const char *param_type); |                         const char *param_type); | ||||||
|   void set_fast_conn_params_(); |  | ||||||
|   void set_medium_conn_params_(); |  | ||||||
|   void set_default_conn_params_(); |  | ||||||
|   void log_gattc_warning_(const char *operation, esp_gatt_status_t status); |   void log_gattc_warning_(const char *operation, esp_gatt_status_t status); | ||||||
|   void log_gattc_warning_(const char *operation, esp_err_t err); |   void log_gattc_warning_(const char *operation, esp_err_t err); | ||||||
|   void log_connection_params_(const char *param_type); |   void log_connection_params_(const char *param_type); | ||||||
|  |   void handle_connection_result_(esp_err_t ret); | ||||||
|   // Compact error logging helpers to reduce flash usage |   // Compact error logging helpers to reduce flash usage | ||||||
|   void log_error_(const char *message); |   void log_error_(const char *message); | ||||||
|   void log_error_(const char *message, int code); |   void log_error_(const char *message, int code); | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| pylint==3.3.8 | pylint==3.3.8 | ||||||
| flake8==7.3.0  # also change in .pre-commit-config.yaml when updating | flake8==7.3.0  # also change in .pre-commit-config.yaml when updating | ||||||
| ruff==0.12.9  # also change in .pre-commit-config.yaml when updating | ruff==0.12.10  # also change in .pre-commit-config.yaml when updating | ||||||
| pyupgrade==3.20.0  # also change in .pre-commit-config.yaml when updating | pyupgrade==3.20.0  # also change in .pre-commit-config.yaml when updating | ||||||
| pre-commit | pre-commit | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user