mirror of
https://github.com/esphome/esphome.git
synced 2024-11-23 07:28:10 +01:00
Fix unexpected disconnects when outgoing buffer is full during keepalive (#5988)
This commit is contained in:
parent
9b72a3a584
commit
f5c99d1647
2 changed files with 23 additions and 4 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue