WiFi dan ESP32 – AP Mode

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.

Sharing is caring:

Leave a Comment