简介 本文旨在解释如何从发送到ESP32上Arduino核心运行的Web服务器的HTTP请求中获取查询参数。 本ESP32教程的测试是使用集成在 FireBeetle ESP32开发板中的DFRobot的ESP-WROOM-32设备进行的。
如果你喜欢视频教程,请查看视频:
Arduino代码 我们将通过所需的库加入启动Arduino代码,这将能够设置HTTP服务器,并将ESP32连接到Wi-Fi网络。我们还将声明两个全局变量来保存我们要连接ESP32的无线网络的凭据。 如需声明全局变量,我们需要一个AsyncWebServer类的实例,它接收构造函数的输入,即服务器将侦听传入请求的端口。
[mw_shl_code=applescript,true]
#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPass";
AsyncWebServer server(80);[/mw_shl_code]
转到功能设置,我们将首先打开一个串行接口,以便稍后输出程序结果,更确切地说,我们将在请求中接收的查询参数。 之后,我们将使用先前声明的凭据将ESP32连接到Wi-Fi网络。请注意,最后建立连接后,我们在网络上打印ESP32的IP,稍后需要连接到它。
[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]
现在我们将通过将其绑定到处理函数来在我们的服务器上设置路由。在该处理函数内部,我们将访问客户端发送的查询参数。 我们将使用索引路由(“/”)并指定我们只在路由上接收HTTP GET请求。请注意,我们将处理函数声明为lambda函数。
[mw_shl_code=applescript,true]
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
// Handling function
});[/mw_shl_code]
在处理函数中,我们将首先检查接收的参数数量。我们可以通过在请求对象上调用params方法来获取此值,我们将接收指针作为处理函数的输入。 此方法不接收任何参数,并且如上所述,将返回请求中接收的参数数量。
[mw_shl_code=applescript,true]int paramsNr = request->params();
Serial.println(paramsNr);[/mw_shl_code]
如需获取实际参数,我们可以使用同一请求对象的getParam方法。此方法接收我们想要获取的参数的索引(从0到参数数减1)并返回指向AsyncWebParameter类对象的指针,该对象包含有关参数信息。 由于我们已经知道前一次调用的参数数量,因此我们可以执行for循环来获取所有参数。 我们可以通过分别调用AsyncWebParameter对象上的name和value方法来获取每个参数的名称和值。 请记住,我们有一个指向对象而不是实际对象的指针,因此我们需要使用- >运算符来访问这些方法。
[mw_shl_code=applescript,true]
for(int i=0;i<paramsNr;i++){
AsyncWebParameter* p = request->getParam(i);
Serial.print("Param name: ");
Serial.println(p->name());
Serial.print("Param value: ");
Serial.println(p->value());
Serial.println("------");
}[/mw_shl_code]
仍在处理函数内部,我们将通过调用请求对象上的send方法将响应返回给客户端。我们将返回一个简单的“Message received”字符串和HTTP OK状态。
[mw_shl_code=applescript,true]request->send(200, "text/plain", "message received");[/mw_shl_code]
如需完成Arduino功能设置,我们在全局服务器对象上调用begin方法,以启动服务器。最终的完整源代码如下所示。
[mw_shl_code=applescript,true]#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPass";
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("/", HTTP_GET, [](AsyncWebServerRequest *request){
int paramsNr = request->params();
Serial.println(paramsNr);
for(int i=0;i<paramsNr;i++){
AsyncWebParameter* p = request->getParam(i);
Serial.print("Param name: ");
Serial.println(p->name());
Serial.print("Param value: ");
Serial.println(p->value());
Serial.println("------");
}
request->send(200, "text/plain", "message received");
});
server.begin();
}
void loop(){}[/mw_shl_code]
测试代码 如需测试代码,请编译它并使用Arduino IDE将其上传到ESP32。然后打开串行监视器,在连接到Wi-Fi网络完成后,使用打印的IP从您选择的Web浏览器向服务器发送GET请求。
由于我们希望测试查询参数,我们将在我们的请求中添加一些内容。为此,只需在浏览器的地址栏中键入以下内容,通过打印到串行监视器的IP更改{yourEspIp}。 发送请求后,您应该获得类似于图1的输出,该输出显示我们定义的字符串被返回。查询参数在图像中突出显示。 图1 - 使用查询参数向包含查询参数的ESP32 Web服务器发送HTTP GET请求。
如果您回到Arduino串口监视器,您应该有一个如图2所示的输出,它显示了参数的数量,它们的名称和它们的值被打印到控制台。请注意,它们与从Web浏览器发送的内容相匹配。
图2 - 获取HTTP请求的查询参数。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
查看更多ESP32/ESP8266教程和项目:
|