【自学嵌入式(9)ESP8266网络服务器的使用】

ESP8266网络服务器的使用

  • ESP8266WiFi 库
    • ① WiFiClass
    • ② WiFiClient
    • ③ WiFiServer
    • ④ WiFiUDP
  • ESP8266WiFiMulti 库
    • ① WiFiMulti
  • ESP8266WebServer 库
    • ① P8266WebServer
  • 网络服务器实例
    • 在浏览器中控制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。

① P8266WebServer

用于创建 HTTP 服务器。

重要方法:

  • begin(): 启动服务器。
  • handleClient(): 处理客户端请求。
  • on(const char* uri, HTTPMethod method, THandlerFunction handler): 注册路由和处理函数。
  • send(): 向客户端发送响应(如 send(200, “text/plain”, “Hello World”))。
  • arg(): 获取客户端请求中的参数值。
  • hasArg(): 检查请求中是否包含某个参数。

网络服务器实例

在浏览器中控制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将调用此函数。
}

在这里插入图片描述
按住flash效果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch3d安装记录

官方安装教程&#xff1a; https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md 通过pip 或conda 可以很容易安装上预编译好的包&#xff0c; 安装过程不会报错&#xff0c; 但是使用的时候就会报各种错误 &#xff0c;原因是预编译好的包跟自己的环境不一定…

【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示

代码链接 摘要 摘要写作总结&#xff1a; 1.提出 两个关键点 &#xff08;视觉语言模型【模型】 少量工业异常检测【方向】&#xff09; 2.想要解决的问题 3.针对上述问题&#xff0c;本文提出了一种什么【方法】的什么【应用方面】方法【模型名】 4.具体讲方法的步骤 5.实验…

【PostgreSQL】如何通过调整PostgreSQL配置参数提高数据库性能

如何通过调整PostgreSQL配置参数提高数据库性能 1. 数据库初始性能2. 内存相关参数3. WAL&#xff08;Write-Ahead Logging&#xff09;相关参数4. 并行查询相关参数5. 连接相关参数6. 根据情况调整 1. 数据库初始性能 使用pgbench在更新PostgreSQL数据库配置前先测试下数据库…

AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践

前言 自2022年末ChatGPT的问世&#xff0c;大语言模型&#xff08;LLM&#xff09;技术引发全球关注。在大模型技术落地的最佳实践中&#xff0c;智能体&#xff08;Agent&#xff09;架构显现出巨大潜力&#xff0c;成为业界的普遍共识&#xff0c;各大公司也纷纷启动Agent技…

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;点击这里立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 前言 – 人工智能教程https://www.captainbed.cn/l…

ChātGPT赋能的“SolidWorks工具箱”:重塑3D设计效率新标杆

ChātGPT精心打造的“SolidWorks工具箱”正逐步成为3D设计领域中的一颗璀璨新星&#xff0c;其集高效、便捷与创新于一身&#xff0c;为用户带来了前所未有的设计体验。以下是对这一革命性工具箱的深度剖析与美化呈现&#xff1a; 一、核心功能&#xff1a;重塑设计流程&#x…

php处理图片出现内存溢出(Allowed memory size of 134217728 bytes exhausted)

错误&#xff1a; 最近做图片上传功能时发现上传某些图片时报内存溢出错误。如下所示&#xff1a; {"code": 0,"msg": "Allowed memory size of 134217728 bytes exhausted (tried to allocate 24576 bytes)","data": {"code&q…

Spring——SpringSecurity开发经验实战

摘要 本文介绍了一个简单的 Spring Security 实战示例&#xff0c;涵盖基本的身份验证和授权流程。首先介绍了 Spring Security 是一个强大的安全框架&#xff0c;用于在 Spring 应用中实现身份验证、授权以及保护应用免受常见安全攻击。接着详细阐述了项目结构、添加 Spring …

Innovus中快速获取timing path逻辑深度的golden脚本

在实际项目中我们经常会遇到一条timing path级数特别多&#xff0c;可能是一两页都翻不完。此时&#xff0c;我们大都需要手工去数这条path上到底有哪些是设计本身的逻辑&#xff0c;哪些是PR工具插入的buffer和inverter。 数字IC后端手把手培训教程 | Clock Gating相关clock …

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

数据结构绪论

一-数据结构的基本概念 1-数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 2-数据元素 数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理。…

kafka基本知识

什么是 Kafka&#xff1f; Apache Kafka 是一个开源的分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后来成为 Apache 软件基金会的一部分。Kafka 主要用于构建实时数据管道和流处理应用程序。它能够高效地处理大量的数据流&#xff0c;广泛应用于日志收集、数…

DeepSeek R1本地+私有云版医疗AI部署开发成功案例技术剖析

1. 引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(AI)在医疗领域的应用正逐渐成为推动医疗行业变革的重要力量。近年来,医疗 AI 取得了显著的进展,从疾病诊断、药物研发到医疗管理等各个环节,AI 技术都展现出了巨大的潜力。它能够处理和分析海量的医疗数据,为…

网络安全-openssl工具

OpenSSl是一个开源项目&#xff0c;包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准&#xff0c;并且拥有比较长的历史&#xff0c;现在几乎所有的服务器软件和很多客户端都在使用openssl&#xff0c;其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下&#xff0c;你和远方的朋友要进行一场电话交流&#xff0c;但这通电话不仅仅是随便聊聊&#xff0c;而是要传递一封重要的信件。为了确保这…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

el-dropdown选中效果

vue2版本 <template><el-dropdown size"mini" command"handleCommand"><span class"el-dropdown-link">{{ selectedOption }}<i class"el-icon-arrow-down el-icon--right"></i></span><el-d…

Deepseek首页实现 HTML

人工智能与未来&#xff1a;机遇与挑战 引言 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了突飞猛进的发展。从语音助手到自动驾驶汽车&#xff0c;AI 正在深刻地改变我们的生活方式、工作方式以及社会结构。然而&#xff0c;随着 AI 技术的普及…

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…