fix(control_plane): bound provisioning recovery and prevent reboot loops

This commit is contained in:
chenjintao
2026-10-23 15:37:59 +08:00
parent aede687dc9
commit 415c75b0e6
12 changed files with 947 additions and 57 deletions
+19 -2
View File
@@ -698,10 +698,27 @@ typedef enum {
DOMAIN_WIFI_PROVISIONING_STATUS_FAIL_CONNECT,
} domain_wifi_provisioning_status_t;
/** 启动固定 TalkingQ 小程序 BLE 配网协议。 / Start the TalkingQ BLE provisioning protocol. */
/* 配网启动结果由 domain 定义;控制层据此选择等待、退避或内存恢复,不能猜测错误码来源。 */
typedef enum {
DOMAIN_WIFI_PROVISIONING_START_READY = 0,
DOMAIN_WIFI_PROVISIONING_START_IDENTITY_REQUIRED,
DOMAIN_WIFI_PROVISIONING_START_INVALID_CONFIG,
DOMAIN_WIFI_PROVISIONING_START_NO_MEMORY,
DOMAIN_WIFI_PROVISIONING_START_TRANSIENT,
DOMAIN_WIFI_PROVISIONING_START_FAILED,
} domain_wifi_provisioning_start_status_t;
/** 只检查身份前置条件,无 BLE 初始化或资源停止副作用,可重复调用。 */
domain_wifi_provisioning_start_status_t domain_runtime_mini_program_provisioning_preflight(void);
/**
* 启动固定小程序 BLE 配网协议;out_status 必填,失败时返回明确原因。
* 同步完成启动,不在返回失败后后台重试;停止和释放仍使用下方有界 stop 接口。
*/
esp_err_t domain_runtime_mini_program_provisioning_start(
domain_wifi_provisioning_event_callback_t callback,
void *user_data);
void *user_data,
domain_wifi_provisioning_start_status_t *out_status);
esp_err_t domain_runtime_mini_program_provisioning_notify(
domain_wifi_provisioning_status_t status);
esp_err_t domain_runtime_mini_program_provisioning_stop(int timeout_ms);
@@ -340,10 +340,44 @@ static const char *domain_provisioning_status_text(
}
}
domain_wifi_provisioning_start_status_t domain_runtime_mini_program_provisioning_preflight(void)
{
char device_id[DOMAIN_PROVISIONING_ID_MAX_LEN] = {0};
char serial_number[DOMAIN_PROVISIONING_SERIAL_MAX_LEN] = {0};
domain_runtime_read_device_identity(device_id, sizeof(device_id),
serial_number, sizeof(serial_number));
return device_id[0] != '\0' && serial_number[0] != '\0'
? DOMAIN_WIFI_PROVISIONING_START_READY
: DOMAIN_WIFI_PROVISIONING_START_IDENTITY_REQUIRED;
}
static domain_wifi_provisioning_start_status_t domain_provisioning_classify_start_error(esp_err_t err)
{
switch (err) {
case ESP_OK:
return DOMAIN_WIFI_PROVISIONING_START_READY;
case ESP_ERR_NO_MEM:
return DOMAIN_WIFI_PROVISIONING_START_NO_MEMORY;
case ESP_ERR_TIMEOUT:
return DOMAIN_WIFI_PROVISIONING_START_TRANSIENT;
case ESP_ERR_INVALID_ARG:
case ESP_ERR_NOT_SUPPORTED:
return DOMAIN_WIFI_PROVISIONING_START_INVALID_CONFIG;
default:
/* 未知故障不假定可重试,更不能误判为身份缺失或内存耗尽。 */
return DOMAIN_WIFI_PROVISIONING_START_FAILED;
}
}
esp_err_t domain_runtime_mini_program_provisioning_start(
domain_wifi_provisioning_event_callback_t callback,
void *user_data)
void *user_data,
domain_wifi_provisioning_start_status_t *out_status)
{
if (out_status == NULL) {
return ESP_ERR_INVALID_ARG;
}
*out_status = DOMAIN_WIFI_PROVISIONING_START_INVALID_CONFIG;
if (callback == NULL) {
return ESP_ERR_INVALID_ARG;
}
@@ -356,6 +390,9 @@ esp_err_t domain_runtime_mini_program_provisioning_start(
device_info,
sizeof(device_info));
if (err != ESP_OK) {
*out_status = err == ESP_ERR_NOT_FOUND
? DOMAIN_WIFI_PROVISIONING_START_IDENTITY_REQUIRED
: domain_provisioning_classify_start_error(err);
return err;
}
@@ -378,6 +415,7 @@ esp_err_t domain_runtime_mini_program_provisioning_start(
};
err = platform_ble_gatt_server_start(&config);
if (err != ESP_OK) {
*out_status = domain_provisioning_classify_start_error(err);
portENTER_CRITICAL(&s_callback_lock);
s_event_callback = NULL;
s_event_user_data = NULL;
@@ -385,6 +423,7 @@ esp_err_t domain_runtime_mini_program_provisioning_start(
return err;
}
*out_status = DOMAIN_WIFI_PROVISIONING_START_READY;
ESP_LOGI(TAG, "Mini-program provisioning protocol ready");
return ESP_OK;
}