mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Fix unexpected disconnects when outgoing buffer is full during keepalive (#5988)
This commit is contained in:
		| @@ -118,7 +118,9 @@ void APIConnection::loop() { | |||||||
|   this->list_entities_iterator_.advance(); |   this->list_entities_iterator_.advance(); | ||||||
|   this->initial_state_iterator_.advance(); |   this->initial_state_iterator_.advance(); | ||||||
|  |  | ||||||
|   const uint32_t keepalive = 60000; |   static uint32_t keepalive = 60000; | ||||||
|  |   static uint8_t max_ping_retries = 60; | ||||||
|  |   static uint16_t ping_retry_interval = 1000; | ||||||
|   const uint32_t now = millis(); |   const uint32_t now = millis(); | ||||||
|   if (this->sent_ping_) { |   if (this->sent_ping_) { | ||||||
|     // Disconnect if not responded within 2.5*keepalive |     // Disconnect if not responded within 2.5*keepalive | ||||||
| @@ -126,10 +128,24 @@ void APIConnection::loop() { | |||||||
|       on_fatal_error(); |       on_fatal_error(); | ||||||
|       ESP_LOGW(TAG, "%s didn't respond to ping request in time. Disconnecting...", this->client_combined_info_.c_str()); |       ESP_LOGW(TAG, "%s didn't respond to ping request in time. Disconnecting...", this->client_combined_info_.c_str()); | ||||||
|     } |     } | ||||||
|   } else if (now - this->last_traffic_ > keepalive) { |   } else if (now - this->last_traffic_ > keepalive && now > this->next_ping_retry_) { | ||||||
|     ESP_LOGVV(TAG, "Sending keepalive PING..."); |     ESP_LOGVV(TAG, "Sending keepalive PING..."); | ||||||
|     this->sent_ping_ = true; |     this->sent_ping_ = this->send_ping_request(PingRequest()); | ||||||
|     this->send_ping_request(PingRequest()); |     if (!this->sent_ping_) { | ||||||
|  |       this->next_ping_retry_ = now + ping_retry_interval; | ||||||
|  |       this->ping_retries_++; | ||||||
|  |       if (this->ping_retries_ >= max_ping_retries) { | ||||||
|  |         on_fatal_error(); | ||||||
|  |         ESP_LOGE(TAG, "%s: Sending keepalive failed %d time(s). Disconnecting...", this->client_combined_info_.c_str(), | ||||||
|  |                  this->ping_retries_); | ||||||
|  |       } else if (this->ping_retries_ >= 10) { | ||||||
|  |         ESP_LOGW(TAG, "%s: Sending keepalive failed %d time(s), will retry in %d ms", | ||||||
|  |                  this->client_combined_info_.c_str(), this->ping_retries_, ping_retry_interval); | ||||||
|  |       } else { | ||||||
|  |         ESP_LOGD(TAG, "%s: Sending keepalive failed %d time(s), will retry in %d ms", | ||||||
|  |                  this->client_combined_info_.c_str(), this->ping_retries_, ping_retry_interval); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| #ifdef USE_ESP32_CAMERA | #ifdef USE_ESP32_CAMERA | ||||||
|   | |||||||
| @@ -140,6 +140,7 @@ class APIConnection : public APIServerConnection { | |||||||
|   void on_disconnect_response(const DisconnectResponse &value) override; |   void on_disconnect_response(const DisconnectResponse &value) override; | ||||||
|   void on_ping_response(const PingResponse &value) override { |   void on_ping_response(const PingResponse &value) override { | ||||||
|     // we initiated ping |     // we initiated ping | ||||||
|  |     this->ping_retries_ = 0; | ||||||
|     this->sent_ping_ = false; |     this->sent_ping_ = false; | ||||||
|   } |   } | ||||||
|   void on_home_assistant_state_response(const HomeAssistantStateResponse &msg) override; |   void on_home_assistant_state_response(const HomeAssistantStateResponse &msg) override; | ||||||
| @@ -217,6 +218,8 @@ class APIConnection : public APIServerConnection { | |||||||
|   bool state_subscription_{false}; |   bool state_subscription_{false}; | ||||||
|   int log_subscription_{ESPHOME_LOG_LEVEL_NONE}; |   int log_subscription_{ESPHOME_LOG_LEVEL_NONE}; | ||||||
|   uint32_t last_traffic_; |   uint32_t last_traffic_; | ||||||
|  |   uint32_t next_ping_retry_{0}; | ||||||
|  |   uint8_t ping_retries_{0}; | ||||||
|   bool sent_ping_{false}; |   bool sent_ping_{false}; | ||||||
|   bool service_call_subscription_{false}; |   bool service_call_subscription_{false}; | ||||||
|   bool next_close_ = false; |   bool next_close_ = false; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user