ESP32-HTTP_webServer库(Arduino)

news2024/11/26 20:37:44

ESP32-HTTP

介绍


ESP32是一款功能强大的微控制器,具有丰富的网络和通信功能。其中之一就是支持HTTP协议,这使得ESP32可以用于创建Web服务器。

HTTP是什么?
HTTP(Hyper Text Transfer Protocol),即超文本传输协议,是一种无状态的、建立在TCP之上的连接。其基本的工作流程是:客户端发送一个HTTP请求,说明自己想要访问的资源以及请求的动作;服务端在收到请求后,开始处理请求,并根据请求的内容做出响应。

ESP32上,我们可以使用其内置的HTTP Server组件来运行一个轻量级的Web服务器。这个服务器组件能够根据具体的配置分配内存和资源,并返回该服务器实例的句柄。通过这个句柄,我们可以控制服务器的各种行为,例如启动、停止等。

WebServer库用来做什么?
总而言之HTTP 服务器组件提供 websocket 支持,而WebServer库是一个专门用于HTTP协议通讯的库。它为开发者提供了一套简单易用的API,使得我们可以基于ESP32开发板快速地建立网络服务器。通过这个网络服务器,其他网络设备以及物联网设备都能通过HTTP协议来访问并实现物联网信息交流。

WebServer库的主要功能可以被分为两大部分:一部分是服务器运行管理,另一部分是处理客户端的HTTP请求。在服务器运行管理中,我们可以通过调用begin()函数来启动服务器,使用stop()函数来停止服务器,以及使用close()函数来关闭服务器。而在处理客户端的HTTP请求方面,库中包含了各种处理Get请求和Post请求的函数,这些函数可以帮助我们解析请求数据包,并回发响应数据包。

基本流程

以下使用WebServer库创建一个简单的Web服务器的基本步骤

  1. 引入相应库:

    #include <WebServer.h>
    

    通过引入WebServer库,你可以使用其中定义的类和函数来轻松创建Web服务器。

  2. 声明WebServer对象并设置端口号:

    WebServer server(80);
    

    在这里,你创建了一个名为serverWebServer对象,并设置端口号为80。Web服务器通常使用端口80来监听HTTP请求。

  3. 使用on()方法注册链接与回调函数:

    server.on("/", handleRoot);
    server.on("/haha", [](){
        server.send(200, "text/html", "Hello from /haha!");
    });
    

    使用on()方法注册了两个路径的处理函数。当访问根路径(“/”)时,会调用handleRoot函数。而当访问路径"/haha"时,使用Lambda函数直接发送一个包含"Hello from /haha!"的响应。

  4. 使用begin()方法启动服务器进行请求监听:

    server.begin();
    

    通过调用begin()方法,启动Web服务器开始监听请求。在这一步之前,你已经注册了路径和相应的处理函数。

  5. 使用handleClient()方法处理来自客户端的请求:

    void loop() {
        server.handleClient();
    }
    

    loop()函数中,使用server.handleClient()不断处理来自客户端的请求。这是一个循环,确保服务器一直处于监听状态。

这个流程能够创建一个简单的Web服务器,处理不同路径的请求并发送相应的响应。确保你的ESP32正确连接到WiFi网络,然后你可以在浏览器中访问相应的IP地址,查看服务器的响应。

示例:

#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
const char *ssid = "**********";
const char *password = "**********";

WebServer server(80);

void handelRoot()
{
  String HTML=R"(
      <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Hello World</title>
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
    </html>
  )";
  
  server.send(200,"text/html",HTML);
}
void setup()
{
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.print("\nIP地址:");
  //获取ip地址
  Serial.println(WiFi.localIP());

  //注册链接与回调函数
  server.on("/", handelRoot);

  //用lambda函数
  server.on("/haha",[](){
    server.send(200,"text/html",R"(
      <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Hello World</title>
    </head>
    <body>
        <h1>你好世界</h1>
    </body>
    </html>
    )");
  });

  //没有页面
  server.onNotFound([](){server.send(200,"text/html;charset=utf-8","没有找到");});
  
  server.begin(); 
}
void loop()
{
  server.handleClient();
}

在浏览器中访问IP地址得到的响应
在这里插入图片描述

常用API

