본문 바로가기

ESPRESSIF/ESP32

ESP32 비동기 AsyncWebServer

ESP32에서 웹서버 구현 방법에는 여러가지가 있는데 이번에는 장점이 많은 비동기 웹서버를 이용하여 구현해 보았다.

장점이 있지만 라이브러리가 필요하다.

ESPAsyncTCP, ESPAsyncWebServer (https://github.com/me-no-dev/ESPAsyncWebServer)

 

 

지난번 기본 라이브러리로 제공하는 ESP32 동기식 웹서버 예제와 같이 이번에도 가장 기본이 되는 웹서버 코드로 구현 해 보자

 

#ifdef ESP32 // ESP32 libraries
#include <WiFi.h>
#include <AsyncTCP.h>
#else // ESP8266 libraries
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>

// SSID & Password

const char *ssid = " ";
const char *password = " ";

AsyncWebServer server(80);  // Object of WebServer(HTTP port, 80 is defult)
#define Led1Pin        23    

// HTML & CSS contents which display on web server
#if 1
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<center>
<h1>ESP32 Simple WebServer - Async Mode</h1>
<a href="on"><button class="button">ON</button></a><p></p>
<a href="off"><button class="button">OFF</button></a>
</center>
</body>
</html>
)rawliteral";
#endif


//페이지 요청이 들어 오면 처리 하는 함수
String processor(const String& var){
  Serial.println(var);

  return var;
}

void onRootRequest(AsyncWebServerRequest *request) {
  request->send_P(200, "text/html", index_html, processor);
}

void InitWebServer() 
{
    server.on("/", onRootRequest);

    server.on("/on", HTTP_GET, [] (AsyncWebServerRequest *request) {
      digitalWrite(Led1Pin, 1); 
      request->send_P(200, "text/html", index_html, processor);
    });

    server.on("/off", HTTP_GET, [] (AsyncWebServerRequest *request) {
      digitalWrite(Led1Pin, 0); 
      request->send_P(200, "text/html", index_html, processor);
    });

    server.begin();
}

void setup() {
    pinMode(Led1Pin, OUTPUT);
    digitalWrite(Led1Pin, 1);

    Serial.begin(115200);
    Serial.println("ESP32 Simple web Start");
    Serial.println(ssid);

    //Wifi 접속
    WiFi.begin(ssid, password);
    
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(1000);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected successfully");
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());  //Show ESP32 IP on serial

    //웹서버 초기화 및 페이지 요청 처리 함수 등록
    InitWebServer();

    Serial.println("HTTP server started");
    delay(100); 
}

void loop() {
  
}

 

 

 

이번에는 웹페이지를 조금더 능동적으로 동작하도록 하기 위해 javascripts 를 사용해서 페이지 상태 정보를 전달 할 수 있도록 했다.

자바스크립트로 웹페이지 상의 체크 박스의 상태값을 읽어서 서버로 GET 메시지를 전송 하도록 했다.

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<style>
</style>
</head>
<body>
<center>
<h1><center>ESP32 Simple Web Server - Async</h1>
<br><br>
<h4>LED - Status <span id="outputState"><span></h4><label class="switch"><input type="checkbox" onchange="toggleCheckbox(this)" id="output" ><span class="slider"></span></label>
<script>
function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked)
  { 
      xhr.open("GET", "/update?output="+element.id+"&state=1", true);
  }
  else
  { 
      xhr.open("GET", "/update?output="+element.id+"&state=0", true);
  }
  xhr.send();
}
</script>
</body>
</html>
)rawliteral";

 

 

서버측에서는 상태 값에 따라 LED를 제어 할 수 있는 update 함수를 등록해서 제어 할 수 있도록 했다.

void onStatusUpdate(AsyncWebServerRequest *request) {
    String inmsg; 
    if (request->hasParam("state"))
    {
        inmsg = request->getParam("state")->value(); 
        digitalWrite(Led1Pin, inmsg.toInt()); 
    }
    else {
        inmsg = "No message sent";
    }
    //Serial.print("LED ON");
    Serial.println(inmsg);
    request->send(200, "text/plain", "OK");
}

void initWebServer() 
{
    server.on("/", onRootRequest);
    server.on("/update", onStatusUpdate);
    server.begin();
}

 

 

웹페이지 실행후 체크 박스의 상태에 따라 LED가 제어 되는 것을 확인 할수 있다.


이번에도 ccs 문으로 좀더 화면을 꾸며 보자

<style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .switch {position: relative; display: inline-block; width: 120px; height: 68px}
    .switch input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #F63E36; border-radius: 34px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
    input:checked+.slider {background-color: #3CC33C}
    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
</style>

 

체크 박스의 상태가 좀더 이쁜 모양으로 표시 된다.

 

 

CCS 파일을 좀더 설정하면 다양한 형태의 웹페이지를 구현 할 수 있다. 물론 ESP32에서 구동되는 처리 함수는 동일하다.

 

 

ESP32 AsyncWebServer 테스트 동영상

https://youtu.be/a-LHbHrdIHY

 

반응형