diff --git a/main/main.c b/main/main.c index 7820f45..e163823 100644 --- a/main/main.c +++ b/main/main.c @@ -824,26 +824,64 @@ static esp_err_t parse_wifi_settings_json(const char *content, char *ssid, char return ESP_OK; } +bool test_wifi_credentials(const char* ssid, const char* password, int timeout_ms) { + wifi_config_t wifi_config = {0}; + strncpy((char*)wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid) - 1); + strncpy((char*)wifi_config.sta.password, password, sizeof(wifi_config.sta.password) - 1); + + esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + esp_wifi_start(); + + // Ожидание результата + EventBits_t bits = xEventGroupWaitBits(wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + timeout_ms / portTICK_PERIOD_MS); + + bool success = (bits & WIFI_CONNECTED_BIT) != 0; + + esp_wifi_stop(); + vEventGroupDelete(wifi_event_group); + + return success; +} + static esp_err_t setup_set_settings_handler(httpd_req_t *req) { char *content = NULL; + if (receive_http_content(req, &content) != ESP_OK) { + httpd_resp_set_type(req, "application/json"); + httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "{\"message\": \"failed to receive content\"}"); return ESP_FAIL; } char ssid[WIFI_SSID_MAX_LEN]; char password[WIFI_PASS_MAX_LEN]; + if (parse_wifi_settings_json(content, ssid, password) != ESP_OK) { free(content); - httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Missing or invalid 'ssid' or 'password' parameters"); + httpd_resp_set_type(req, "application/json"); + httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "{\"status\":\"error\",\"message\":\"Missing or invalid 'ssid' or 'password' parameters\"}"); return ESP_FAIL; } free(content); - send_json_response(req, "{\"success\":true}"); - save_wifi_config(ssid, password); - vTaskDelay(pdMS_TO_TICKS(1000)); - esp_restart(); - return ESP_OK; + ESP_LOGI(TAG, "Testing WiFi connection to SSID: %s", ssid); + bool wifi_ok = test_wifi_credentials(ssid, password, 10000); + + if (wifi_ok) { + save_wifi_config(ssid, password); + + send_json_response(req, "{\"success\":true,\"error\":\"Wi-Fi connected successfully. Rebooting...\"}"); + + vTaskDelay(pdMS_TO_TICKS(1000)); + esp_restart(); + } else { + send_json_response(req, "{\"success\":false,\"error\":\"Failed to connect to WiFi mode\"}"); + } + + return wifi_ok ? ESP_OK : ESP_FAIL; }