WebServer 常用的 API

  1. on 方法:

    server.on(path, HTTP_METHOD, handlerFunction);
    

    用于注册路径(path)和相应的处理函数(handlerFunction)以及HTTP方法(HTTP_METHOD)。当有请求匹配到指定路径和方法时,将调用对应的处理函数。

  2. send 方法:

    server.send(statusCode, contentType, content);
    

    用于向客户端发送 HTTP 响应。你可以指定状态码 (statusCode)、内容类型 (contentType) 和实际内容 (content)。

  3. onNotFound 方法:

    server.onNotFound(handlerFunction);
    

    用于注册一个处理函数,当请求的路径未找到时将调用该函数。

  4. begin 方法:

    server.begin();
    

    用于启动服务器,开始监听请求。

  5. handleClient 方法:

    server.handleClient();
    

    用于处理客户端的请求。通常需要在 loop 函数中调用,以确保持续处理请求。

  6. arg方法:
    用于获取 HTTP 请求中的参数值的函数。查询参数是通过 URL 传递的键值对,出现在 URL 的问号 ? 后面。
    不了解URL请点击查看这篇文章:
    https://editor.csdn.net/md/?articleId=135704158

    String value = server.arg("parameterName");
    

    这个函数会返回指定参数名 (parameterName) 对应的值。例如,如果请求的 URL 是:

    http://example.com/path?name=John&age=25
    

    你可以使用 server.arg("name") 来获取 name 参数的值,这将返回一个 String 对象,其值为 “John”。

  7. pathArg方法:

    server.pathArg();
    

    用于从HTTP请求的路径中提取参数值

常见的HTTP状态码

以下是一些常见的HTTP状态码及其简要说明:

  • 200 OK: 服务器成功处理了请求。

  • 404 Not Found: 服务器无法找到请求的网页。这是最常见的客户端错误之一。

  • 301 Moved Permanently: 被请求的网页已经永久移动到新的位置。客户端应该使用新的 URI 重新发起请求。

  • 503 Service Unavailable: 服务器目前无法处理请求,通常是由于过载或维护。客户端可以稍后再次尝试。

  • 401 Unauthorized: 请求未经授权,需要提供有效的身份验证信息。通常,这要求用户进行登录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1399818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何快速打开github

作为一个资深码农&#xff0c;怎么能不熟悉全球最大的同性交友社区——github呢&#xff0c;但头疼的是github有时能打开&#xff0c;有时打不开&#xff0c;这是怎么回事&#xff1f; 其实问题出在github.com解析DNS上&#xff0c;并不是需要FQ。下面提供一个方法&#xff0c;…

前端打同一个包可以从测试晋升到生产的配置方案

前端打同一个包从测试晋升到生产环境的方案&#xff0c;是一种高效、可靠且易于维护的部署方式。在这种方案中&#xff0c;前端代码在开发完成后&#xff0c;经过测试验证无误后&#xff0c;可以直接打包部署到生产环境&#xff0c;无需进行额外的配置或修改。这样可以减少部署…

HarmonyOS 应用开发入门

HarmonyOS 应用开发入门 前言 DevEco Studio Release版本为&#xff1a;DevEco Studio 3.1.1。 Compile SDK Release版本为&#xff1a;3.1.0&#xff08;API 9&#xff09;。 构建方式为 HVigor&#xff0c;而非 Gradle。 最新版本已不再支持 &#xff08;”Java、JavaScrip…

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘complex‘

文章目录 引言报错分析解决方案1&#xff1a;降低NumPy版本解决方案2&#xff1a;更改NumPy源码 结尾 引言 在Python编程的世界里&#xff0c;NumPy无疑占据着举足轻重的地位&#xff0c;它承担着处理大规模数值计算的重要任务。然而&#xff0c;与所有强大工具一样&#xff0…

晶振负载电容公式,怎么计算?

晶振&#xff0c;或称晶体振荡器&#xff0c;是电子设备中的关键元件&#xff0c;尤其在时序电路中扮演着重要角色。晶振的性能直接影响到整个电路的稳定性和精度。在晶振设计中&#xff0c;负载电容是一个重要的参数。理解如何计算负载电容对于正确配置和使用晶振至关重要。今…

Find My卡片正成为消费电子香饽饽,伦茨科技ST17H6x可以帮到您

今年CES许多公司发布支持苹果Find My的卡片产品&#xff0c;这种产品轻薄可充电&#xff0c;放在钱包、背包或者手提包可以防丢查找&#xff0c;在智能化加持下&#xff0c;防丢卡片使得人们日益关心自行车的去向。最新的防丢卡片与苹果Find My结合&#xff0c;智能防丢&#x…

Chatgpt+Comfyui绘图源码说明及本地部署文档

其他文档地址&#xff1a; ChatgptComfyui绘图源码运营文档 ChatgptComfyui绘图源码线上部署文档 一、源码说明 1、源码目录说明 app_home&#xff1a;app官网源码chatgpt-java&#xff1a;管理后台服务端源码、用户端的服务端源码chatgpt-pc&#xff1a;电脑网页前端源码cha…

Halcon 边缘提取

