example of HTTP server in AP mode?
-
- Posts: 4
- Joined: Sat Mar 21, 2020 8:21 am
Re: example of HTTP server in AP mode?
Please guide me.
(https://docs.espressif.com/projects/esp-idf/en/latest
IDF branch master
Development Kit: ESP32-DevKitC
Module or chip used: ESP32-WROOM-32
Build System: Make
Compiler version (run xtensa-esp32-elf-gcc --version to find it):
Operating System: Windows.
(Windows only) environment type: MSYS2 mingw32
Power Supply: USB
I have to do same things.
I have to take SSID and PWD from the mobile app in AP mode.
I used code that provided in the last.
I want to send Access-Control-Allow-Origin: * in header response.
but going like this Custom-Header-2: Access-Control-Allow-Origin: *
also, I want to send the response {"m":"3C:71:BF:4C:A9:E5"} but nothing got it
I changed it in code
static const httpd_uri_t hello = {
.uri = "/23",
.method = HTTP_GET,
.handler = hello_get_handler,
.user_ctx = "{\"m\":\"3C:71:BF:4C:A9:E5\"}"
};
(https://docs.espressif.com/projects/esp-idf/en/latest
IDF branch master
Development Kit: ESP32-DevKitC
Module or chip used: ESP32-WROOM-32
Build System: Make
Compiler version (run xtensa-esp32-elf-gcc --version to find it):
Operating System: Windows.
(Windows only) environment type: MSYS2 mingw32
Power Supply: USB
I have to do same things.
I have to take SSID and PWD from the mobile app in AP mode.
I used code that provided in the last.
I want to send Access-Control-Allow-Origin: * in header response.
but going like this Custom-Header-2: Access-Control-Allow-Origin: *
also, I want to send the response {"m":"3C:71:BF:4C:A9:E5"} but nothing got it
I changed it in code
static const httpd_uri_t hello = {
.uri = "/23",
.method = HTTP_GET,
.handler = hello_get_handler,
.user_ctx = "{\"m\":\"3C:71:BF:4C:A9:E5\"}"
};
-
- Posts: 1
- Joined: Wed May 06, 2020 12:20 pm
Re: example of HTTP server in AP mode?
**** Is it working. Because I am getting error by httpd_start(&server, &config) everytime I connect to Access pointPalonso wrote: ↑Mon Dec 02, 2019 11:08 pmThanks, it did.stock86c wrote: ↑Fri Sep 13, 2019 1:28 amhi
cant share the code, so i will just explain the concepts to get it to work. Literally just slapped these two examples together.
https://github.com/espressif/esp-idf/tr ... ted/softAP
https://github.com/espressif/esp-idf/tr ... ver/simple
as for the "ESP_ERROR_CHECK(example_connect());" in the main of simple httpserver, just replace this example_connect with the init_softAP function from the softAP example. Some points to note:
1.Try to put all the functions in one page. somehow the definitions in different pages seem to cause issues.
2. Use the default settings, the ssid and passwd. Dont do fancy stuffs yet.
3. after combining and compiling, try to solve the errors one by one.
hope it helps.
Here I'm leaving the example code I managed to make. Altough, I encourage everybody to follow the steps stock86c mentioned to truly understand the code (maybe you might end on a better code).
A small detail, I commented some functions of the example codes told just to avoid warnings so this code might fail in certain conditions. Anyway they are still (commented) on the code, uncomment them if you have to.Code: Select all
#include <esp_wifi.h> #include <esp_event.h> #include <esp_log.h> #include <esp_system.h> #include <nvs_flash.h> #include <sys/param.h> #include "nvs_flash.h" //#include "tcpip_adapter.h" #include "esp_netif.h" #include "esp_eth.h" //#include "protocol_examples_common.h" #include <esp_http_server.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" #include "nvs_flash.h" #include "lwip/err.h" #include "lwip/sys.h" /* The examples use WiFi configuration that you can set via project configuration menu. If you'd rather not, just change the below entries to strings with the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" */ #define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD #define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN /* A simple example that demonstrates how to create GET and POST * handlers for the web server. */ static const char *TAG = "wifi_AP_WEBserver"; //------------------------------------------------------------------------------ /* An HTTP GET handler */ static esp_err_t hello_get_handler(httpd_req_t *req) { char* buf; size_t buf_len; /* Get header value string length and allocate memory for length + 1, * extra byte for null termination */ buf_len = httpd_req_get_hdr_value_len(req, "Host") + 1; if (buf_len > 1) { buf = malloc(buf_len); /* Copy null terminated value string into buffer */ if (httpd_req_get_hdr_value_str(req, "Host", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Host: %s", buf); } free(buf); } buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-2") + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_hdr_value_str(req, "Test-Header-2", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Test-Header-2: %s", buf); } free(buf); } buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-1") + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_hdr_value_str(req, "Test-Header-1", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Test-Header-1: %s", buf); } free(buf); } /* Read URL query string length and allocate memory for length + 1, * extra byte for null termination */ buf_len = httpd_req_get_url_query_len(req) + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found URL query => %s", buf); char param[32]; /* Get value of expected key from query string */ if (httpd_query_key_value(buf, "query1", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query1=%s", param); } if (httpd_query_key_value(buf, "query3", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query3=%s", param); } if (httpd_query_key_value(buf, "query2", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query2=%s", param); } } free(buf); } /* Set some custom headers */ httpd_resp_set_hdr(req, "Custom-Header-1", "Custom-Value-1"); httpd_resp_set_hdr(req, "Custom-Header-2", "Custom-Value-2"); /* Send response with custom headers and body set as the * string passed in user context*/ const char* resp_str = (const char*) req->user_ctx; httpd_resp_send(req, resp_str, strlen(resp_str)); /* After sending the HTTP response the old HTTP request * headers are lost. Check if HTTP request headers can be read now. */ if (httpd_req_get_hdr_value_len(req, "Host") == 0) { ESP_LOGI(TAG, "Request headers lost"); } return ESP_OK; } static const httpd_uri_t hello = { .uri = "/hello", .method = HTTP_GET, .handler = hello_get_handler, /* Let's pass response string in user * context to demonstrate it's usage */ .user_ctx = "Hello World!" }; /* An HTTP POST handler */ static esp_err_t echo_post_handler(httpd_req_t *req) { char buf[100]; 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; } /* Send back the same data */ httpd_resp_send_chunk(req, buf, ret); remaining -= ret; /* Log data received */ ESP_LOGI(TAG, "=========== RECEIVED DATA =========="); ESP_LOGI(TAG, "%.*s", ret, buf); ESP_LOGI(TAG, "===================================="); } // End response httpd_resp_send_chunk(req, NULL, 0); return ESP_OK; } static const httpd_uri_t echo = { .uri = "/echo", .method = HTTP_POST, .handler = echo_post_handler, .user_ctx = NULL }; /* This handler allows the custom error handling functionality to be * tested from client side. For that, when a PUT request 0 is sent to * URI /ctrl, the /hello and /echo URIs are unregistered and following * custom error handler http_404_error_handler() is registered. * Afterwards, when /hello or /echo is requested, this custom error * handler is invoked which, after sending an error message to client, * either closes the underlying socket (when requested URI is /echo) * or keeps it open (when requested URI is /hello). This allows the * client to infer if the custom error handler is functioning as expected * by observing the socket state. */ esp_err_t http_404_error_handler(httpd_req_t *req, httpd_err_code_t err) { if (strcmp("/hello", req->uri) == 0) { httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/hello URI is not available"); /* Return ESP_OK to keep underlying socket open */ return ESP_OK; } else if (strcmp("/echo", req->uri) == 0) { httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/echo URI is not available"); /* Return ESP_FAIL to close underlying socket */ return ESP_FAIL; } /* For any other URI send 404 and close socket */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "Some 404 error message"); return ESP_FAIL; } /* An HTTP PUT handler. This demonstrates realtime * registration and deregistration of URI handlers */ static esp_err_t ctrl_put_handler(httpd_req_t *req) { char buf; int ret; if ((ret = httpd_req_recv(req, &buf, 1)) <= 0) { if (ret == HTTPD_SOCK_ERR_TIMEOUT) { httpd_resp_send_408(req); } return ESP_FAIL; } if (buf == '0') { /* URI handlers can be unregistered using the uri string */ ESP_LOGI(TAG, "Unregistering /hello and /echo URIs"); httpd_unregister_uri(req->handle, "/hello"); httpd_unregister_uri(req->handle, "/echo"); /* Register the custom error handler */ httpd_register_err_handler(req->handle, HTTPD_404_NOT_FOUND, http_404_error_handler); } else { ESP_LOGI(TAG, "Registering /hello and /echo URIs"); httpd_register_uri_handler(req->handle, &hello); httpd_register_uri_handler(req->handle, &echo); /* Unregister custom error handler */ httpd_register_err_handler(req->handle, HTTPD_404_NOT_FOUND, NULL); } /* Respond with empty body */ httpd_resp_send(req, NULL, 0); return ESP_OK; } static const httpd_uri_t ctrl = { .uri = "/ctrl", .method = HTTP_PUT, .handler = ctrl_put_handler, .user_ctx = NULL }; static httpd_handle_t start_webserver(void) { httpd_handle_t server = NULL; httpd_config_t config = HTTPD_DEFAULT_CONFIG(); // 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, &hello); httpd_register_uri_handler(server, &echo); httpd_register_uri_handler(server, &ctrl); return server; } ESP_LOGI(TAG, "Error starting server!"); return NULL; } /* static void stop_webserver(httpd_handle_t server) { // Stop the httpd server 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"); stop_webserver(*server); *server = NULL; } } */ /* 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(); } } */ //------------------------------------------------------------------------------ static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_id == WIFI_EVENT_AP_STACONNECTED) { wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data; ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid); } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) { wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data; ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d", MAC2STR(event->mac), event->aid); } } esp_err_t wifi_init_softap(void) { //esp_netif_init(); //ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_create_default_wifi_ap(); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL)); wifi_config_t wifi_config = { .ap = { .ssid = EXAMPLE_ESP_WIFI_SSID, .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID), .password = EXAMPLE_ESP_WIFI_PASS, .max_connection = EXAMPLE_MAX_STA_CONN, .authmode = WIFI_AUTH_WPA_WPA2_PSK }, }; if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) { wifi_config.ap.authmode = WIFI_AUTH_OPEN; } ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); return ESP_OK; } //------------------------------------------------------------------------------ void app_main(void) { httpd_handle_t server = NULL; ESP_LOGI(TAG, "NVS init"); ESP_ERROR_CHECK(nvs_flash_init()); //tcpip_adapter_init(); esp_netif_init(); ESP_LOGI(TAG, "Eventloop create"); ESP_ERROR_CHECK(esp_event_loop_create_default()); /* 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()); ESP_LOGI(TAG, "init softAP"); ESP_ERROR_CHECK(wifi_init_softap()); /* Register event handlers to stop the server when Wi-Fi or Ethernet is disconnected, * and re-start it upon connection. */ #ifdef CONFIG_EXAMPLE_CONNECT_WIFI 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)); #endif // CONFIG_EXAMPLE_CONNECT_WIFI #ifdef CONFIG_EXAMPLE_CONNECT_ETHERNET ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &connect_handler, &server)); ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ETHERNET_EVENT_DISCONNECTED, &disconnect_handler, &server)); #endif // CONFIG_EXAMPLE_CONNECT_ETHERNET /* Start the server for the first time */ server = start_webserver(); }
Also, this code was compiled over the latest version, using the esp_netif library, so make sure to "update" your IDF or uncomment the tcpip_adapter library and fix what's necessary.
Re: example of HTTP server in AP mode?
I didn't get exactly what you mean here, BUT by checking my posted code I found this:VarunSavita wrote: ↑Tue Mar 31, 2020 6:54 amwant to send Access-Control-Allow-Origin: * in header response.
but going like this Custom-Header-2: Access-Control-Allow-Origin: *
Code: Select all
/* Set some custom headers */
httpd_resp_set_hdr(req, "Custom-Header-1", "Custom-Value-1");
httpd_resp_set_hdr(req, "Custom-Header-2", "Custom-Value-2");
/* Send response with custom headers and body set as the
* string passed in user context*/
const char* resp_str = (const char*) req->user_ctx;
httpd_resp_send(req, resp_str, strlen(resp_str));
check the code on the function "hello_get_handler" from the example. In some point it send the data stored in the user_ctx, so you should add that to your code.VarunSavita wrote: ↑Tue Mar 31, 2020 6:54 amalso, I want to send the response {"m":"3C:71:BF:4C:A9:E5"} but nothing got it
I changed it in code
static const httpd_uri_t hello = {
.uri = "/23",
.method = HTTP_GET,
.handler = hello_get_handler,
.user_ctx = "{\"m\":\"3C:71:BF:4C:A9:E5\"}"
};
is this a question? or you are seconding what I posted?नवव्यवहारस्थापनं wrote: ↑Fri May 08, 2020 2:50 am**** Is it working. Because I am getting error by httpd_start(&server, &config) everytime I connect to Access point
-
- Posts: 126
- Joined: Tue May 17, 2016 8:12 pm
Re: example of HTTP server in AP mode?
Hi @marchingband.
Instead of writing all the details of a real example, not just a Hello World or echo one, the code attached is a good example.
It will serve html files, the icons associated it as well as the css file. Cache control is important to minimize the ESP32 effort (sendUtils routine show how and how to serve a icon/binary stuff).
To respond with data I use the same HTML template as a format string for sprintf (see attached image fo HTML template and when sent to browser). In this case I have a generic function that does the same, check sendHtml(). See example below
Must not include in the HTML section % since the sprintf could go bananas looking for a format instruction and crash. Put it in the css file.
I presume a connection to the ESP32 comes from a cell phone and hence NO connection to the Internet itself. That is, to connect to the ESP32 you must choose the AP of the ESP32 and therefore no access to the Internet. This means jquery cannot be downloaded and used. U could do this if u connect to the STA whose access point is connected to the Internet. But I presume no Internet and hence everything is HTML, css, javascritp at most. JQuery is javascript scripts so u could copy code and paste it in the <script> section of the header.
start_webser() is a task to set stack size, uris # and uris actions, Standard.
webserver.cpp.zip is the code itself
htmlstuff has the Status Html page and the css file (from the example above).
You must configur the component.mk to include the HTML pages, css and icons and also certs if used.
Example:
ICons and anything binary has to be in the EMBED_FILES,
Wifi is set as STA and AP, but I use the AP because that way I dont have to do nothing special to expose the IP being served.
Not using the HTML authorization basic or digest cause its weak even in HTTPS.
Not using standard convention of GET-POST-GET. Will do that later.
Enjoy
Instead of writing all the details of a real example, not just a Hello World or echo one, the code attached is a good example.
It will serve html files, the icons associated it as well as the css file. Cache control is important to minimize the ESP32 effort (sendUtils routine show how and how to serve a icon/binary stuff).
To respond with data I use the same HTML template as a format string for sprintf (see attached image fo HTML template and when sent to browser).
Code: Select all
sprintf(tempb,(char*)final_start,"nak","Invalid Control Sequence or Session Expired");
httpd_resp_send(req,(const char*)tempb, strlen(tempb));
Must not include in the HTML section % since the sprintf could go bananas looking for a format instruction and crash. Put it in the css file.
I presume a connection to the ESP32 comes from a cell phone and hence NO connection to the Internet itself. That is, to connect to the ESP32 you must choose the AP of the ESP32 and therefore no access to the Internet. This means jquery cannot be downloaded and used. U could do this if u connect to the STA whose access point is connected to the Internet. But I presume no Internet and hence everything is HTML, css, javascritp at most. JQuery is javascript scripts so u could copy code and paste it in the <script> section of the header.
start_webser() is a task to set stack size, uris # and uris actions, Standard.
webserver.cpp.zip is the code itself
htmlstuff has the Status Html page and the css file (from the example above).
You must configur the component.mk to include the HTML pages, css and icons and also certs if used.
Example:
Code: Select all
COMPONENT_EMBED_FILES= HTML/ok.png HTML/nak.png HTML/meter.png HTML/favicon.ico
COMPONENT_EMBED_TXTFILES= HTML/styles.css HTML/connStats.html HTML/menu.html HTML/connStatus.html HTML/challenge.html HTML/connSetup.html HTML/login.html HTML/ok.html
COMPONENT_EMBED_TXTFILES += certs/cacert.pem certs/wprvtkey.pem certs/public.pem certs/prvtkey.pem
Wifi is set as STA and AP, but I use the AP because that way I dont have to do nothing special to expose the IP being served.
Not using the HTML authorization basic or digest cause its weak even in HTTPS.
Not using standard convention of GET-POST-GET. Will do that later.
Enjoy
- Attachments
-
- HTML.png (96.98 KiB) Viewed 14656 times
-
- webserver.cpp.zip
- (6.77 KiB) Downloaded 675 times
Re: example of HTTP server in AP mode?
I wish I'd read the full post instead of just getting to the first example... I made this instead, but to readers there is probably a better example at the end of the first page...
and I used the following to update the old code:
https://esp32.com/viewtopic.php?f=2&t=13205
Code: Select all
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_system.h"
#include "esp_event.h"
//#include "esp_event_loop.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_http_server.h"
#define SOFT_AP_SSID "ESP32 SoftAP"
#define SOFT_AP_PASSWORD "Password"
#define SOFT_AP_IP_ADDRESS_1 192
#define SOFT_AP_IP_ADDRESS_2 168
#define SOFT_AP_IP_ADDRESS_3 5
#define SOFT_AP_IP_ADDRESS_4 18
#define SOFT_AP_GW_ADDRESS_1 192
#define SOFT_AP_GW_ADDRESS_2 168
#define SOFT_AP_GW_ADDRESS_3 5
#define SOFT_AP_GW_ADDRESS_4 20
#define SOFT_AP_NM_ADDRESS_1 255
#define SOFT_AP_NM_ADDRESS_2 255
#define SOFT_AP_NM_ADDRESS_3 255
#define SOFT_AP_NM_ADDRESS_4 0
#define SERVER_PORT 3500
#define HTTP_METHOD HTTP_GET //HTTP_POST
#define URI_STRING "/test"
// https://esp32.com/viewtopic.php?t=9687
// https://esp32.com/viewtopic.php?f=2&t=13205
// esp netif object representing the WIFI station
//esp_netif_t *sta_netif = NULL;
esp_netif_t *ap_netif = NULL;
static httpd_handle_t httpServerInstance = NULL;
static esp_err_t methodHandler(httpd_req_t* httpRequest){
//ESP_LOGI("HANDLER","This is the handler for the <%s> URI", httpRequest->uri);
const char* resp_str = "My Test Page";
httpd_resp_send(httpRequest, resp_str, strlen(resp_str));
return ESP_OK;
}
static httpd_uri_t testUri = {
.uri = URI_STRING,
.method = HTTP_METHOD,
.handler = methodHandler,
.user_ctx = NULL,
};
static void startHttpServer(void){
httpd_config_t httpServerConfiguration = HTTPD_DEFAULT_CONFIG();
httpServerConfiguration.server_port = SERVER_PORT;
if(httpd_start(&httpServerInstance, &httpServerConfiguration) == ESP_OK){
ESP_ERROR_CHECK(httpd_register_uri_handler(httpServerInstance, &testUri));
}
}
static void stopHttpServer(void){
if(httpServerInstance != NULL){
ESP_ERROR_CHECK(httpd_stop(httpServerInstance));
}
}
static void wifiEventHandler(void* arg, esp_event_base_t event, int32_t event_id, void* event_data)
//static esp_err_t wifiEventHandler(void* userParameter, system_event_t *event)
{
//switch(event->event_id){
switch(event_id){
//case SYSTEM_EVENT_AP_STACONNECTED:
case WIFI_EVENT_AP_STACONNECTED:
startHttpServer();
break;
//case SYSTEM_EVENT_AP_STADISCONNECTED:
case WIFI_EVENT_AP_STADISCONNECTED:
stopHttpServer();
break;
default:
break;
}
//return ESP_OK;
}
static void launchSoftAp(){
//tcpip_adapter_init();
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
//sta_netif = esp_netif_create_default_wifi_sta();
//assert( sta_netif );
ap_netif = esp_netif_create_default_wifi_ap();
assert( ap_netif );
//ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP));
//ESP_ERROR_CHECK(tcpip_adapter_dhcps_stop(ap_netif));
ESP_ERROR_CHECK(esp_netif_dhcps_stop(ap_netif));
//tcpip_adapter_ip_info_t ipAddressInfo;
esp_netif_ip_info_t ipAddressInfo;
memset(&ipAddressInfo, 0, sizeof(ipAddressInfo));
IP4_ADDR(
&ipAddressInfo.ip,
SOFT_AP_IP_ADDRESS_1,
SOFT_AP_IP_ADDRESS_2,
SOFT_AP_IP_ADDRESS_3,
SOFT_AP_IP_ADDRESS_4);
IP4_ADDR(
&ipAddressInfo.gw,
SOFT_AP_GW_ADDRESS_1,
SOFT_AP_GW_ADDRESS_2,
SOFT_AP_GW_ADDRESS_3,
SOFT_AP_GW_ADDRESS_4);
IP4_ADDR(
&ipAddressInfo.netmask,
SOFT_AP_NM_ADDRESS_1,
SOFT_AP_NM_ADDRESS_2,
SOFT_AP_NM_ADDRESS_3,
SOFT_AP_NM_ADDRESS_4);
//ESP_ERROR_CHECK(tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_AP, &ipAddressInfo));
ESP_ERROR_CHECK(esp_netif_set_ip_info(ap_netif, &ipAddressInfo));
//ESP_ERROR_CHECK(tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP));
ESP_ERROR_CHECK(esp_netif_dhcps_start(ap_netif));
//ESP_ERROR_CHECK(esp_event_loop_init(wifiEventHandler, NULL));
//ESP_ERROR_CHECK(esp_event_handler_register_with(wifiEventHandler, ESP_EVENT_ANY_BASE, ESP_EVENT_ANY_ID, wifiEventHandler, NULL));
esp_event_handler_instance_t instance_any_id;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifiEventHandler,
NULL,
&instance_any_id));
wifi_init_config_t wifiConfiguration = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&wifiConfiguration));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
wifi_config_t apConfiguration = {
.ap = {
.ssid = SOFT_AP_SSID,
.password = SOFT_AP_PASSWORD,
.ssid_len = 0,
//.channel = default,
.authmode = WIFI_AUTH_WPA2_PSK,
.ssid_hidden = 0,
.max_connection = 1,
.beacon_interval = 150,
},
};
//ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &apConfiguration));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &apConfiguration));
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
ESP_ERROR_CHECK(esp_wifi_start());
}
void app_main(void){
launchSoftAp();
while(1) vTaskDelay(10);
}
https://esp32.com/viewtopic.php?f=2&t=13205
Re: example of HTTP server in AP mode?
I am a beginner
I try to combine two examples together but it was unsuccessful
Please guide me
What should I do?
I try to combine two examples together but it was unsuccessful
Please guide me
What should I do?
Code: Select all
/* WiFi softAP 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 <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include <sys/param.h>
#include "tcpip_adapter.h"
#include "esp_eth.h"
//#include "protocol_examples_common.h"
#include <esp_http_server.h>
/* The examples use WiFi configuration that you can set via project configuration menu.
If you'd rather not, just change the below entries to strings with
the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID
#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
#define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN
static const char *TAG = "wifi softAP";
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_id == WIFI_EVENT_AP_STACONNECTED) {
wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",
MAC2STR(event->mac), event->aid);
} else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d",
MAC2STR(event->mac), event->aid);
}
}
void wifi_init_softap()
{
//tcpip_adapter_init();
//ESP_ERROR_CHECK(esp_event_loop_create_default());
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
wifi_config_t wifi_config = {
.ap = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
.password = EXAMPLE_ESP_WIFI_PASS,
.max_connection = EXAMPLE_MAX_STA_CONN,
.authmode = WIFI_AUTH_WPA_WPA2_PSK
},
};
if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {
wifi_config.ap.authmode = WIFI_AUTH_OPEN;
}
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
}
static esp_err_t hello_get_handler(httpd_req_t *req)
{
char* buf;
size_t buf_len;
/* Get header value string length and allocate memory for length + 1,
* extra byte for null termination */
buf_len = httpd_req_get_hdr_value_len(req, "Host") + 1;
if (buf_len > 1) {
buf = malloc(buf_len);
/* Copy null terminated value string into buffer */
if (httpd_req_get_hdr_value_str(req, "Host", buf, buf_len) == ESP_OK) {
ESP_LOGI(TAG, "Found header => Host: %s", buf);
}
free(buf);
}
buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-2") + 1;
if (buf_len > 1) {
buf = malloc(buf_len);
if (httpd_req_get_hdr_value_str(req, "Test-Header-2", buf, buf_len) == ESP_OK) {
ESP_LOGI(TAG, "Found header => Test-Header-2: %s", buf);
}
free(buf);
}
buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-1") + 1;
if (buf_len > 1) {
buf = malloc(buf_len);
if (httpd_req_get_hdr_value_str(req, "Test-Header-1", buf, buf_len) == ESP_OK) {
ESP_LOGI(TAG, "Found header => Test-Header-1: %s", buf);
}
free(buf);
}
/* Read URL query string length and allocate memory for length + 1,
* extra byte for null termination */
buf_len = httpd_req_get_url_query_len(req) + 1;
if (buf_len > 1) {
buf = malloc(buf_len);
if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
ESP_LOGI(TAG, "Found URL query => %s", buf);
char param[32];
/* Get value of expected key from query string */
if (httpd_query_key_value(buf, "query1", param, sizeof(param)) == ESP_OK) {
ESP_LOGI(TAG, "Found URL query parameter => query1=%s", param);
}
if (httpd_query_key_value(buf, "query3", param, sizeof(param)) == ESP_OK) {
ESP_LOGI(TAG, "Found URL query parameter => query3=%s", param);
}
if (httpd_query_key_value(buf, "query2", param, sizeof(param)) == ESP_OK) {
ESP_LOGI(TAG, "Found URL query parameter => query2=%s", param);
}
}
free(buf);
}
/* Set some custom headers */
httpd_resp_set_hdr(req, "Custom-Header-1", "Custom-Value-1");
httpd_resp_set_hdr(req, "Custom-Header-2", "Custom-Value-2");
/* Send response with custom headers and body set as the
* string passed in user context*/
const char* resp_str = (const char*) req->user_ctx;
httpd_resp_send(req, resp_str, strlen(resp_str));
/* After sending the HTTP response the old HTTP request
* headers are lost. Check if HTTP request headers can be read now. */
if (httpd_req_get_hdr_value_len(req, "Host") == 0) {
ESP_LOGI(TAG, "Request headers lost");
}
return ESP_OK;
}
static const httpd_uri_t hello = {
.uri = "/hello",
.method = HTTP_GET,
.handler = hello_get_handler,
/* Let's pass response string in user
* context to demonstrate it's usage */
.user_ctx = "Hello World!"
};
esp_err_t http_404_error_handler(httpd_req_t *req, httpd_err_code_t err)
{
if (strcmp("/hello", req->uri) == 0) {
httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/hello URI is not available");
/* Return ESP_OK to keep underlying socket open */
return ESP_OK;
} else if (strcmp("/echo", req->uri) == 0) {
httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/echo URI is not available");
/* Return ESP_FAIL to close underlying socket */
return ESP_FAIL;
}
/* For any other URI send 404 and close socket */
httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "Some 404 error message");
return ESP_FAIL;
}
static httpd_handle_t start_webserver(void)
{
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
// 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, &hello);
return server;
}
ESP_LOGI(TAG, "Error starting server!");
return NULL;
}
static void stop_webserver(httpd_handle_t server)
{
// Stop the httpd server
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");
stop_webserver(*server);
*server = NULL;
}
}
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()
{
static httpd_handle_t server = NULL;
ESP_ERROR_CHECK(nvs_flash_init());
tcpip_adapter_init();
ESP_ERROR_CHECK(esp_event_loop_create_default());
//Initialize NVS
/*
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
*/
ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");
wifi_init_softap();
server = start_webserver();
}
Re: example of HTTP server in AP mode?
I can do!Thanyasit wrote: ↑Sun Nov 29, 2020 7:43 amI am a beginner
I try to combine two examples together but it was unsuccessful
Please guide me
What should I do?
128550233_713334362913461_6156987125451441875_n.pngCapture.PNGCode: Select all
/* WiFi softAP 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 <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" #include "nvs_flash.h" #include "lwip/err.h" #include "lwip/sys.h" #include <sys/param.h> #include "tcpip_adapter.h" #include "esp_eth.h" //#include "protocol_examples_common.h" #include <esp_http_server.h> /* The examples use WiFi configuration that you can set via project configuration menu. If you'd rather not, just change the below entries to strings with the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" */ #define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD #define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN static const char *TAG = "wifi softAP"; static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_id == WIFI_EVENT_AP_STACONNECTED) { wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data; ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid); } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) { wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data; ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d", MAC2STR(event->mac), event->aid); } } void wifi_init_softap() { //tcpip_adapter_init(); //ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL)); wifi_config_t wifi_config = { .ap = { .ssid = EXAMPLE_ESP_WIFI_SSID, .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID), .password = EXAMPLE_ESP_WIFI_PASS, .max_connection = EXAMPLE_MAX_STA_CONN, .authmode = WIFI_AUTH_WPA_WPA2_PSK }, }; if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) { wifi_config.ap.authmode = WIFI_AUTH_OPEN; } ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); } static esp_err_t hello_get_handler(httpd_req_t *req) { char* buf; size_t buf_len; /* Get header value string length and allocate memory for length + 1, * extra byte for null termination */ buf_len = httpd_req_get_hdr_value_len(req, "Host") + 1; if (buf_len > 1) { buf = malloc(buf_len); /* Copy null terminated value string into buffer */ if (httpd_req_get_hdr_value_str(req, "Host", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Host: %s", buf); } free(buf); } buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-2") + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_hdr_value_str(req, "Test-Header-2", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Test-Header-2: %s", buf); } free(buf); } buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-1") + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_hdr_value_str(req, "Test-Header-1", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Test-Header-1: %s", buf); } free(buf); } /* Read URL query string length and allocate memory for length + 1, * extra byte for null termination */ buf_len = httpd_req_get_url_query_len(req) + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found URL query => %s", buf); char param[32]; /* Get value of expected key from query string */ if (httpd_query_key_value(buf, "query1", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query1=%s", param); } if (httpd_query_key_value(buf, "query3", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query3=%s", param); } if (httpd_query_key_value(buf, "query2", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query2=%s", param); } } free(buf); } /* Set some custom headers */ httpd_resp_set_hdr(req, "Custom-Header-1", "Custom-Value-1"); httpd_resp_set_hdr(req, "Custom-Header-2", "Custom-Value-2"); /* Send response with custom headers and body set as the * string passed in user context*/ const char* resp_str = (const char*) req->user_ctx; httpd_resp_send(req, resp_str, strlen(resp_str)); /* After sending the HTTP response the old HTTP request * headers are lost. Check if HTTP request headers can be read now. */ if (httpd_req_get_hdr_value_len(req, "Host") == 0) { ESP_LOGI(TAG, "Request headers lost"); } return ESP_OK; } static const httpd_uri_t hello = { .uri = "/hello", .method = HTTP_GET, .handler = hello_get_handler, /* Let's pass response string in user * context to demonstrate it's usage */ .user_ctx = "Hello World!" }; esp_err_t http_404_error_handler(httpd_req_t *req, httpd_err_code_t err) { if (strcmp("/hello", req->uri) == 0) { httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/hello URI is not available"); /* Return ESP_OK to keep underlying socket open */ return ESP_OK; } else if (strcmp("/echo", req->uri) == 0) { httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/echo URI is not available"); /* Return ESP_FAIL to close underlying socket */ return ESP_FAIL; } /* For any other URI send 404 and close socket */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "Some 404 error message"); return ESP_FAIL; } static httpd_handle_t start_webserver(void) { httpd_handle_t server = NULL; httpd_config_t config = HTTPD_DEFAULT_CONFIG(); // 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, &hello); return server; } ESP_LOGI(TAG, "Error starting server!"); return NULL; } static void stop_webserver(httpd_handle_t server) { // Stop the httpd server 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"); stop_webserver(*server); *server = NULL; } } 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() { static httpd_handle_t server = NULL; ESP_ERROR_CHECK(nvs_flash_init()); tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_create_default()); //Initialize NVS /* esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); */ ESP_LOGI(TAG, "ESP_WIFI_MODE_AP"); wifi_init_softap(); server = start_webserver(); }
Just use valid ip
192.168.4.1
Who is online
Users browsing this forum: Gaston1980, Google Feedfetcher and 157 guests