【自学嵌入式(9)ESP8266网络服务器的使用】
ESP8266网络服务器的使用
- ESP8266WiFi 库
- ① WiFiClass
- ② WiFiClient
- ③ WiFiServer
- ④ WiFiUDP
- ESP8266WiFiMulti 库
- ① WiFiMulti
- ESP8266WebServer 库
- ① ESP8266WebServer
- 网络服务器实例
- 在浏览器中控制ESP8266指示灯
- 将开发板引脚状态显示在网页中
在之前的文章中,曾经编写过两个ESP8266的通信,但对于其背后的原理和调用的库并不熟悉,因此本文章来恶补一下这方面内容。按照惯例,首先介绍一些有关ESP8266网络服务器的库、类以及方法,接着通过几个示例更好理解这些库的作用。

ESP8266WiFi 库
ESP8266WiFi 库主要用于管理 WiFi 连接和网络通信。它能够提供包括 WiFi 连接、TCP/UDP 通信等功能。以下对其重要类和方法解析。
① WiFiClass
用于管理 WiFi 连接。ESP8266WiFi库中为其配置了WiFiClass类的实例实例对象WiFi,因此通常在程序中,我们无需再专门为其创建一个对象,这方便了我们的程序开发效率。
重要方法:
begin(const char* ssid, const char* password): 连接到指定的 WiFi 网络status(): 返回当前 WiFi 连接状态(如 WL_CONNECTED)localIP(): 获取 ESP8266 的本地 IP 地址softAP(const char* ssid, const char* password): 将 ESP8266 设置为 AP 模式(默认为STP模式)disconnect(): 断开当前 WiFi 连接mode(WiFiMode_t mode): 设置WiFi模式,参数mode的值可以是WIFI_STA 、 WIFI_AP 、 WIFI_AP_STA 、 WIFI_OFF 四种
② WiFiClient
用于创建 TCP 客户端,与服务器通信,通常需要手动创建。
重要方法:
connect(const char* host, uint16_t port): 连接到指定的服务器。print() / println(): 向服务器发送数据。available(): 检查是否有数据可读。read(): 读取接收到的数据。stop(): 关闭连接。
③ WiFiServer
用于创建 TCP 服务器,监听客户端连接,通常需要手动创建。
重要方法:
begin(): 启动服务器。available(): 检查是否有客户端连接。client(): 获取连接的客户端对象。
④ WiFiUDP
用于实现 UDP 通信,通常需要手动创建。
重要方法:
begin(uint16_t port): 启动 UDP 服务并监听指定端口。beginPacket(IPAddress ip, uint16_t port): 开始发送 UDP 数据包。write(): 发送数据。endPacket(): 结束数据包发送。parsePacket(): 检查是否有 UDP 数据包到达。read(): 读取接收到的 UDP 数据。remoteIP(): 获取发送方的IP地址,返回一个 IPAddress 对象。remotePort(): 获取发送方的端口号,返回一个 IPAddress 对象。
ESP8266WiFiMulti 库
ESP8266WiFiMulti 库是 ESP8266WiFi 库的扩展,用于管理多个 WiFi 网络。它可以自动尝试连接预配置的多个 WiFi 网络,直到成功连接其中一个。
① WiFiMulti
用于管理多个 WiFi 网络,通常创建一个对象即可。
重要方法:
addAP(const char* ssid, const char* password): 添加一个 WiFi 网络到列表中。run(): 尝试连接列表中的 WiFi 网络,返回连接状态。cleanAPlist(): 清除所有已配置的 WiFi 网络。
ESP8266WebServer 库
ESP8266WebServer 库用于在 ESP8266 上创建简单的 HTTP 服务器,处理客户端请求并返回响应。适用于构建 Web 控制界面或 RESTful API。
① ESP8266WebServer
用于创建 HTTP 服务器。
重要方法:
begin(): 启动服务器。handleClient(): 处理客户端请求。on(const char* uri, HTTPMethod method, THandlerFunction handler): 注册路由和处理函数。send(): 向客户端发送响应(如 send(200, “text/plain”, “Hello World”))。arg():获取客户端请求中的参数值。hasArg(): 检查请求中是否包含某个参数。uri(): 获取客户端请求的资源,返回所请求的资源名称streamFile(File &file, const String& contentType): 将指定文件内容以流的形式发送给客户端
网络服务器实例
在浏览器中控制ESP8266指示灯
#include <ESP8266WiFi.h> // 导入ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // 导入ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // 导入ESP8266WebServer库ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象wifiMultiESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口void setup(void){Serial.begin(9600); // 启动串口通讯pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED// 将需要连接的一系列WiFi ID和密码输入这里wifiMulti.addAP("josh", "38669836");wifiMulti.addAP("STABiPhone", "20040822Wsy");wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的Serial.println("Connecting ..."); // 尝试使用存储的密码连接int i = 0;while (wifiMulti.run() != WL_CONNECTED) { // 通过wifiMulti.run()检测是否连接成功delay(1000);Serial.print(i++);Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。}// 跳出循环代表WiFi连接成功,将通过串口监视器输出连接成功信息 Serial.println('\n');Serial.print("Connected to ");Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称Serial.print("IP address:\t");Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266的IP地址esp8266_server.begin(); // 启动网站服务esp8266_server.on("/", HTTP_GET, handleRoot); // 设置服务器根目录的函数'handleRoot'esp8266_server.on("/LED", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED'esp8266_server.onNotFound(handleNotFound); // 设置处理404的函数'handleNotFound'Serial.println("HTTP esp8266_server started"); // 启动成功
}void loop(void){esp8266_server.handleClient(); // 检查http服务器访问
}/*handleRoot()函数每当有客户端访问NodeMCU服务器根目录时,请求方式为GETLED页面中当用户按下按钮时,浏览器将会向ESP8266的/LED页面发送HTTP请求,请求方式为POST。ESP8266接收到此请求后将会执行handleLED函数内容*/
void handleRoot() { esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}//处理LED控制请求的函数handleLED()
void handleLED() { digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));// 改变LED的点亮或者熄灭状态esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录esp8266_server.send(303); // 发送Http相应代码303跳转
}// 设置处理404情况的函数handleNotFound()
void handleNotFound(){esp8266_server.send(404, "text/plain", "404: Not found"); // 向浏览器发送文字 "404: Not found"
}


