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 테스트 동영상
반응형