6371| 1
|
[进阶] ESP32 Arduino HTTP服务器教程:获取查询参数 |
简介 本ESP32教程的测试是使用集成在 FireBeetle ESP32开发板中的DFRobot的ESP-WROOM-32设备进行的。 关于ESP32上HTTP异步Web服务器的介绍,请参阅上一篇文章:ESP32 Arduino教程:异步HTTP网络服务器。 如果你喜欢视频教程,请查看视频: 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)。 他写了200多篇有关ESP32、ESP8266的有用的教程和项目。 查看更多ESP32/ESP8266教程和项目: 中文版教程 : ESP32教程 合集 英文版教程 : ESP32 tutorial 合集 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed