wifi_prov_mgr: Add support for re-provisioning

Closes https://github.com/espressif/esp-idf/issues/5978
This commit is contained in:
Laukik Hase
2022-09-08 14:23:20 +05:30
parent 6a24f6393e
commit 9bc1cc706e
4 changed files with 100 additions and 5 deletions

View File

@@ -556,7 +556,8 @@ esp_err_t wifi_prov_mgr_reset_provisioning(void);
/**
* @brief Reset internal state machine and clear provisioned credentials.
*
* This API can be used to restart provisioning in case invalid credentials are entered.
* This API should be used to restart provisioning ONLY in the case
* of provisioning failures without rebooting the device.
*
* @return
* - ESP_OK : Reset provisioning state machine successfully
@@ -565,6 +566,23 @@ esp_err_t wifi_prov_mgr_reset_provisioning(void);
*/
esp_err_t wifi_prov_mgr_reset_sm_state_on_failure(void);
/**
* @brief Reset internal state machine and clear provisioned credentials.
*
* This API can be used to restart provisioning ONLY in case the device is
* to be provisioned again for new credentials after a previous successful
* provisioning without rebooting the device.
*
* @note This API can be used only if provisioning auto-stop has been
* disabled using wifi_prov_mgr_disable_auto_stop()
*
* @return
* - ESP_OK : Reset provisioning state machine successfully
* - ESP_FAIL : Failed to reset provisioning state machine
* - ESP_ERR_INVALID_STATE : Manager not initialized
*/
esp_err_t wifi_prov_mgr_reset_sm_state_for_reprovision(void);
#ifdef __cplusplus
}
#endif

View File

@@ -1617,3 +1617,52 @@ exit:
RELEASE_LOCK(prov_ctx_lock);
return err;
}
esp_err_t wifi_prov_mgr_reset_sm_state_for_reprovision(void)
{
if (!prov_ctx_lock) {
ESP_LOGE(TAG, "Provisioning manager not initialized");
return ESP_ERR_INVALID_STATE;
}
ACQUIRE_LOCK(prov_ctx_lock);
esp_err_t ret = ESP_OK;
wifi_config_t wifi_cfg_empty = {0};
uint8_t restore_wifi_flag = 0;
if (!prov_ctx->mgr_info.capabilities.no_auto_stop) {
ESP_LOGE(TAG, "Execute wifi_prov_mgr_disable_auto_stop() before calling this API");
ret = ESP_ERR_INVALID_STATE;
goto exit;
}
ret = esp_wifi_set_storage(WIFI_STORAGE_RAM);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to set Wi-Fi storage to RAM");
goto exit;
}
restore_wifi_flag |= WIFI_PROV_STORAGE_BIT;
ret = esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg_empty);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to set empty Wi-Fi credentials, 0x%x", ret);
goto exit;
}
ret = esp_wifi_disconnect();
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to disconnect wifi, 0x%x", ret);
goto exit;
}
prov_ctx->prov_state = WIFI_PROV_STATE_STARTED;
execute_event_cb(WIFI_PROV_START, NULL, 0);
exit:
if (restore_wifi_flag & WIFI_PROV_STORAGE_BIT) {
esp_wifi_set_storage(WIFI_STORAGE_FLASH);
}
RELEASE_LOCK(prov_ctx_lock);
return ret;
}