1. Home
  2. Docs
  3. ESP-IDF / ESP32
  4. IoT ve Kablosuz Haberleşm...
  5. ESP-IDF ile HTTP Web Sunucusu (esp_http_server) ve REST API Yapımı

ESP-IDF ile HTTP Web Sunucusu (esp_http_server) ve REST API Yapımı

Print

Gömülü cihazların tarayıcı üzerinden yapılandırılması (Wi-Fi şifresi girme, sensör kalibrasyonu) veya yerel ağdaki mobil uygulamalarla doğrudan haberleşmesi gerektiğinde en pratik çözüm cihazın üzerinde yerel bir HTTP sunucusu çalıştırmaktır. ESP-IDF’in resmi ESP-IDF HTTP web sunucusu bileşeni (esphttpserver), çoklu oturum desteği ve düşük bellek tüketimiyle ESP32’yi tam donanımlı bir REST API sunucusuna dönüştürür.

Bu rehberde; esphttpserver mimarisini, GET ve POST isteklerini işlemeyi, JSON gövdelerini ayrıştırmayı ve HTML kontrol paneli sunmayı adım adım öğreneceğiz.


esphttpserver Mimarisi

esphttpserver, FreeRTOS üzerinde çalışan bir dinleme görevi (daemon task) ve soket havuzundan oluşur. URI işleyicileri (URI Handlers) ile belirli rotalara fonksiyonlar bağlanır:

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "esp_http_server.h"

static const char *TAG = "WEB_SERVER";
static httpd_handle_t server = NULL;

1. GET İsteği: Sensör Verisi Döndüren REST API Endpoint’i (/api/sensor)

İstemci GET /api/sensor isteği yaptığında JSON formatında anlık ölçüm verilerini döndüren işleyici:

esp_err_t get_sensor_handler(httpd_req_t *req) {
    // JSON yanıt hazırla
    const char *resp_json = "{\"temperature\": 24.8, \"humidity\": 58.2, \"status\": \"OK\"}";

    // Yanıt başlıklarını ayarla
    httpd_resp_set_type(req, "application/json");
    httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); // CORS desteği!

    // Yanıtı gönder
    httpd_resp_send(req, resp_json, HTTPD_RESP_USE_STRLEN);
    return ESP_OK;
}

// Rota Yapılandırması
static const httpd_uri_t uri_get_sensor = {
    .uri       = "/api/sensor",
    .method    = HTTP_GET,
    .handler   = get_sensor_handler,
    .user_ctx  = NULL
};

2. POST İsteği: Röle / LED Kontrol Endpoint’i (/api/relay)

Tarayıcıdan veya Postman’den gelen POST gövdesini (Body) okuyup röle durumunu değiştiren işleyici:

esp_err_t post_relay_handler(httpd_req_t *req) {
    char buf[100];
    int ret, remaining = req->content_len;

    if (remaining >= sizeof(buf)) {
        httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Payload too large");
        return ESP_FAIL;
    }

    // Gönderilen veriyi oku
    ret = httpd_req_recv(req, buf, remaining);
    if (ret <= 0) {
        return ESP_FAIL;
    }
    buf[ret] = '\0'; // String sonlandır

    ESP_LOGI(TAG, "Gelen POST Verisi: %s", buf);

    // Basit komut kontrolü
    if (strstr(buf, "\"state\": 1") != NULL) {
        ESP_LOGI(TAG, "Röle AÇILDI!");
        // gpio_set_level(RELAY_PIN, 1);
    } else {
        ESP_LOGI(TAG, "Röle KAPATILDI!");
        // gpio_set_level(RELAY_PIN, 0);
    }

    httpd_resp_send(req, "{\"success\": true}", HTTPD_RESP_USE_STRLEN);
    return ESP_OK;
}

static const httpd_uri_t uri_post_relay = {
    .uri       = "/api/relay",
    .method    = HTTP_POST,
    .handler   = post_relay_handler,
    .user_ctx  = NULL
};

3. Web Sunucusunu Başlatmak ve Rotaları Kaydetmek

httpd_handle_t start_webserver(void) {
    httpd_config_t config = HTTPD_DEFAULT_CONFIG();
    config.max_uri_handlers = 8;
    config.stack_size = 4096;

    ESP_LOGI(TAG, "HTTP Sunucusu Port %d üzerinde başlatılıyor...", config.server_port);
    if (httpd_start(&server, &config) == ESP_OK) {
        // Rotaları kaydet
        httpd_register_uri_handler(server, &uri_get_sensor);
        httpd_register_uri_handler(server, &uri_post_relay);
        return server;
    }

    ESP_LOGE(TAG, "Sunucu başlatılamadı!");
    return NULL;
}

Özet

esphttpserver kütüphanesi ile harici hiçbir sunucuya veya buluta ihtiyaç duymadan ESP32 cihazınızı bağımsız bir web aracı haline getirebilir, yerel REST API’ler ile IoT projelerinizi doğrudan telefon veya tarayıcı üzerinden yönetebilirsiniz.

Tags , , , , ,

How can we help?