Arduino for ESP8266 和 Arduino for ESP32 中默認就有WebServer,不過這些WebServer都是同步的,不支持同時處理多個連接,這在很多時候其實是不太好用的。
如果用戶請求一個頁麵,該頁麵中鏈接了很多文件的情況下,因為不支持同時處理多個連接,其中部分文件可能就獲取失敗了,最終導致呈現在用戶眼前的頁麵功能缺失。再或者有多個用戶頻繁的發起請求,其中部分請求也有可能會無法響應。
使用ESPAsyncWebServer就可以極大的規避上述問題,使在Arduino for ESP8266&ESP32中搭建WebServer真正可用、好用。
ESPAsyncWebServer項目地址如下:
https://github.com/me-no-dev/ESPAsyncWebServer
本文中各例程演示均在ESP32中進行。
特征
使用異步方式意味著可以同時處理多個連接;
支持WebSocket和EventSource;
支持URL Rewrite;
支持ServeStatic,可實現Cache-Control、Last-Modified、default index等功能;
帶有簡單的模板引擎;
安裝
ESPAsyncWebServer項目官方是推薦使用PlatformIO作為開發工具來使用,相關的安裝使用方法可以查看官方文檔。本文中將以傳統Arduino IDE作為使用說明。首先下載相關的庫:
另外ESPAsyncWebServer庫是基於異步TCP庫之上的,這個也需要另外下載:
ESP8266使用ESPAsyncTCP庫 - https://github.com/me-no-dev/ESPAsyncTCP
ESP32使用AsyncTCP庫 - https://github.com/me-no-dev/AsyncTCP
下載相關庫的zip包後在Arduino IDE中選擇: 項目 > 加載庫 > 添加 .ZIP 庫 ,庫添加完成後就可以使用了。
如果你想將庫文件都包含在自己的項目中那可以將相關文件和文件加放到項目文件夾裏,然後修改頭文件中的相關引用,將 #include <...> 修改為 #include "..." ,涉及的文件有好幾個,如果沒有用上麵的方式添加過庫的可以通過編譯時報錯的信息來查找哪些地方需要修改。
快速體驗
ESPAsyncWebServer功能很強大,但最基本的使用非常簡單,在安裝完庫之後隻要以下幾步即可使用:
引入相應庫 #include <ESPAsyncWebServer.h> ;
聲明 AsyncWebServer 對象並設置端口號,一般WebServer端口號使用 80 ;
使用 on() 方法注冊鏈接與回調函數;
使用 begin() 方法啟動服務器進行請求監聽;
下麵是個最基礎的使用例程:
#include <WiFi.h>
#include <ESPAsyncWebServer.h> //引入相應庫
const char *ssid = "********";
const char *password = "********";
AsyncWebServer server(80); //聲明WebServer對象
void handleRoot(AsyncWebServerRequest *request) //回調函數
{
Serial.println("User requested.");
request->send(200, "text/plain", "Hello World!"); //向客戶端發送響應和內容
}
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, handleRoot); //注冊鏈接"/"與對應回調函數
server.begin(); //啟動服務器
Serial.println("Web server started");
}
void loop(){}
上麵的演示中除去連接WiFi的代碼,真正ESPAsyncWebServer部分代碼沒多少,使用起來非常簡單,大部分時候我們需要關心的就是 on() 方法和與它綁定的回調函數。
on() 方法中第二個參數可選值為 HTTP_GET 、 HTTP_POST 、 HTTP_DELETE 、 HTTP_PUT 、 HTTP_PATCH 、 HTTP_HEAD 、 HTTP_OPTIONS 、 HTTP_ANY 這些HTTP方法。
除了 on() 方法外還有個 onNotFound()方法,用戶訪問未注冊的鏈接時就會執行該方法綁定的回調函數。
上麵的回調函數中用了 request->send() 方式向客戶端發送了消息,上麵例子中參數分別填入了HTTP狀態碼、文件類型、響應數據。 send() 方法還有很多重載形式,會另外寫文章進行介紹。
下麵是個稍豐富點的例程:
#include <WiFi.h>
#include <ESPAsyncWebServer.h> //引入相應庫
const char *ssid = "JingGe_Office";
const char *password = "jingge2017";
AsyncWebServer server(80); //聲明WebServer對象
void handleRoot(AsyncWebServerRequest *request) //回調函數
{
Serial.println("User requested /");
request->send(200, "text/plain", "Hello World!"); //向客戶端發送響應和內容
}
void notFound(AsyncWebServerRequest *request) //回調函數
{
Serial.println("User requested unknow");
request->send(404, "text/plain", "Not found"); //向客戶端發送響應和內容
}
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, handleRoot); //注冊鏈接"/"與對應回調函數
server.on("/lambda", HTTP_GET, [](AsyncWebServerRequest *request) { //注冊鏈接"/lambda"與對應回調函數(匿名函數形式聲明)
Serial.println("User requested /lambda");
request->send(200, "text/plain", "lambda callback page"); //向客戶端發送響應和內容
});
server.onNotFound(notFound); //用戶訪問未注冊的鏈接時執行notFound()函數
server.begin(); //啟動服務器
Serial.println("Web server started");
}
void loop() {}
注意事項
該庫對於用戶請求的解析並不是在loop()中進行的;
基於上麵的原因不能在請求的回調函數中使用 yield 和 delay 這類函數;
單個請求隻能發送單個響應;
本文版权:http://www.ndfweb.cn/news-903.html