Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:事件处理绑定

目的

WebServer一般是用来被动处理客户端的请求的,所以使用时首先需要注册相应的事件和绑定处理该事件的回调函数。这篇文章将对ESPAsyncWebServer中涉及的一些内容进行简单说明。

本文中各例程演示均在ESP32中进行。

事件处理绑定

想要正确接收处理客户端发出的HTTP请求首先需要对各个请求绑定其触发时处理的回调函数,最常用的就是 AsyncWebServer 对象的 on() 方法了:

AsyncWebServer server(80); 

void callback(AsyncWebServerRequest *request){request->send(200);} // 回调函数

void setup()
{
	// 下面的on()方法最常用的方式,参数分别填入url、http_method、onRequest_callback
	// 其中http_method可选HTTP_GET、HTTP_POST、HTTP_DELETE、HTTP_PUT HTTP_PATCH、HTTP_HEAD、HTTP_OPTIONS、HTTP_ANY 
	server.on("/url", HTTP_ANY, callback);
}

上面方法中填入的回调函数使用时通常只涉及到HTTP请求请求行和请求头的内容,如果HTTP请求中带有其它附加数据的话需要单独绑定回调函数处理。比如带有HTTP请求带有文件上传:

AsyncWebServer server(80); 

void upload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
  if(!index){
    Serial.printf("UploadStart: %s\n", filename.c_str());
  }
  for(size_t i=0; i<len; i++){
    Serial.write(data[i]);
  }
  if(final){
    Serial.printf("UploadEnd: %s, %u B\n", filename.c_str(), index+len);
  }
}

void callback(AsyncWebServerRequest *request){request->send(200);}

void setup()
{
	server.on("/", HTTP_POST, callback, upload); // 增加onUpload时回调函数
}

再或者请求中有其它形式数据在主体中:

AsyncWebServer server(80); 

void upload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){}

void body(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){
  if(!index){
    Serial.printf("BodyStart: %u B\n", total);
  }
  for(size_t i=0; i<len; i++){
    Serial.write(data[i]);
  }
  if(index + len == total){
    Serial.printf("BodyEnd: %u B\n", total);
  }
}

void callback(AsyncWebServerRequest *request){request->send(200);}

void setup()
{
	server.on("/", HTTP_POST, callback, upload, body); // 增加onUpload时和onBody时回调函数
}

在这里插入图片描述
上面演示了onUpload和onBody的情况,更进一步的现在很多时候body中收到的数据都是 json 形式的,面对这种形式的数据,除了直接在onBody中读取解析外还有别的方式可以处理:

#include <ArduinoJson.h>
#include <AsyncJson.h>

syncWebServer server(80); 

AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/url", [](AsyncWebServerRequest *request, JsonVariant &json) {
  JsonObject& jsonObj = json.as<JsonObject>();
  // ...
});

void setup()
{
	server.addHandler(handler);
}

ESPAsyncWebServer中对于json的处理用到了ArduinoJson,需要另外安装,其安装使用说明可以参考下面文章:
《C++ Json库ArduinoJson介绍及使用说明》

上面所有情况都是已经确定了URL的情况,如果URL不确定,想要提供一种通用的方案的话可以使用下面的几个方法:

// 下面几个方法需要填入各自对应形式的回调函数
  server.onNotFound(onRequestCallBack);
  server.onFileUpload(onUploadCallBack);
  server.onRequestBody(onBodyCallBack);

URL重写

AsyncWebServer对象提供了rewrite()方法用来重写URL,实现服务器内部的跳转:

server.rewrite("/", "/lalala"); // 用户访问"/"时,服务器内部会执行"/lalala"的回调函数

server.on("/lalala", HTTP_GET, [](AsyncWebServerRequest *request){request->send(200, "text/plain", "lalala~~~");});

在这里插入图片描述
除了上面给出的方式对url的重写以外还可以自定义重写规则,相关的说明可以参考项目官方文档中 Param Rewrite With Matching 章节。

过滤器

ESPAsyncWebServer有过滤器(filters)功能,可以对客户端发起的HTTP请求进行选择性执行:

server.on("/", HTTP_GET, callback1).setFilter(ON_AP_FILTER); // ESP32工作在AP模式时起效
server.on("/", HTTP_GET, callback2).setFilter(ON_STA_FILTER); // ESP32工作在STA模式时起效

server.rewrite("/", "/ap").setFilter(ON_AP_FILTER); // ESP32工作在AP模式时起效
server.rewrite("/", "/sta").setFilter(ON_STA_FILTER); // ESP32工作在STA模式时起效

bool userFilter(AsyncWebServerRequest *request){return true;} // 自定义规则
server.on("/", HTTP_GET, callback).setFilter(userFilter); // 当userFilter返回true时起效

在这里插入图片描述

移除事件处理和重写

如果想要移除已绑定过的事件处理和重写可以使用以下方式:

// save callback for particular URL path
auto handler = server.on("/some/path", [](AsyncWebServerRequest *request){
  //do something useful
});
// when you don't need handler anymore remove it
server.removeHandler(&handler);

// same with rewrites
server.removeRewrite(&someRewrite);

server.onNotFound([](AsyncWebServerRequest *request){
  request->send(404);
});

// remove server.onNotFound handler
server.onNotFound(NULL);

// remove all rewrites, handlers and onNotFound/onFileUpload/onRequestBody callbacks
server.reset();

需要特别注意一点的是某个链接如果已经绑定过回调函数,想要更换回调函数的话必须按照上面方式先删除先前的绑定,然后再绑定新的回调函数。

总结

ESPAsyncWebServer事件处理绑定基础的就是上面这些内容,更多内容可以查看项目官方的文档和例程,或者我的其他ESPAsyncWebServer的文章:
ESPAsyncWebServer项目地址:https://github.com/me-no-dev/ESPAsyncWebServer
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:快速入门》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:事件处理绑定》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:请求与响应》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:静态文件和模板引擎》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:WebSocket和EventSource》

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!要在Arduino ESP32上使用ESPAsyncWebServer来指定本地端口连接TCP,请按如下步骤操作: 1. 首先,您需要在Arduino IDE中安装ESPAsyncWebServer。可以通过打开Arduino IDE,选择“工具” > “管理”,然后搜索并安装“ESPAsyncWebServer来完成安装。 2. 创建一个新的Arduino ESP32项目,并在项目中包含ESPAsyncWebServer。您可以通过在Arduino IDE中选择“工具” > “” > “ESPAsyncWebServer”来包含该。 3. 在您的Arduino ESP32项目中,使用以下代码创建一个Web服务器并指定端口: ``` #include <WiFi.h> #include <ESPAsyncWebServer.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; AsyncWebServer server(80); void setup(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain", "Hello, world"); }); server.begin(); } void loop(){ } ``` 在上面的代码中,我们首先连接到Wi-Fi网络,然后创建一个名为“server”的AsyncWebServer对象,并将其绑定到80端口。我们还创建了一个处理HTTP GET请求的回调函数,并将其绑定到“/”路径。最后,我们使用server.begin()函数启动服务器。 4. 如果您想将服务器绑定到不同的端口,请将以下代码行中的“80”更改为所需的端口: ``` AsyncWebServer server(80); ``` 例如,如果您想将服务器绑定到端口8080,则可以将上面的代码行更改为: ``` AsyncWebServer server(8080); ``` 请注意,如果您更改了端口号,则需要使用新的端口号访问服务器。例如,如果您将服务器绑定到端口8080,则应该使用“http://your_esp32_IP_address:8080/”来访问服务器。 希望这可以回答您的问题!如果您有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值