本帖最后由 dfrobot 于 2019-6-18 17:06 编辑
本ESP32教程的测试是使用集成在ESP32开发板中的DFRobot的ESP-WROOM-32设备进行的。
简介 创建多台服务器实例的可能性使我们可以自由地开发不同的API,比如创建具有获取测量和设置用户配置功能的API的物联网设备,以及方便技术人员访问日志和检测设备故障的另一个独立的API。 举例来说,我们将设置3个简单的HTTP异步服务器,每个服务器在不同的端口上进行监听,并在收到请求时输出简单的消息。
代码 我们将通过加入所有需要的库来启动代码。请查看这篇文章,了解为何我们每个库都需要的原因。
[mw_shl_code=applescript,true]#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>[/mw_shl_code]
像往常一样,我们还将Wi-Fi网络凭证存储在两个全局变量中,因此它们能够轻松进行更改。
[mw_shl_code=applescript,true]const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";[/mw_shl_code]
接下来,我们将声明AsyncWebServer类的3个实例。请记住,在以前的帖子中,此类构造函数接收服务器将侦听的端口作为参数。我们将为每个服务器实例分配一个不同的端口。我们将使用端口80、81和82。
[mw_shl_code=applescript,true]AsyncWebServer server1(80);
AsyncWebServer server2(81);
AsyncWebServer server3(82);[/mw_shl_code]
转到Arduino功能设置,我们首先打开一个串口,因为我们需要在Wi-Fi网络上获取ESP32的IP才能向我们的服务器发送请求。
[mw_shl_code=applescript,true]Serial.begin(115200);
[/mw_shl_code]
然后我们将设备连接到网络,一旦程序完成就打印其IP。
[mw_shl_code=applescript,true]WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());[/mw_shl_code]
现在我们已经将ESP32连接到网络,我们可以继续设置每个服务器。因此,我们需要设置服务器将监听的路由以及将在每条路由上执行的处理功能。 我们将配置服务器1和2两个侦听名为“/hello”的路由。请注意,即使路由具有相同的名称,两个服务器也将是相互独立的,并且具有不同的处理功能。 针对联系服务器的客户端而言,消歧是通过服务器端口完成的,需要在发出HTTP请求时进行指定,我们将在后面看到。 服务器3将侦听名为“/test”的路由。
每条路由的处理函数只返回带服务器编号的消息,因此我们可以知道的服务器实例正在回答每个请求。 如前面帖子所示,我们通过调用服务器对象上的on方法将路由绑定到其处理函数,将路由作为输入传递,使用该路由上允许的HTTP方法的枚举值和处理函数。
[mw_shl_code=arduino,true]server1.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello from server 1");
});
server2.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello from server 2");
});
server3.on("/test", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello from server 3");
});[/mw_shl_code]
最后,我们需要通过在每个服务器对象上调用begin方法来启动每个服务器实例。
[mw_shl_code=applescript,true]server1.begin();
server2.begin();
server3.begin();[/mw_shl_code]
像往常一样,我们可以留下一个空的Arduino主循环,因为服务器处于异步工作模式。完整的源代码如下所示。
[mw_shl_code=arduino,true] #include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
AsyncWebServer server1(80);
AsyncWebServer server2(81);
AsyncWebServer server3(82);
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());
server1.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello from server 1");
});
server2.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello from server 2");
});
server3.on("/test", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hello from server 3");
});
server1.begin();
server2.begin();
server3.begin();
}
void loop(){}[/mw_shl_code]
测试代码 如需测试代码,请使用Arduino IDE将其编译并上传到ESP。然后只需打开串行监视器并复制打印的IP,即网络上设备的IP。 然后,如需联系每个服务器,只需在Web浏览器URL栏上键入以下内容,通过您刚刚复制的IP更改{yourDeviceIp},并通过要联系的服务器实例的端口更改{serverPort}。您还需要通过服务器中可用的路由更改{route}。 图1显示了在端口80上向服务器发送HTTP请求的结果。请记住,此服务器具有可用的“/hello”路由。
图1 - 针对编号为1的服务器实例的请求结果。
请注意,显示URL不包含端口(:80)部分,因为端口80是默认的HTTP端口。因此,即使您键入它,大多数浏览器也会在发出请求时隐藏它。对于其他端口,我们将在下面看到,它们不会被浏览器删除。 在图2中,我们可以检查端口81的结果。如前所述,虽然路由与服务器1中的名称相同,但我们在URL中使用了不同的端口,因此我们确实与服务器2建立了联络。
图2 - 针对编号为2的服务器实例的请求结果。
最后,您可以在图3中查看服务器3的结果,该服务器正在侦听端口82。
图3 - 针对编号为2的服务器实例的请求结果。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。 他写了200多篇有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目:
|