/* Simple HTTP Server Example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include #include #include #include #include #include #include #include "esp_netif.h" #include "protocol_examples_common.h" #include "protocol_examples_utils.h" #include "esp_tls_crypto.h" #include #include "esp_event.h" #include "esp_netif.h" #include "esp_tls.h" #include "esp_check.h" #include "driver/gpio.h" #if !CONFIG_IDF_TARGET_LINUX #include #include #include "nvs_flash.h" #include "esp_eth.h" #endif // !CONFIG_IDF_TARGET_LINUX #define EXAMPLE_HTTP_QUERY_KEY_MAX_LEN (64) // GPIO pin definition. Use menu config to choose GPIO #define GPIO_OUTPUT_IO_0 CONFIG_GPIO_OUTPUT_0 #define GPIO_OUTPUT_IO_1 CONFIG_GPIO_OUTPUT_1 #define GPIO_OUTPUT_PIN_SEL ((1ULL<content_len; 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; } bool set = false; if (buf[0] == '1') { status_one = true; set = true; } else if (buf[0] == '0') { status_one = false; set = true; }; if (set) { ESP_LOGI(TAG, "RECEIVED DATA"); gpio_set_level(GPIO_OUTPUT_IO_0, status_one); httpd_resp_send(req, NULL, 0); // TODO check simplification return ESP_OK; }; remaining -= ret; } // Return 400 if found no info for status httpd_resp_set_status(req, HTTPD_400); httpd_resp_send(req, NULL, 0); return ESP_OK; } static const httpd_uri_t post_one = { .uri = "/0", .method = HTTP_POST, .handler = post_one_handler, .user_ctx = NULL }; /* An HTTP POST handler */ static esp_err_t post_two_handler(httpd_req_t *req) { char buf[1]; int ret, remaining = req->content_len; 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; } bool set = false; if (buf[0] == '1') { status_two = true; set = true; } else if (buf[0] == '0') { status_two = false; set = true; }; if (set) { ESP_LOGI(TAG, "RECEIVED DATA"); gpio_set_level(GPIO_OUTPUT_IO_1, status_two); httpd_resp_send(req, NULL, 0); // TODO check simplification return ESP_OK; }; remaining -= ret; } // Return 400 if found no info for status httpd_resp_set_status(req, HTTPD_400); httpd_resp_send(req, NULL, 0); return ESP_OK; } static const httpd_uri_t post_two = { .uri = "/1", .method = HTTP_POST, .handler = post_two_handler, .user_ctx = NULL }; static httpd_handle_t start_webserver(void) { httpd_handle_t server = NULL; httpd_config_t config = HTTPD_DEFAULT_CONFIG(); config.lru_purge_enable = true; // Start the httpd server ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port); if (httpd_start(&server, &config) == ESP_OK) { // Set URI handlers ESP_LOGI(TAG, "Registering URI handlers"); httpd_register_uri_handler(server, &status); httpd_register_uri_handler(server, &post_one); httpd_register_uri_handler(server, &post_two); return server; } ESP_LOGI(TAG, "Error starting server!"); return NULL; } static esp_err_t stop_webserver(httpd_handle_t server) { // Stop the httpd server return httpd_stop(server); } static void disconnect_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { httpd_handle_t* server = (httpd_handle_t*) arg; if (*server) { ESP_LOGI(TAG, "Stopping webserver"); if (stop_webserver(*server) == ESP_OK) { *server = NULL; } else { ESP_LOGE(TAG, "Failed to stop http server"); } } } static void connect_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { httpd_handle_t* server = (httpd_handle_t*) arg; if (*server == NULL) { ESP_LOGI(TAG, "Starting webserver"); *server = start_webserver(); } } void app_main(void) { static httpd_handle_t server = NULL; ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); //zero-initialize the config structure. gpio_config_t io_conf = {}; //disable interrupt io_conf.intr_type = GPIO_INTR_DISABLE; //set as output mode io_conf.mode = GPIO_MODE_OUTPUT; //bit mask of the pins that you want to set,e.g.GPIO18/19 io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; //disable pull-down mode io_conf.pull_down_en = 0; //disable pull-up mode io_conf.pull_up_en = 0; //configure GPIO with the given settings gpio_config(&io_conf); gpio_set_level(GPIO_OUTPUT_IO_0, 0); gpio_set_level(GPIO_OUTPUT_IO_1, 0); printf("Minimum free heap size: %"PRIu32" bytes\n", esp_get_minimum_free_heap_size()); /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. * Read "Establishing Wi-Fi or Ethernet Connection" section in * examples/protocols/README.md for more information about this function. */ ESP_ERROR_CHECK(example_connect()); /* Register event handlers to stop the server when Wi-Fi or Ethernet is disconnected, * and re-start it upon connection. */ ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &connect_handler, &server)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &disconnect_handler, &server)); /* Start the server for the first time */ server = start_webserver(); while (server) { sleep(5); } }