Merge branch 'feature/ws_client_ping_interval' into 'master'

websocket: Add configurable ping interval

Closes IDFGH-4582

See merge request espressif/esp-idf!12101
pull/7261/head
David Čermák 2021-02-04 21:07:41 +08:00
commit 6992084ca7
2 zmienionych plików z 10 dodań i 2 usunięć

Wyświetl plik

@ -37,7 +37,7 @@ static const char *TAG = "WEBSOCKET_CLIENT";
#define WEBSOCKET_TASK_PRIORITY (5) #define WEBSOCKET_TASK_PRIORITY (5)
#define WEBSOCKET_TASK_STACK (4*1024) #define WEBSOCKET_TASK_STACK (4*1024)
#define WEBSOCKET_NETWORK_TIMEOUT_MS (10*1000) #define WEBSOCKET_NETWORK_TIMEOUT_MS (10*1000)
#define WEBSOCKET_PING_TIMEOUT_MS (10*1000) #define WEBSOCKET_PING_INTERVAL_SEC (10)
#define WEBSOCKET_EVENT_QUEUE_SIZE (1) #define WEBSOCKET_EVENT_QUEUE_SIZE (1)
#define WEBSOCKET_PINGPONG_TIMEOUT_SEC (120) #define WEBSOCKET_PINGPONG_TIMEOUT_SEC (120)
#define WEBSOCKET_KEEP_ALIVE_IDLE (5) #define WEBSOCKET_KEEP_ALIVE_IDLE (5)
@ -85,6 +85,7 @@ typedef struct {
char *user_agent; char *user_agent;
char *headers; char *headers;
int pingpong_timeout_sec; int pingpong_timeout_sec;
size_t ping_interval_sec;
} websocket_config_storage_t; } websocket_config_storage_t;
typedef enum { typedef enum {
@ -243,6 +244,12 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c
cfg->pingpong_timeout_sec = WEBSOCKET_PINGPONG_TIMEOUT_SEC; cfg->pingpong_timeout_sec = WEBSOCKET_PINGPONG_TIMEOUT_SEC;
} }
if (config->ping_interval_sec == 0) {
cfg->ping_interval_sec = WEBSOCKET_PING_INTERVAL_SEC;
} else {
cfg->ping_interval_sec = config->ping_interval_sec;
}
return ESP_OK; return ESP_OK;
} }
@ -612,7 +619,7 @@ static void esp_websocket_client_task(void *pv)
case WEBSOCKET_STATE_CONNECTED: case WEBSOCKET_STATE_CONNECTED:
if ((CLOSE_FRAME_SENT_BIT & xEventGroupGetBits(client->status_bits)) == 0) { // only send and check for PING if ((CLOSE_FRAME_SENT_BIT & xEventGroupGetBits(client->status_bits)) == 0) { // only send and check for PING
// if closing hasn't been initiated // if closing hasn't been initiated
if (_tick_get_ms() - client->ping_tick_ms > WEBSOCKET_PING_TIMEOUT_MS) { if (_tick_get_ms() - client->ping_tick_ms > client->config->ping_interval_sec*1000) {
client->ping_tick_ms = _tick_get_ms(); client->ping_tick_ms = _tick_get_ms();
ESP_LOGD(TAG, "Sending PING..."); ESP_LOGD(TAG, "Sending PING...");
esp_transport_ws_send_raw(client->transport, WS_TRANSPORT_OPCODES_PING | WS_TRANSPORT_OPCODES_FIN, NULL, 0, client->config->network_timeout_ms); esp_transport_ws_send_raw(client->transport, WS_TRANSPORT_OPCODES_PING | WS_TRANSPORT_OPCODES_FIN, NULL, 0, client->config->network_timeout_ms);

Wyświetl plik

@ -99,6 +99,7 @@ typedef struct {
int keep_alive_idle; /*!< Keep-alive idle time. Default is 5 (second) */ int keep_alive_idle; /*!< Keep-alive idle time. Default is 5 (second) */
int keep_alive_interval; /*!< Keep-alive interval time. Default is 5 (second) */ int keep_alive_interval; /*!< Keep-alive interval time. Default is 5 (second) */
int keep_alive_count; /*!< Keep-alive packet retry send count. Default is 3 counts */ int keep_alive_count; /*!< Keep-alive packet retry send count. Default is 3 counts */
size_t ping_interval_sec; /*!< Websocket ping interval, defaults to 10 seconds if not set */
} esp_websocket_client_config_t; } esp_websocket_client_config_t;
/** /**