ESP32-HTTP_webServer库(Arduino)
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服务器的基本步骤
-
引入相应库:
#include <WebServer.h>通过引入
WebServer库,你可以使用其中定义的类和函数来轻松创建Web服务器。 -
声明WebServer对象并设置端口号:
WebServer server(80);在这里,你创建了一个名为
server的WebServer对象,并设置端口号为80。Web服务器通常使用端口80来监听HTTP请求。 -
使用on()方法注册链接与回调函数:
server.on("/", handleRoot); server.on("/haha", [](){server.send(200, "text/html", "Hello from /haha!"); });使用
on()方法注册了两个路径的处理函数。当访问根路径(“/”)时,会调用handleRoot函数。而当访问路径"/haha"时,使用Lambda函数直接发送一个包含"Hello from /haha!"的响应。 -
使用begin()方法启动服务器进行请求监听:
server.begin();通过调用
begin()方法,启动Web服务器开始监听请求。在这一步之前,你已经注册了路径和相应的处理函数。 -
使用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
-
on方法:server.on(path, HTTP_METHOD, handlerFunction);用于注册路径(
path)和相应的处理函数(handlerFunction)以及HTTP方法(HTTP_METHOD)。当有请求匹配到指定路径和方法时,将调用对应的处理函数。 -
send方法:server.send(statusCode, contentType, content);用于向客户端发送 HTTP 响应。你可以指定状态码 (
statusCode)、内容类型 (contentType) 和实际内容 (content)。 -
onNotFound方法:server.onNotFound(handlerFunction);用于注册一个处理函数,当请求的路径未找到时将调用该函数。
-
begin方法:server.begin();用于启动服务器,开始监听请求。
-
handleClient方法:server.handleClient();用于处理客户端的请求。通常需要在
loop函数中调用,以确保持续处理请求。 -
arg方法:
用于获取 HTTP 请求中的参数值的函数。查询参数是通过 URL 传递的键值对,出现在 URL 的问号?后面。
不了解URL请点击查看这篇文章:
https://editor.csdn.net/md/?articleId=135704158String value = server.arg("parameterName");这个函数会返回指定参数名 (
parameterName) 对应的值。例如,如果请求的 URL 是:http://example.com/path?name=John&age=25你可以使用
server.arg("name")来获取name参数的值,这将返回一个String对象,其值为 “John”。 -
pathArg方法:server.pathArg();用于从HTTP请求的路径中提取参数值
常见的HTTP状态码
以下是一些常见的HTTP状态码及其简要说明:
-
200 OK: 服务器成功处理了请求。
-
404 Not Found: 服务器无法找到请求的网页。这是最常见的客户端错误之一。
-
301 Moved Permanently: 被请求的网页已经永久移动到新的位置。客户端应该使用新的 URI 重新发起请求。
-
503 Service Unavailable: 服务器目前无法处理请求,通常是由于过载或维护。客户端可以稍后再次尝试。
-
401 Unauthorized: 请求未经授权,需要提供有效的身份验证信息。通常,这要求用户进行登录。
相关文章:
ESP32-HTTP_webServer库(Arduino)
ESP32-HTTP 介绍 ESP32是一款功能强大的微控制器,具有丰富的网络和通信功能。其中之一就是支持HTTP协议,这使得ESP32可以用于创建Web服务器。 HTTP是什么? HTTP(Hyper Text Transfer Protocol),即超文本传…...
无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件
在日常使用电脑时,我们可能会碰到一些系统错误提示,比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题,本文将深入探讨其成因,并提供几种不同的mfc100.dll解决方案。…...
[VulnHub靶机渗透]:billu_b0x 快速通关
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…...
Docker安装开源Blog(Typecho)
前言 首先这个镜像是centos7.9进行安装PHP环境,然后挂载目录去运行的,镜像大概300MB左右,没学过PHP,没办法给Dockerfile文件 参考文章:Docker安装Typecho | D-y Blog感知不强,图一乐https://www.wlul.top…...
【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版
背景: 原本是为了学习qml,需要下载一个design studio,而这个需要比较新版的安装程序,但新版的安装程序官方都是online安装。于是从官网找下载链接。毕竟是英文的,又心急,误打误撞中我选择了商业版试用。 其…...
数据操作——缺失值处理
缺失值处理 缺失值的处理思路 如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值 什么是缺失值 一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如…...
【刷题笔记4】
动态规划题目汇总 斐波那契数列:1,1,2,3,5,8,13…… 递归一把解决三类问题:1.数据定义是按照递归的(斐波那契数列)。2.问题解法是按递归算法实现的。 3.数据…...
cuda二进制文件中到底有些什么
大家好。今天我们来讨论一下,相比gcc编译器编译的二进制elf文件,包含有 cuda kernel 的源文件编译出来的 elf 文件有什么不同呢? 之前研究过一点 tvm。从 BYOC 的框架中可以得知,前端将模型 partition 成 host 和 accel(accel 表…...
怎么从视频中提取动图?一个方法快速提取gif
视频以连续的方式播放一系列图像帧,通过每秒播放的帧数(帧率)来创做,由于GIF动图则以循环播放一系列静态图像帧的方式展现动画效果。由于视频的优势在于流畅的动画、丰富的细节和长时间播放,因此常用于电影、电视节目、…...
String字符串的比较和hash函数减少哈希冲突
1.为什么比较字符串通过hash值比通过字符串本身效率更高 比较两个字符串的哈希值相对于比较两个字符串本身的效率更高,原因如下: 哈希函数具有快速计算的特性:哈希函数可以将一个字符串转换为一个固定长度的哈希值。这个转换过程通常是非常…...
【数据库原理】(38)数据仓库
数据仓库(Data Warehouse, DW)是为了满足企业决策分析需求而设计的数据环境,它与传统数据库有明显的不同。 一.数据库仓库概述 定义: 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持企业管理和…...
C++17新特性(四)已有标准库的拓展和修改
这一部分介绍C17对已有标准库组件的拓展和修改。 1. 类型特征拓展 1.1 类型特征后缀_v 自从C17起,对所有返回值的类型特征使用后缀_v,例如: std::is_const_v<T>; // C17 std::is_const<T>::value; // C11这适用于所有返回值的…...
软件是什么?前端,后端,数据库
软件是什么? 由于很多东西没有实际接触,很难理解,对于软件的定义也是各种各样。但是我还是不理解,软件开发中的前端,后端,数据库到底有什么关系呢! 这个问题足足困扰了三年半,练习时…...
Vue3+ElementUI 多选框中复选框和名字点击方法效果分离
现在的需求为 比如我点击了Option A ,触发点击Option A的方法,并且复选框不会取消勾选,分离的方法。 <el-checkbox-group v-model"mapWork.model_checkArray.value"> <div class"naipTypeDom" v-for"item …...
设计模式篇章(4)——十一种行为型模式
这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务,这个与结构型模式有点像,结构型可以理解为静态的组合,例如将不同的组件拼起来成为一个更大的组件;而行为型更是一种动态或者具有某个…...
Spring成长之路—Spring MVC
在分享SpringMVC之前,我们先对MVC有个基本的了解。MVC(Model-View-Controller)指的是一种软件思想,它将软件分为三层:模型层、视图层、控制层 模型层即Model:负责处理具体的业务和封装实体类,我们所知的service层、poj…...
架构篇05-复杂度来源:高可用
文章目录 计算高可用存储高可用高可用状态决策小结 今天,我们聊聊复杂度的第二个来源高可用。 参考维基百科,先来看看高可用的定义。 系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。 这个定义…...
C#调用Newtonsoft.Json将bool序列化为int
使用Newtonsoft.Json将数据对象序列化为Json字符串时,如果有布尔类型的属性值时,一般会将bool类型序列化为字符串,true值序列化为true,false值序列化为false。如下面的类型序列化后的结果如下: public class UserInfo…...
【Linux系统编程】环境变量详解
文章目录 1. 环境变量的基本概念2. 如何理解呢?(测试PATH)2.1 切入点1查看具体的环境变量原因剖析常见环境变量 2.2 切入点2给PATH环境变量添加新路径将我们自己的命令拷贝到PATH已有路径里面 2.3 切入点3 3. 显示所有环境变量4. 测试HOME5. …...
智能合约介绍
莫道儒冠误此生,从来诗书不负人 目录 一、什么是区块链智能合约? 二、智能合约的发展背景 三、智能合约的优势 四、智能合约的劣势 五、一些关于智能合约的应用 总结 一、什么是区块链智能合约? 智能合约,是一段写在区块链上的代码,一…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
