fix(multimodal): reconnect websocket with fresh auth

This commit is contained in:
chenjintao
2026-08-12 10:30:47 +08:00
parent 7a4699ea68
commit 273550b28b
5 changed files with 31 additions and 3 deletions
@@ -547,11 +547,15 @@ static void control_plane_multimodal_event_bridge(control_plane_multimodal_event
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED:
control_plane_clear_cloud_chouqian_pending("transport disconnected");
control_plane_multimodal_stop_uplink();
ESP_LOGI(TAG, "Schedule fresh-auth reconnect after transport disconnect");
(void)control_plane_schedule_websocket_wait_task();
break;
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_ERROR:
control_plane_clear_cloud_chouqian_pending("transport error");
control_plane_multimodal_stop_uplink();
ESP_LOGI(TAG, "Schedule fresh-auth reconnect after transport error");
(void)control_plane_schedule_websocket_wait_task();
break;
case CONTROL_PLANE_MULTIMODAL_EVENT_TASK_FAILED:
@@ -462,10 +462,15 @@ void control_plane_multimodal_mark_transport_unavailable(
control_plane_multimodal_stop_uplink();
bool close_transport = reason == CONTROL_PLANE_TRANSPORT_LOSS_PROTOCOL_ERROR ||
reason == CONTROL_PLANE_TRANSPORT_LOSS_WS_ERROR ||
reason == CONTROL_PLANE_TRANSPORT_LOSS_WS_DISCONNECTED ||
reason == CONTROL_PLANE_TRANSPORT_LOSS_SEND_TEXT_FAILURE ||
reason == CONTROL_PLANE_TRANSPORT_LOSS_LISTENING_TIMEOUT ||
reason == CONTROL_PLANE_TRANSPORT_LOSS_NO_RESPONSE_TIMEOUT;
if (close_transport) {
ESP_LOGI(TAG,
"Retire unavailable transport: reason=%s; next start requires fresh auth",
transport_loss_reason_name(reason));
esp_err_t stop_err = domain_runtime_multimodal_transport_stop(0);
if (stop_err != ESP_OK) {
ESP_LOGW(TAG,
@@ -1547,7 +1547,12 @@ static void control_plane_wifi_state_task(void *arg)
if (ws_start_due &&
!control_plane_get_ptt_active() &&
!control_plane_multimodal_is_connected()) {
control_plane_try_start_multimodal_from_state_machine(&last_ws_start_attempt_tick, false);
bool ws_started = control_plane_try_start_multimodal_from_state_machine(
&last_ws_start_attempt_tick,
false);
if (!ws_started) {
(void)control_plane_schedule_websocket_wait_task();
}
now_tick = xTaskGetTickCount();
}
control_plane_drive_ptt_state_machine(&last_ws_start_attempt_tick);
@@ -754,8 +754,8 @@ static esp_err_t start_websocket_client_with_fallback(void)
.headers = s_headers,
.network_timeout_ms = CONFIG_MULTIMODAL_CONNECT_TIMEOUT_MS,
.reconnect_timeout_ms = CONFIG_MULTIMODAL_RECONNECT_DELAY_MS,
.disable_auto_reconnect = false,
.enable_close_reconnect = true,
.disable_auto_reconnect = true,
.enable_close_reconnect = false,
.task_stack = candidates[i],
.task_prio = CONFIG_MULTIMODAL_WEBSOCKET_TASK_PRIORITY,
.task_name = "multimodal_ws",