Data transfer in AP soft mode and http server

VarunSavita
Posts: 4
Joined: Sat Mar 21, 2020 8:21 am

Data transfer in AP soft mode and http server

Postby VarunSavita » Thu Apr 16, 2020 11:47 am

(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
-----------Code -------------

#include <sys/param.h>
#include "esp_netif.h"
#include "esp_eth.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 */
// testing --1
httpd_resp_set_hdr(req, "Custom-Header-2","Access-Control-Allow-Origin: *");
httpd_resp_set_hdr(req, "Custom-Header-2", "{\"m\":\"3C:71:BF:4C:A9:E5\"}");

//httpd_resp_send(req, "{"m":"3C:71:BF:4C:A9:E5"}", strlen("{"m":"3C:71:BF:4C:A9:E5"}"));

/* 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!"
// };
//char testing[] = "{"m":"3C:71:BF:4C:A9:E5"}";

static const httpd_uri_t hello = {
.uri = "/23",
.method = HTTP_GET,
.handler = hello_get_handler,
.user_ctx = "{"m":"3C:21:BF:AC:A9:E5"}"
};

/* 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
};

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 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 = 1,//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_ETHERNETImage
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();
}

ESP_Sprite
Posts: 9580
Joined: Thu Nov 26, 2015 4:08 am

Re: Data transfer in AP soft mode and http server

Postby ESP_Sprite » Fri Apr 17, 2020 11:24 am

Ok, do you have a question?

VarunSavita
Posts: 4
Joined: Sat Mar 21, 2020 8:21 am

Re: Data transfer in AP soft mode and http server

Postby VarunSavita » Sat Apr 18, 2020 5:29 am

Thank you for supporting,
Actually, I want to read unregister uri in code but not able.
able to do register uri and taken act accordingly.
I want to do unregister uri to register uri in code
Ex- 192.168.4.1/SSID:anything
Error
(186995) httpd_uri: httpd_uri: URI '/PASSWORD:vakd' not found
httpd_resp_send_err: 404 Not Found - This URI does not exist


I have a project -
The device(esp32) reads real-time from the sensor and sends it to MQTT.
Require Part -- WiFi credential change frequently as per client
I have a mobile app to change the credential
Ready - Mobile APP
Mobile APP send to 4 API
1:- static IP(AP mode)/23 -- start the config
2:- static IP(AP mode)/SSID: variable string --- set SSID
3:- static IP(AP mode)/password: variable string --- set a password
4:- static IP(AP mode)/0 -- Done

static IP(AP mode)/23 and static IP(AP mode)/0 are fixed API

I used to code for API fixed

**httpd_register_uri_handler(server, &API);

static const httpd_uri_t API= {
.uri = "/23",
.method = HTTP_GET,
.handler = hello_get_handler,
.user_ctx = "Got response"
};**

/----- not fixed API ------/
2:- static IP(AP mode)/SSID: variable string --- set SSID
3:- static IP(AP mode)/password: variable string --- set a password

Ex- /SSID: variable string
/SSID: -- fixed part
variable string -- vary part i have to store it.

Error
a:- (186995) httpd_uri: httpd_uri: URI '/PASSWORD:vakd' not found
b:- httpd_resp_send_err: 404 Not Found - This URI does not exist

Error- a from from function *esp_err_t httpd_uri(struct httpd_data hd) and file name httpd_uri.c
Error - b from from function **esp_err_t httpd_resp_send_err(httpd_req_t req, httpd_err_code_t error, const char usr_msg) file name httpd_txrx.c

I want to do unregister uri to register in the main code
Require -SSID and PASSWORD from API

I can't use put method because of the mobile app ready.
My bad situation

Who is online

Users browsing this forum: No registered users and 251 guests