ESP32 Arduino教程:异步HTTP Web服务器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3589|回复: 0

ESP32 Arduino教程:异步HTTP Web服务器

[复制链接]
发表于 2019-5-30 18:07 | 显示全部楼层 |阅读模式
介绍
本文旨在介绍如何在运行Arduino内核的ESP32上配置异步HTTP Web服务器。
本ESP32教程的测试是使用集成在ESP32开发板中的DFRobot的ESP-WROOM-32设备进行的。

在此示例中,我们将开发一个非常简单的“hello world”应用程序,它将向与之相连的客户端返回一条消息。在客户端,我们将使用Web浏览器。

库文件
为了建立Web服务器,我们需要两个库文件。第一个是ESPAsyncWebServer,我们将在代码中使用它。
此库文件用于设置异步HTTP(和Websocket)服务器,这意味着它可以同时处理多个连接[1]。
此外,正如代码所示,在设置了服务器回调函数之后,我们就不需要像最初建立ESP8266 HTTP Web服务器那样在主循环上周期性调用客户端处理函数。
所需的第二个库文件为AsyncTCP,它是前一个库文件的依赖文件。因此,我们不会在代码中与此库文件交互,只是需要引用此库文件。
此库文件是ESP32的一个异步TCP库文件,它是执行ESPAsyncWebServer库文件的基础[2]。当然,它是一个较低层级的库,使用起来更复杂。
在撰写本文时,Arduino IDE库管理器上还没有这些库文件,因此我们需要从GitHub页面上下载并将其放在我们的Arduino库文件夹中。
为了下载这两个库文件,只需单击GitHub页面顶部的“Clone or download(复制或下载)”按钮即可,图1中突出显示此按钮。

图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。

[mw_shl_code=applescript,true]


#include <WiFi.h>

#include <FS.h>

#include <AsyncTCP.h>

#include <ESPAsyncWebServer.h>

[/mw_shl_code]
在引用这些文件之后,我们将声明两个全局变量来保存WiFi网络证书,以便之后使用它们来执行网络连接。

[mw_shl_code=applescript,true]const char* ssid = "yourNetworkName";

const char* password = "yourNetworkPassword";[/mw_shl_code]


最后,我们将声明一个AsyncWebServer类变量,利用它来设置异步ESP32 HTTP服务器。
[mw_shl_code=applescript,true]AsyncWebServer server(80);[/mw_shl_code]
我们将把服务器侦听的端口作为构造函数的输入参数。我们将使用端口80,即默认的HTTP端口。


[mw_shl_code=applescript,true]Serial.begin(115200);



WiFi.begin(ssid, password);



while (WiFi.status() != WL_CONNECTED) {

    delay(1000);

    Serial.println("Connecting to WiFi..");

}



Serial.println(WiFi.localIP());[/mw_shl_code]


我们将从建立一个串行连接开始编写setup函数。然后,使用先前声明的证书将ESP32连接到WiFi网络。关于如何将ESP32连接至WiFi网络的详细信息,请参阅先前的教程。
请注意,在连接完成后,我们将把分配给ESP32的本地IP地址打印出来,以便稍后可以使用它来向我们的服务器发出请求。
现在,我们将配置服务器侦听HTTP请求的路由,并调用一个在该路由上收到请求时将执行的函数。
我们将通过调用服务器对象的on方法来配置路由。此方法的第一个参数是一个包含了侦听路径的字符串。 将其设置为侦听“/ hello”路由上的请求。
它的第二个参数是一个类型为WebRequestMethod(此处定义)的枚举数据,用于指定在该路由上允许哪种类型的HTTP请求。我们将指定只接收HTTP GET请求,因此将此参数值设定为HTTP_GET。
第三个参数是一个函数,由ArRequestHandlerFunction类型定义签名,如下所示。
这个处理函数必须返回void并将指向AsyncWebServerRequest类对象的指针作为其参数。每个连接的客户端都将被封装在此类对象中,客户端与AsyncWebServerRequest类对象相互依存直至连接断开[3]。
为了保持语法紧凑,我们将此处理函数声明为C ++ lambda函数。因此,我们可以指定一个本地声明的无名函数。对于具有多个路由的服务器,这种代码编写方式比必须为每个路由声明命名函数更清晰和紧凑。 点击此处了解更多关于lambdas函数的信息。


我们将使用以下lambda语法:

[mw_shl_code=applescript,true][captures](params){body}[/mw_shl_code]


在此示例中,我们不会使用任何captures,所以我们只需使用空的方括号[]即可。对于参数,我们需要遵守前面所述处理函数定义的签名,即由ArRequestHandlerFunction指定的类型。因此,我们的lambda函数将把一个指向AsyncWebServerRequest类对象的指针作为其参数。


[mw_shl_code=applescript,true]server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){

// Lambda body implementation

});[/mw_shl_code]


在执行处理函数时,我们希望向客户端返回一个简单的“hello world”消息。如前所述,每个客户端都与一个AsyncWebServerRequest对象相关联,该对象的send方法可用于指定要返回的HTTP响应。
send方法将HTTP响应代码作为其第一个输入参数,在我们的示例中,此参数为200,即表示“确定”的HTTP响应代码。
send方法的第二个输入参数为响应的应答内容类型。我们将使用参数值“text / plain(纯文本)”,因为我们只需要返回“hello world”消息。
最后,我们将需要发送的实际内容传递给第三个参数,在此示例中,第三个参数为“hello world”消息。
请注意,由于我们使用的是指向对象的指针而不是对象本身,所以我们需要使用箭头操作符来调用AsyncWebServerRequest对象的send方法。


[mw_shl_code=applescript,true]server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send(200, "text/plain", "Hello World");

});[/mw_shl_code]


在setup函数的最后,我们将调用服务器对象的begin方法。此方法调用将启动服务器。
[mw_shl_code=applescript,true]server.begin();[/mw_shl_code]
由于我们的服务器是异步服务器,正如前面所述,我们不需要在主循环上调用任何客户端处理函数。因此,在接收到来自客户端的请求时,程序将异步调用和执行刚刚定义的路由处理函数。最终代码如下所示。


[mw_shl_code=applescript,true]#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(){

}

[/mw_shl_code]


测试代码
为了测试代码,只需使用Arduino IDE对代码进行编译并上传到ESP32即可。该过程完成后,打开串口监视器并复制当ESP32连接到WiFi网络后打印出来的IP地址。
然后,打开Web浏览器并在地址栏中键入以下内容,用刚刚复制的IP地址替代{yourEspIp}。
您将得到一个类似于图2的输出结果,即我们在代码中设定的打印消息“hello world”。


图2 - ESP32 HTTP Web服务器hello world


注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
他写了200多篇有关ESP32、ESP8266的有用的教程和项目。

查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
英文版教程 : ESP32 tutorial



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 14:46 , Processed in 0.070025 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表