fix(control_plane): bound provisioning recovery and prevent reboot loops
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user