文章目录 算子Halcon edges_image 示例Halcon frei_amp 示例Halcon kirsch_amp示例Halcon sobel_amp示例Halcon sobel_amp 算子示例Halcon sobel_dir 算子示例Halcon close_edges关闭图像间隙示例Halcon close_edges_length关闭图像间隙示例 算子 edges_image 对于图像进行边缘…

64 C++对象模型探索。类对象占用空间问题分析

0.没有任何成员变量的空类&#xff0c;实际上占用空间为1字节。 这是因为当你的使用代码实例化一个类的时候&#xff0c;tea对象就有了空间&#xff0c;&tea是有地址的&#xff0c;那么你这个地址至少要占用1个字节才合理。 Teacher tea; 就像我们买房子&#xff0c;你的…

爬虫接口获取外汇数据(汇率,外汇储备,贸易顺差,美国CPI,M2,国债利率)

akshare是一个很好用的财经数据api接口&#xff0c;完全免费&#xff01;&#xff01;和Tushare不一样。 除了我标题显示的数据外&#xff0c;他还提供各种股票数据&#xff0c;债券数据&#xff0c;外汇&#xff0c;期货&#xff0c;宏观经济&#xff0c;基金&#xff0c;银行…

JDK 动态代理(Spring AOP 的原理)(面试重点)

代理模式 也叫委托模式.定义&#xff1a;为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤&#xff0c;在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对…

Stream toList不能滥用以及与collect(Collectors.toList())的区别

Stream toList()返回的是只读List原则上不可修改&#xff0c;collect(Collectors.toList())默认返回的是ArrayList,可以增删改查 1. 背景 在公司看到开发环境突然发现了UnsupportedOperationException 报错&#xff0c;想到了不是自己throw的应该就是操作collection不当。 发…

Jetbrains Writerside 使用教程

系列文章目录 前言 一、入门 Writerside 是基于 IntelliJ 平台的 JetBrains 集成开发环境。使用它可以编写、构建、测试和发布技术文档。 如果你想将 Writerside 作为另一个 JetBrains IDE 的插件&#xff0c;请参阅 Writerside 作为插件。 1.1 安装 Writerside&#xfeff;…

vue路由-全局前置守卫

1. 介绍 详见&#xff1a;全局前置守卫网址 使用场景&#xff1a; 对于支付页&#xff0c;订单页等&#xff0c;必须是登录的用户才能访问的&#xff0c;游客不能进入该页面&#xff0c;需要做拦截处理&#xff0c;跳转到登录页面 全局前置守卫的原理&#xff1a; 全局前置…

QT+opencv源码编译

时间记录&#xff1a;2024/1/20 一、版本介绍 QT5.12.7cmake3.22.0opencv4.5.4 二、编译步骤 &#xff08;1&#xff09;下载opencv源码&#xff0c;然后安装&#xff0c;opencv的安装即对源码的解压过程&#xff0c;解压后的文件目录如下 &#xff08;2&#xff09;openc…

stm32 FOC 电机介绍

今年开始学习foc控制无刷电机&#xff0c;这几天把所学整理一下&#xff0c;记录一下知识内容。 前言: 为什么要学习FOC? 1.电机控制是自动化控制领域重要一环。 2.目前直流无刷电机应用越来越广泛&#xff0c;如无人机、机械臂、云台、仿生机器人等等。 需要什么基础&…

最长公共前缀(Leetcode14)

例题&#xff1a; 分析&#xff1a; 我们可以先定义两个变量 i &#xff0c; j&#xff0c; j表示数组中的每一个字符串&#xff0c; i 表示每个字符串中的第几个字符。一列一列地进行比较&#xff0c;先比较第一列的字符&#xff0c;若都相同&#xff0c;则 i &#xff0c;继…

字节跳动 ByteHouse 云原生之路 – 计算存储分离与性能优化

01 起源 ByteHouse 的故事从字节跳动对于先进数据处理和分析的需求开始&#xff0c;这一需求随着公司业务规模的迅速扩张而日益增长&#xff0c;起源是对开源数据库管理系统 ClickHouse 的改造和增强。面对数据处理的高延迟、大规模数据操作的复杂性以及数据存储和处理成本的上…

记录一次QT乱码问题

问题描述 在敲陆文周的书《QT5开发及实例》的示例代码时&#xff0c;出现乱码&#xff0c;如下图所示 具体代码如下 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->treeWidget->clear();int groupSize 2;int ite…

Unity SnapScrollRect 滚动 匹配 列表 整页

展示效果 原理: 当停止滑动时 判断Contet的horizontalNormalizedPosition 与子Item的缓存值 相减,并得到最小值&#xff0c;然后将Content horizontalNormalizedPosition滚动过去 使用方式&#xff1a; 直接将脚本挂到ScrollRect上 注意&#xff1a;在创建Content子物体时…