diff --git a/main/main.c b/main/main.c index 8a24be2..6654c9d 100644 --- a/main/main.c +++ b/main/main.c @@ -1,15 +1,28 @@ -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" -#include "esp_system.h" #include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" +#include "esp_system.h" #include "nvs_flash.h" +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "freertos/queue.h" + #include "driver/gpio.h" #include "driver/ledc.h" -#include + +#include +#include +#include + +#include + +#include "esp_netif.h" +#include "esp_eth.h" + #define WIFI_SSID "AndroidAP" #define WIFI_PASS "uyts6533" @@ -17,6 +30,7 @@ #define ESP_INTR_FLAG_DEFAULT 0 uint8_t led_state = 0; +void connect_to_wifi(char* new_ssid, char* new_psk); // Event group static EventGroupHandle_t wifi_event_group; @@ -40,7 +54,7 @@ ledc_channel_config_t ledc_channel = .timer_sel = LEDC_TIMER_1 }; -static char* resp_str ="\ +static char* website_lamp_str ="\ \ \ \ @@ -58,9 +72,57 @@ static char* resp_str ="\ \ "; +static char* website_wifi_str ="
\n\n\n\n\n\n\n\n\n\n
SSID:
PSK :
\n\n
"; + static esp_err_t default_get_handler(httpd_req_t *req) { - httpd_resp_send(req, resp_str, strlen(resp_str)); + httpd_resp_send(req, website_lamp_str, strlen(website_lamp_str)); + return ESP_OK; +} + +static esp_err_t web_wifi_get_handler(httpd_req_t *req) +{ + httpd_resp_send(req, website_wifi_str, strlen(website_wifi_str)); + return ESP_OK; +} + +static esp_err_t web_wifi_post_handler(httpd_req_t *req) +{ + char buf[256]; + int ret, remaining = req->content_len; + + char ssid[32]; + char psk[64]; + + while (remaining > 0) { + /* Read the data for the request */ + if ((ret = httpd_req_recv(req, buf, MIN(remaining, sizeof(buf)))) <= 0) { + if (ret == HTTPD_SOCK_ERR_TIMEOUT) { + /* Retry receiving if timeout occurred */ + continue; + } + return ESP_FAIL; + } + remaining -= ret; + + /* NULL terminal string */ + buf[ret] = 0; + + + char *string, *found; + string = strdup(buf); + while( (found = strsep(&string,"&")) != NULL ){ + if(strncmp(found, "SSID=", 5)==0){ + memcpy(ssid,&found[5],strlen(&found[5])+1); + } + if(strncmp(found, "PSK=", 4)==0){ + memcpy(psk,&found[4],strlen(&found[4])+1); + } + } + } + connect_to_wifi(ssid, psk); + + httpd_resp_send(req, website_wifi_str, strlen(website_wifi_str)); return ESP_OK; } @@ -70,6 +132,19 @@ static const httpd_uri_t default_uri = { .handler = &default_get_handler }; +static const httpd_uri_t web_wifi_uri = { + .uri = "/wifi", + .method = HTTP_GET, + .handler = &web_wifi_get_handler +}; + +static const httpd_uri_t web_wifi_post_uri = { + .uri = "/wifi", + .method = HTTP_POST, + .handler = &web_wifi_post_handler +}; + + static void IRAM_ATTR gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; @@ -113,12 +188,39 @@ static void gpio_task(void* arg) uint32_t io_num; for(;;) { if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { - printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num)); xTaskCreate(&button_debounce_task, "button_debounce_task", 2048, NULL, 10, NULL); } } } +void connect_to_wifi(char* new_ssid, char* new_psk){ + printf("ssid: \'%s\'\n", new_ssid); + printf("psk:\'%s\'\n", new_psk); + + ESP_ERROR_CHECK(esp_wifi_stop()); + + wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_config)); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // configure the wifi connection and start the interface + wifi_config_t wifi_config = { + .sta = { + .ssid = {*new_ssid}, + .password = {*new_psk} + } + }; + strcpy(&(wifi_config.sta.ssid), new_ssid); + strcpy(&(wifi_config.sta.password), new_psk); + + printf("ssid: \'%s\'\n", wifi_config.sta.ssid); + printf("psk: \'%s\'\n", wifi_config.sta.password); + + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); +} + // Wifi event handler static esp_err_t event_handler(void *ctx, system_event_t *event) { @@ -143,7 +245,6 @@ static esp_err_t event_handler(void *ctx, system_event_t *event) return ESP_OK; } - // Main application void app_main() { @@ -229,5 +330,7 @@ void app_main() if (httpd_start(&server, &config) == ESP_OK) { // Set URI handlers httpd_register_uri_handler(server, &default_uri); + httpd_register_uri_handler(server, &web_wifi_uri); + httpd_register_uri_handler(server, &web_wifi_post_uri); } }