一、介绍
ESPAsyncWebSrv是一个基于ESP-IDF和libAsyncWebSrv的异步Web服务器库。它提供了一个高度可定制的Web服务器,可以处理HTTP和HTTPS请求,并支持WebSocket和HTTP2协议。
ESPasyncWebSrv具有以下主要特点:
- 异步和非阻塞:ESPasyncWebSrv使用libasyncWebSrv库实现异步和非阻塞的网络处理,能够更好地处理多个并发请求,提高了服务器的性能和吞吐量。
- 可定制性:ESPasyncWebSrv提供了许多可配置的选项和回调函数,可以根据需要进行定制,满足不同的需求。
- 支持HTTP和HTTPS:ESPasyncWebSrv支持HTTP和HTTPS协议,可以提供安全的数据传输。
- 支持WebSocket和HTTP2:ESPasyncWebSrv支持WebSocket和HTTP2协议,可以实现双向通信和更高效的数据传输。
- 易于使用:ESPasyncWebSrv提供了简单的易用的API,使开发人员可以方便地集成到他们的项目中。
使用ESPasyncWebSrv,可以轻松地创建高度可定制的Web服务器,用于处理HTTP和HTTPS请求,实现双向通信和更高效的数据传输。它是ESP32和ESP8266等ESP芯片上开发Web应用程序的理想选择。
二、安装类库
arduino IDE中顶部菜单:工具管理库或者直接在左侧工具第三个管理库,安装时提示有依赖库,选择全部安装
三、引入头文件并创建服务
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebSrv.h>
AsyncWebServer server(80);
四、打开串口通信,设置波特率位115200
波特率(Baud rate)是指信号传输中,每秒钟传输的符号数。它通常用于衡量串行通信中的数据传输速率,单位为波特(Baud)或波特每秒(Baud per second,BPS)。在计算机通信领域中,波特率常用于描述串行通信中每秒钟传输的位数。例如,一个波特率为9600的串行通信口,其每秒钟传输9600个符号或9600个位。波特率越高,传输速率越快。
Serial.begin(115200);
五、web服务器处理及响应
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello, world");
});
// Send a GET request to <IP>/get?message=<message>
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
String message;
if (request->hasParam(PARAM_MESSAGE)) {
message = request->getParam(PARAM_MESSAGE)->value();
} else {
message = "No message sent";
}
request->send(200, "text/plain", "Hello, GET: " + message);
});
// Send a POST request to <IP>/post with a form field message set to <message>
server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request){
String message;
if (request->hasParam(PARAM_MESSAGE, true)) {
message = request->getParam(PARAM_MESSAGE, true)->value();
} else {
message = "No message sent";
}
request->send(200, "text/plain", "Hello, POST: " + message);
});
server.onNotFound(notFound);
server.begin();
六、定义notfound
void notFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
七、完整代码,本代码在安装完成扩展库后,arduino IDE示例代码中也能看到。
代码部分还用到了wifi连接,将下面的ssid和password换成自己的wifi名字和密码即可
//
// A simple server implementation showing how to:
// * serve static messages
// * read GET and POST parameters
// * handle missing pages / 404s
//
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebSrv.h>
AsyncWebServer server(80);
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* PARAM_MESSAGE = "message";
void notFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.printf("WiFi Failed!\n");
return;
}
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello, world");
});
// Send a GET request to <IP>/get?message=<message>
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
String message;
if (request->hasParam(PARAM_MESSAGE)) {
message = request->getParam(PARAM_MESSAGE)->value();
} else {
message = "No message sent";
}
request->send(200, "text/plain", "Hello, GET: " + message);
});
// Send a POST request to <IP>/post with a form field message set to <message>
server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request){
String message;
if (request->hasParam(PARAM_MESSAGE, true)) {
message = request->getParam(PARAM_MESSAGE, true)->value();
} else {
message = "No message sent";
}
request->send(200, "text/plain", "Hello, POST: " + message);
});
server.onNotFound(notFound);
server.begin();
}
void loop() {
}
八、server接受所有的post变量数据并显示在串口监测工具中
server.on("/saveConfig", HTTP_POST, [](AsyncWebServerRequest *request) {
int paramsCount = request->params(); // 获取参数数量
for(int i=0;i<paramsCount;i++){
AsyncWebParameter* p = request->getParam(i); // 获取第i个参数
if(p->isPost()){ // 如果参数是POST类型
Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); // 输出参数名和参数值
} else {
Serial.printf("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
}
}
// 你的其他代码
});
下图是我的接受数据