ESP32 Arduino教程:异步HTTP Web服务器
介绍本文旨在介绍如何在运行Arduino内核的ESP32上配置异步HTTP Web服务器。本ESP32教程的测试是使用集成在ESP32开发板中的DFRobot的ESP-WROOM-32设备进行的。在此示例中,我们将开发一个非常简单的“hello world”应用程序,它将向与之相连的客户端返回一条消息。在客户端,我们将使用Web浏览器。
库文件为了建立Web服务器,我们需要两个库文件。第一个是ESPAsyncWebServer,我们将在代码中使用它。此库文件用于设置异步HTTP(和Websocket)服务器,这意味着它可以同时处理多个连接。此外,正如代码所示,在设置了服务器回调函数之后,我们就不需要像最初建立ESP8266 HTTP Web服务器那样在主循环上周期性调用客户端处理函数。所需的第二个库文件为AsyncTCP,它是前一个库文件的依赖文件。因此,我们不会在代码中与此库文件交互,只是需要引用此库文件。此库文件是ESP32的一个异步TCP库文件,它是执行ESPAsyncWebServer库文件的基础。当然,它是一个较低层级的库,使用起来更复杂。在撰写本文时,Arduino IDE库管理器上还没有这些库文件,因此我们需要从GitHub页面上下载并将其放在我们的Arduino库文件夹中。为了下载这两个库文件,只需单击GitHub页面顶部的“Clone or download(复制或下载)”按钮即可,图1中突出显示此按钮。
http://mc.dfrobot.com.cn/data/attachment/forum/201904/24/152253r1dqnbauvwqb1q7v.png图1 - 从GitHub上下载库文件代码
然后,选择“Download ZIP(下载压缩文件)”选项,文件将会被下载到您的计算机。只需打开“.zip”压缩文件并将文件夹解压至Arduino库文件夹即可。一般而言,Arduino的库文件夹地址为:C:\ Users \ UserName \ Documents \ Arduino \ libraries。请注意,解压的文件夹名称末尾为-master。请删除后缀-master并保留名称的其余部分。在此之后,您就可以在Arduino环境中使用这些库文件了。两个库文件的安装过程均是如此。
代码在此示例种,我们需要引用一些库文件。首先,我们需要引用WiFi.h库文件,它是将ESP32连接到无线网络所需的库文件。我们还需要引用FS.h库文件,它是ESP32的文件系统库(File System)。虽然在本教程中我们没有使用任何与文件系统相关的函数,但必须引用此库文件,否则将无法编译代码。最后,我们还将引用先前安装的两个库文件,即AsyncTCP.h和ESPAsyncWebServer.h。
#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
在引用这些文件之后,我们将声明两个全局变量来保存WiFi网络证书,以便之后使用它们来执行网络连接。
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
最后,我们将声明一个AsyncWebServer类变量,利用它来设置异步ESP32 HTTP服务器。AsyncWebServer server(80);我们将把服务器侦听的端口作为构造函数的输入参数。我们将使用端口80,即默认的HTTP端口。
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());
我们将从建立一个串行连接开始编写setup函数。然后,使用先前声明的证书将ESP32连接到WiFi网络。关于如何将ESP32连接至WiFi网络的详细信息,请参阅先前的教程。请注意,在连接完成后,我们将把分配给ESP32的本地IP地址打印出来,以便稍后可以使用它来向我们的服务器发出请求。现在,我们将配置服务器侦听HTTP请求的路由,并调用一个在该路由上收到请求时将执行的函数。我们将通过调用服务器对象的on方法来配置路由。此方法的第一个参数是一个包含了侦听路径的字符串。 将其设置为侦听“/ hello”路由上的请求。它的第二个参数是一个类型为WebRequestMethod(此处定义)的枚举数据,用于指定在该路由上允许哪种类型的HTTP请求。我们将指定只接收HTTP GET请求,因此将此参数值设定为HTTP_GET。第三个参数是一个函数,由ArRequestHandlerFunction类型定义签名,如下所示。这个处理函数必须返回void并将指向AsyncWebServerRequest类对象的指针作为其参数。每个连接的客户端都将被封装在此类对象中,客户端与AsyncWebServerRequest类对象相互依存直至连接断开。为了保持语法紧凑,我们将此处理函数声明为C ++ lambda函数。因此,我们可以指定一个本地声明的无名函数。对于具有多个路由的服务器,这种代码编写方式比必须为每个路由声明命名函数更清晰和紧凑。 点击此处了解更多关于lambdas函数的信息。
我们将使用以下lambda语法:
(params){body}
在此示例中,我们不会使用任何captures,所以我们只需使用空的方括号[]即可。对于参数,我们需要遵守前面所述处理函数定义的签名,即由ArRequestHandlerFunction指定的类型。因此,我们的lambda函数将把一个指向AsyncWebServerRequest类对象的指针作为其参数。
server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
// Lambda body implementation
});
在执行处理函数时,我们希望向客户端返回一个简单的“hello world”消息。如前所述,每个客户端都与一个AsyncWebServerRequest对象相关联,该对象的send方法可用于指定要返回的HTTP响应。send方法将HTTP响应代码作为其第一个输入参数,在我们的示例中,此参数为200,即表示“确定”的HTTP响应代码。send方法的第二个输入参数为响应的应答内容类型。我们将使用参数值“text / plain(纯文本)”,因为我们只需要返回“hello world”消息。最后,我们将需要发送的实际内容传递给第三个参数,在此示例中,第三个参数为“hello world”消息。请注意,由于我们使用的是指向对象的指针而不是对象本身,所以我们需要使用箭头操作符来调用AsyncWebServerRequest对象的send方法。
server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello World");
});
在setup函数的最后,我们将调用服务器对象的begin方法。此方法调用将启动服务器。server.begin();由于我们的服务器是异步服务器,正如前面所述,我们不需要在主循环上调用任何客户端处理函数。因此,在接收到来自客户端的请求时,程序将异步调用和执行刚刚定义的路由处理函数。最终代码如下所示。
#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "yourNetworkName";
const char* password ="yourNetworkPassword";
AsyncWebServer server(80);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());
server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello World");
});
server.begin();
}
void loop(){
}
测试代码为了测试代码,只需使用Arduino IDE对代码进行编译并上传到ESP32即可。该过程完成后,打开串口监视器并复制当ESP32连接到WiFi网络后打印出来的IP地址。然后,打开Web浏览器并在地址栏中键入以下内容,用刚刚复制的IP地址替代{yourEspIp}。您将得到一个类似于图2的输出结果,即我们在代码中设定的打印消息“hello world”。
http://mc.dfrobot.com.cn/data/attachment/forum/201904/24/152253kc9j8ytgpcpjrfb8.png图2 - ESP32 HTTP Web服务器hello world
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。他写了200多篇有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴英文版教程 : ESP32 tutorial
页:
[1]