将开发板引脚状态显示在网页中
本程序通过测试flash引脚的状态(默认高电平,按住时低电平)来运行,手动刷新,可以更好了解这种用法
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
#define buttonPin 0 // 按钮引脚GPIO0连接flashESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象wifiMultiESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)bool pinState; // 存储引脚状态变量void setup(){Serial.begin(9600); // 启动串口通讯pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式wifiMulti.addAP("STABiPhone", "20040822Wsy");wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");Serial.println("Connecting ...");int i = 0; while (wifiMulti.run() != WL_CONNECTED) {delay(1000);Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。}// 此处while循环判断是否跳出循环的条件。// WiFi连接成功后将通过串口监视器输出连接成功信息 Serial.println('\n'); // WiFi连接成功后Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。Serial.println(WiFi.SSID()); // 连接的WiFI名称Serial.print("IP address:\t");Serial.println(WiFi.localIP()); // NodeMCU的IP地址esp8266_server.begin(); // 启动网站服务 esp8266_server.on("/", handleRoot); // 设置服务器根目录即'/'的函数'handleRoot'esp8266_server.onNotFound(handleNotFound);// 设置处理404情况的函数'handleNotFound' Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}void loop(){esp8266_server.handleClient(); // 处理http服务器访问pinState = digitalRead(buttonPin); // 获取引脚状态
}void handleRoot() { String displayPinState; // 存储按键状态的字符串变量if(pinState == HIGH){ // 当按键引脚0为高电平displayPinState = "Button State: HIGH"; // 字符串赋值高电平信息} else { // 当按键引脚0为低电平displayPinState = "Button State: LOW"; // 字符串赋值低电平信息}esp8266_server.send(200, "text/plain", displayPinState); // 向浏览器发送按键状态信息
}// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){esp8266_server.send(404, "text/plain", "404: Not found") // NodeMCU将调用此函数。
}


