arduino中基于ESPAsyncWebSrv实现web服务

一、介绍

ESPAsyncWebSrv是一个基于ESP-IDF和libAsyncWebSrv的异步Web服务器库。它提供了一个高度可定制的Web服务器,可以处理HTTP和HTTPS请求,并支持WebSocket和HTTP2协议。

ESPasyncWebSrv具有以下主要特点:

  1. 异步和非阻塞:ESPasyncWebSrv使用libasyncWebSrv库实现异步和非阻塞的网络处理,能够更好地处理多个并发请求,提高了服务器的性能和吞吐量。
  2. 可定制性:ESPasyncWebSrv提供了许多可配置的选项和回调函数,可以根据需要进行定制,满足不同的需求。
  3. 支持HTTP和HTTPS:ESPasyncWebSrv支持HTTP和HTTPS协议,可以提供安全的数据传输。
  4. 支持WebSocket和HTTP2:ESPasyncWebSrv支持WebSocket和HTTP2协议,可以实现双向通信和更高效的数据传输。
  5. 易于使用:ESPasyncWebSrv提供了简单的易用的API,使开发人员可以方便地集成到他们的项目中。

使用ESPasyncWebSrv,可以轻松地创建高度可定制的Web服务器,用于处理HTTP和HTTPS请求,实现双向通信和更高效的数据传输。它是ESP32和ESP8266等ESP芯片上开发Web应用程序的理想选择。

二、安装类库

        arduino IDE中顶部菜单:工具管理库或者直接在左侧工具第三个管理库,安装时提示有依赖库,选择全部安装

         

 

三、引入头文件并创建服务

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebSrv.h>

AsyncWebServer server(80);

四、打开串口通信,设置波特率位115200

        波特率(Baud rate)是指信号传输中,每秒钟传输的符号数。它通常用于衡量串行通信中的数据传输速率,单位为波特(Baud)或波特每秒(Baud per second,BPS)。在计算机通信领域中,波特率常用于描述串行通信中每秒钟传输的位数。例如,一个波特率为9600的串行通信口,其每秒钟传输9600个符号或9600个位。波特率越高,传输速率越快。

Serial.begin(115200);  

五、web服务器处理及响应

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

// Send a GET request to <IP>/get?message=<message>
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
        String message;
        if (request->hasParam(PARAM_MESSAGE)) {
            message = request->getParam(PARAM_MESSAGE)->value();
        } else {
            message = "No message sent";
        }
        request->send(200, "text/plain", "Hello, GET: " + message);
});

// Send a POST request to <IP>/post with a form field message set to <message>
server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request){
        String message;
        if (request->hasParam(PARAM_MESSAGE, true)) {
            message = request->getParam(PARAM_MESSAGE, true)->value();
        } else {
            message = "No message sent";
        }
        request->send(200, "text/plain", "Hello, POST: " + message);
});

server.onNotFound(notFound);

server.begin();

六、定义notfound

void notFound(AsyncWebServerRequest *request) {
    request->send(404, "text/plain", "Not found");
}

七、完整代码,本代码在安装完成扩展库后,arduino IDE示例代码中也能看到。

 代码部分还用到了wifi连接,将下面的ssid和password换成自己的wifi名字和密码即可

//
// A simple server implementation showing how to:
//  * serve static messages
//  * read GET and POST parameters
//  * handle missing pages / 404s
//

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebSrv.h>

AsyncWebServer server(80);

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

const char* PARAM_MESSAGE = "message";

void notFound(AsyncWebServerRequest *request) {
    request->send(404, "text/plain", "Not found");
}

void setup() {

    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.printf("WiFi Failed!\n");
        return;
    }

    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());

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

    // Send a GET request to <IP>/get?message=<message>
    server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
        String message;
        if (request->hasParam(PARAM_MESSAGE)) {
            message = request->getParam(PARAM_MESSAGE)->value();
        } else {
            message = "No message sent";
        }
        request->send(200, "text/plain", "Hello, GET: " + message);
    });

    // Send a POST request to <IP>/post with a form field message set to <message>
    server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request){
        String message;
        if (request->hasParam(PARAM_MESSAGE, true)) {
            message = request->getParam(PARAM_MESSAGE, true)->value();
        } else {
            message = "No message sent";
        }
        request->send(200, "text/plain", "Hello, POST: " + message);
    });

    server.onNotFound(notFound);

    server.begin();
}

void loop() {
}

八、server接受所有的post变量数据并显示在串口监测工具中

server.on("/saveConfig", HTTP_POST, [](AsyncWebServerRequest *request) {
  int paramsCount = request->params();  // 获取参数数量
  for(int i=0;i<paramsCount;i++){
    AsyncWebParameter* p = request->getParam(i);  // 获取第i个参数
    if(p->isPost()){  // 如果参数是POST类型
      Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());  // 输出参数名和参数值
    } else {
      Serial.printf("GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
    }
  }

  // 你的其他代码

});

下图是我的接受数据

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值