Untuk AP Mode, pertama kita tambahkan konfigurasi pada platformio.ini
[env:az-delivery-devkit-v4] platform = espressif32 board = az-delivery-devkit-v4 framework = espidf monitor_speed = 115200
Edit sdkconfig untuk mengubah HTTP request header length buffer. Masuk ke virtual environment platformio, dapat diakses melalui C:/Users/nama_account/.platformio/penv/bin/activate atau melalui menu pada PlatformIO di Visual Studio Code.

(penv)$ pio run -t menuconfig
Ubah HTTP request header length menjadi 2048 pada menu Component config/HTTP Server.

Code
Buka file src/main.c, tambahkan code berikut:
//bagian import library
#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 "esp_http_server.h"
#include <string.h>
#define WIFI_SSID "esp32_ap1"
#define WIFI_PWD "A_pwd_is_needed_here"
#define WIFI_CHANNEL 11
#define MAX_CONN_CNT 1
static const char *TAG = "ap-app";
static const char *HTML_FORM =
"<html><form action=\"/\" method=\"post\">"
"<label for=\"ssid\">Local SSID:</label><br>"
"<input type=\"text\" id=\"ssid\" name=\"ssid\"><br>"
"<label for=\"pwd\">Password:</label><br>"
"<input type=\"text\" id=\"pwd\" name=\"pwd\"><br>"
"<input type=\"submit\" value=\"Submit\">"
"</form></html>";
static void start_webserver(void);
static esp_err_t handle_http_get(httpd_req_t *req);
static esp_err_t handle_http_post(httpd_req_t *req);
static void handle_wifi_events(void *, esp_event_base_t, int32_t, void *);
//bagian init wifi
static void init_wifi(void)
{
if (nvs_flash_init() != ESP_OK)
{
nvs_flash_erase();
nvs_flash_init();
}
esp_event_loop_create_default();
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &handle_wifi_events, NULL);
esp_netif_init();
esp_netif_create_default_wifi_ap();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
wifi_config_t wifi_config = {
.ap = {
.ssid = WIFI_SSID,
.ssid_len = strlen(WIFI_SSID),
.channel = WIFI_CHANNEL,
.password = WIFI_PWD,
.max_connection = MAX_CONN_CNT,
.authmode = WIFI_AUTH_WPA_WPA2_PSK},
};
esp_wifi_set_mode(WIFI_MODE_AP);
esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config);
esp_wifi_start();
start_webserver();
}
//bagaian handle wifi events
static void handle_wifi_events(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
{
if (event_id == WIFI_EVENT_AP_STACONNECTED)
{
ESP_LOGI(TAG, "a station connected");
}
}
//bagian start web server
static void start_webserver(void)
{
httpd_uri_t uri_get = {
.uri = "/",
.method = HTTP_GET,
.handler = handle_http_get,
.user_ctx = NULL};
httpd_uri_t uri_post = {
.uri = "/",
.method = HTTP_POST,
.handler = handle_http_post,
.user_ctx = NULL};
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_handle_t server = NULL;
if (httpd_start(&server, &config) == ESP_OK)
{
httpd_register_uri_handler(server, &uri_get);
httpd_register_uri_handler(server, &uri_post);
}
}
//handle http get
static esp_err_t handle_http_get(httpd_req_t *req)
{
return httpd_resp_send(req, HTML_FORM, HTTPD_RESP_USE_STRLEN);
}
//handle http post
static esp_err_t handle_http_post(httpd_req_t *req)
{
char content[100];
if (httpd_req_recv(req, content, req->content_len) <= 0)
{
return ESP_FAIL;
}
ESP_LOGI(TAG, "%.*s", req->content_len, content);
return httpd_resp_send(req, "received", HTTPD_RESP_USE_STRLEN);
}
//main function
void app_main(void)
{
init_wifi();
}
Penjelasan Code
Bagian Import Library
Pertama kita include header file yang digunakan. lalu definisikan beberapa macro untuk access point service. Ketika ESP32 dijalankan dalam AP Mode, Wi-Fi SSID adalah esp32_ap1.
HTML_FORM berisi code HTML untuk form dimana kita akan collect local Wi-Fi credentials. Form ini akan dipublish oleh web server.
Bagian init wifi
Seluruh proses dimanage dalam fungsi init_wifi .
Pertama inisialisasi nvs partition (seperti yang telah kita lakukan pada modul STA mode). Kemudian dalam event loop, kita monitor Wi-Fi events dan register handle_wifi_events.
Selanjutnya adalah menjalankan Wi-Fi access point.
Kita inisialisasi network interface dan Wi-Fi module dengan default configuration. Kita definisikan variable, wifi_config, untuk menyimpan konfigurasi access point configuration.
Varaible ini akan digunakan oleh esp_wifi_set_config sebelum menjalankan Wi-Fi.
Kita jalankan Wi-Fi dan panggil start_webserver, agar device dapat diakses dari device lain.
Bagian Handle wifi events
Fungsi handle_wifi_events hanya akan print log message bahwa device terhubung ke ESP32 access point.
Bagian Web Server
Menjalankan web server sangat mudah, cukup memanggil httpd_start dan register functions
untuk GET dan POST requests.
Bagian Handle Get Request
Ketika client mengirim GET request, kita reply dengan HTML_FORM menggunakan handle_http_
get function.
Bagian Handle Post Request
Handler yang lain adalah POST request. User akan mengisi form dengan local Wi-Fi network credentials dan menekan Submit button pada form. Ini akan menyebabkan POST request pada sisi ESP32.
Pada handle_http_post, kita terima =credentials dengan memanggil httpd_req_recv. Disini kita bisa parse data untuk mencari data SSID dan password, dan start ESP32 dalam STA mode untuk terhubung ke local Wi-Fi network.
Bagian Main Function
Pada app_main, kita hanya panggil init_wifi.