相关文章:
【自学嵌入式(9)ESP8266网络服务器的使用】
ESP8266网络服务器的使用 ESP8266WiFi 库① WiFiClass② WiFiClient③ WiFiServer④ WiFiUDP ESP8266WiFiMulti 库① WiFiMulti ESP8266WebServer 库① ESP8266WebServer 网络服务器实例在浏览器中控制ESP8266指示灯将开发板引脚状态显示在网页中 在之前的文章中,曾…...
危化品经营单位安全管理人员的职责及注意事项
危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任,以下是其主要职责及注意事项: 职责 1. 安全制度建设与执行:负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案,确保这些制度符合国家相关法…...
项目实战--网页五子棋(匹配模块)(5)
上期我们实现了websocket后端的大部分代码,这期我们实现具体的匹配逻辑 1. 定义Mather类 我们新建一个Matcher类用来实现匹配逻辑 Component public class Matcher {//每个匹配队列代表不同的段位,这里约定每一千分为一个段位private ArrayList<Queue<User…...
mysql 迁移到人大金仓数据库
我是在windows上安装了客户端工具 运行数据库迁移工具 打开 在浏览器输入http://localhost:54523/ 账号密码都是kingbase 添加mysql源数据库连接 添加人大金仓目标数据库 添加好的两个数据库连接 新建迁移任务 选择数据库 全选 迁移中 如果整体迁移不过去可以单个单个或者几个…...
uniapp 网络请求封装(uni.request 与 uView-Plus)
一、背景 在开发项目中,需要经常与后端服务器进行交互;为了提高开发效率和代码维护性,以及降低重复性代码,便对网络请求进行封装统一管理。 二、创建环境文件 2.1、根目录新建utils文件夹,utils文件夹内新建env.js文…...
计算机网络与通讯知识总结
计算机网络与通讯知识总结 基础知识总结 1)FTP:文件传输 SSH:远程登录 HTTP:网址访问 2)交换机 定义:一种基于MAC地址实现局域网(LAN)内数据高速转发的网络设备,可为接入设备提供独享通信通道。 - 核心功能: 1.数据链路层(OSI第二层)工作,通过MAC地址…...
DPVS-2:单臂负载均衡测试
上一篇编译安装了DPVS,这一篇开启DPVS的负载均衡测试 : 单臂 FULL NAT模式 拓扑-单臂 单臂模式 DPVS 单独物理机 CLINET,和两个RS都是另一个物理机的虚拟机,它们网卡都绑定在一个桥上br0 , 二层互通。 启动DPVS …...
open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题
项目地址:GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上,请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…...
交通物联网:概念、历史、现状与展望
交通物联网:概念、历史、现状与展望 李升伟 李昱均 一、概念 交通物联网(Internet of Vehicles, IoV)是物联网(IoT)在交通领域的延伸,旨在通过信息传感设备,实现车、路、人、云之间的全方位连…...
如何实现应用程序与中间件的类进行隔离
以下是一些可以实现类似阿里巴巴 Pandora 功能的框架和工具,这些项目可以帮助你实现类隔离以及中间件和应用的 JAR 包隔离: 1. Pandora Boot Pandora Boot 是阿里巴巴开源的一个基于 Pandora 的轻量级隔离容器,用于管理第三方包,…...
MySQL 数据库基础
1. MySQL 数据库基础 在这一部分,我们将学习 MySQL 的基本概念和常见的数据库操作,帮助你掌握如何创建数据库、表,并进行数据的增、删、改操作。同时,我们还会探讨一些常见的错误示例及其原因,帮助你避免常见的陷阱。…...
微服务即时通信系统---(三)框架学习
目录 brpc RPC框架 核心概念 工作原理 介绍 安装 头文件包含和编译时指明库 类与接口介绍 日志输出类与接口 protobuf类与接口 Closure类 RpcController类 服务端类与接口 ServerOptions类 Server类 ClosureGuard类 HttpHeader类 Controller类 客户端类与…...
解决Spring Data JPA set值后自动更新到数据库问题
出现问题: 通过EntityManager查询出数据保存到对象中,但是向对象set值后就自动更新到数据库中去了。 Hibernate对象的三种状态 1、瞬时态:对象刚new出来,还未通过save方法保存到数据库,或通过游离态对象、持久化态对象…...
心理咨询小程序的未来发展
还在眼巴巴看着心理咨询行业的巨大蛋糕却无从下口?今天就来聊聊心理咨询小程序的无限潜力 据统计,全球超 10 亿人受精神心理问题困扰,国内心理健康问题也日益突出,心理咨询需求猛增。可传统心理咨询预约难,费用高&…...
STM32-智能台灯项目
一、项目需求 1. 红外传感器检测是否有人,有人的话实时检测距离,过近则报警;同时计时,超过固定时间则报警; 2. 按键 1 切换工作模式:智能模式、按键模式、远程模式; 3. 智能模式下,根…...
c# —— StringBuilder 类
StringBuilder 类是 C# 和其他一些基于 .NET Framework 的编程语言中的一个类,它位于 System.Text 命名空间下。StringBuilder 类表示一个可变的字符序列,它是为了提供一种比直接使用字符串连接操作更加高效的方式来构建或修改字符串。 与 C# 中的 stri…...
Linux 核心架构与组件(2025更新中)
一、Linux 核心架构与组件 内核架构 核心职责: 管理进程生命周期、内存分配、硬件驱动交互及文件系统操作。 模块化设计支持动态加载硬件驱动(如modprobe加载内核模块),提升灵活性和扩展性。 内存管理:…...
Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk = 35
Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk 35 三个报错信息如下 第一个 WARNING:We recommend using a newer Android Gradle plugin to use compileSdk 35This Android Gradle plugin (7.1.2) was tested up to compileSdk 32This warning…...
陀螺匠·企业助手v1.8 产品介绍
陀螺匠企业助手是一套采用Laravel 9框架结合Swoole高性能协程服务与Vue.js前端技术栈构建的新型智慧企业管理与运营系统。该系统深度融合了客户管理、项目管理、审批流程自动化以及低代码开发平台,旨在为企业提供一站式、数字化转型的全方位解决方案,助力…...
文件包含-session2
[题目信息]: 题目名称题目难度文件包含-session22 [题目考点]: 由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意…...
FairyGUI按钮动效实战:从点击缩放+音效到复杂转场,一个完整项目案例拆解
FairyGUI按钮动效实战:从点击反馈到复杂转场的全流程解决方案 在游戏界面开发中,按钮动效不仅仅是装饰,更是用户体验的关键组成部分。一个精心设计的按钮动效能够显著提升用户的操作反馈感,而流畅的界面转场则能增强应用的沉浸感…...
发现一款超好用的 Markdown 一键排版工具
作为一名经常写技术文章的博主,排版一直是让我头疼的问题。最近发现了一款在线排版工具,用了一段时间后觉得非常不错,分享给大家! 一、为什么需要排版工具? 在内容创作时代,优质内容是王道,而精…...
3分钟搞定B站缓存视频:m4s转MP4终极免费工具指南
3分钟搞定B站缓存视频:m4s转MP4终极免费工具指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了喜欢的视频&a…...
Windows平台安卓应用安装难题的完美解决方案:APK Installer全面指南
Windows平台安卓应用安装难题的完美解决方案:APK Installer全面指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接安装安卓应用…...
K8s访问控制
用cluster-admin的权限随便操作,所有 Pod 之间网络全通,反正测试环境怎么玩都无所谓。 但当你的集群上了生产,跑了核心业务,你就会发现问题:开发同学误操作,把线上的 Deployment 删了,整个服务挂…...
Time-LLM社区生态:从NeuralForecast到PyPOTS的集成之路
Time-LLM社区生态:从NeuralForecast到PyPOTS的集成之路 【免费下载链接】Time-LLM [ICLR 2024] Official implementation of " 🦙 Time-LLM: Time Series Forecasting by Reprogramming Large Language Models" 项目地址: https://gitcode.c…...
终极指南:如何参与End-To-End开源加密项目开发
终极指南:如何参与End-To-End开源加密项目开发 【免费下载链接】end-to-end End-To-End is a crypto library to encrypt, decrypt, digital sign, and verify signed messages (implementing OpenPGP) 项目地址: https://gitcode.com/gh_mirrors/en/end-to-end …...
别再搞混了!LP/mm、Cycles/pixel这些分辨率单位到底怎么用?附换算表
分辨率单位全解析:从LP/mm到Cycles/pixel的实战指南 每次看到镜头参数表里那些LP/mm、Cycles/pixel之类的术语,是不是感觉像在读天书?上周我帮朋友选工业相机时,发现不同厂商用不同单位标注分辨率,结果差点买错设备。今…...
全球首份AGI跨国治理白皮书深度拆解(2026奇点大会闭门纪要首次公开)
第一章:全球首份AGI跨国治理白皮书的战略定位与历史坐标 2026奇点智能技术大会(https://ml-summit.org) 这份白皮书并非技术路线图的延伸,而是人类在通用人工智能临界点前主动构筑的第一道制度性防火墙。它诞生于2025年联合国人工智能治理特别会议框架…...
浙政钉(专有钉钉)应用免登实战:从零到一构建安全门户
1. 认识浙政钉与专有钉钉 第一次接触浙政钉时,我也被各种钉钉版本搞得一头雾水。简单来说,钉钉就像是个基础版,专有钉钉是它的企业定制版,而浙政钉则是专有钉钉在浙江省政府场景下的特殊版本。这就像手机系统:安卓是基…...
