ESP8266 ArduinoIDE 搭建web服务器与客户端开发

news2024/11/15 13:39:48

一、wifi 相关配置

 

1.1 无线终端 wifi 模式

此模式中,esp8266 会连接到指定 wifi 进行工作。

#include <ESP8266WiFi.h>        // 本程序使用ESP8266WiFi库
 
const char* ssid     = "home";      // 连接WiFi名(此处使用home为示例)
const char* password = "12345678";          // 连接WiFi密码(此处使用12345678为示例)
                                            
void setup() {
  Serial.begin(9600);         // 启动串口通讯
  
  WiFi.begin(ssid, password);                  // 启动网络连接
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。
                                               
  Serial.println("");                          // WiFi连接成功后
  Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}
 
void loop() {                                   
}

 

 wifi 连接成功,esp8266 通过串口返回当前局域网 IP

1.2 接入点模式(热点模式 AP)

此模式中,esp8266 会开启一个指定名称和密码的热点进行工作。

#include <ESP8266WiFi.h>        // 本程序使用ESP8266WiFi库
 
const char *ssid = "taichi-maker"; // 这里定义将要建立的WiFi名称。此处以"taichi-maker"为示例
const char *password = "12345678";  // 这里定义将要建立的WiFi密码。此处以12345678为示例
 
void setup() {
  Serial.begin(9600);              // 启动串口通讯
  
  WiFi.softAP(ssid, password);     // 此语句是重点。WiFi.softAP用于启动NodeMCU的AP模式。

  Serial.print("Access Point: ");    // 通过串口监视器输出信息
  Serial.println(ssid);              // 告知用户NodeMCU所建立的WiFi名
  Serial.print("IP address: ");      // 以及NodeMCU的IP地址
  Serial.println(WiFi.softAPIP());   // 通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址
}
 
void loop() {

}

二、搭建HTTP网络服务器

2.1 hello world 程序

#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库

ESP8266WebServer esp8266_server(80);  // 建立ESP8266WebServer对象,对象名称为esp8266_server

const char* ssid     = "home";        // 连接WiFi名(此处使用home为示例)
const char* password = "123456"; // 连接WiFi密码(此处使用12345678为示例)

void setup(void){
  Serial.begin(9600);          // 启动串口通讯
  WiFi.begin(ssid, password);  // 启动网络连接
  
  int i = 0;                                 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(i++); Serial.print(' ');
  }
 
  // 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();                   //  开启web服务器
  esp8266_server.on("/", handleRoot);       //  访问根路由即调用 handlerRoot 函数处理
  esp8266_server.onNotFound(handleNotFound);        
  Serial.println("HTTP esp8266_server started"); //  告知用户ESP8266网络服务功能已经启动
}
 
void loop(void){
  esp8266_server.handleClient();     // 处理http服务器访问
}

void handleRoot() {   //处理网站根目录“/”的访问请求 
  esp8266_server.send(200, "text/plain", "Hello from ESP8266");   // 状态码 头报文 正文
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){                                        // 当浏览器请求的网络资源无法在服务器找到时,
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。
}

 

 

2.2 web LED 点灯案例

#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库

ESP8266WebServer esp8266_server(80);  // 建立ESP8266WebServer对象,对象名称为esp8266_server

const char* ssid     = "home";        // 连接WiFi名(此处使用home为示例)
const char* password = "123456"; // 连接WiFi密码(此处使用12345678为示例)

void setup(void){
  Serial.begin(9600);          // 启动串口通讯
  pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
  digitalWrite(LED_BUILTIN,1);// 改变LED的点亮或者熄灭状态
  WiFi.begin(ssid, password);  // 启动网络连接
  
  int i = 0;                                 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(i++); Serial.print(' ');
  }
 
  // 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();                   //  开启web服务器
  esp8266_server.on("/", handleRoot);       //  访问根路由即调用 handlerRoot 函数处理
  esp8266_server.on("/LED", HTTP_POST, handleLED);  // 设置处理LED控制请求的函数'handleLED'
  esp8266_server.onNotFound(handleNotFound);        
  Serial.println("HTTP esp8266_server started"); //  告知用户ESP8266网络服务功能已经启动
}
 
void loop(void){
  esp8266_server.handleClient();     // 处理http服务器访问
}

void handleLED(){
  digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
  esp8266_server.sendHeader("Location","/");
  esp8266_server.send(303);
}

void handleRoot() {   //处理网站根目录“/”的访问请求 
  esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){                                        // 当浏览器请求的网络资源无法在服务器找到时,
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。
}

 在这里改写了根目录,他会向客户端发送一个按钮的页面,点击即向 "/LED" 路由下发送 POST 请求。

void handleRoot() {   //处理网站根目录“/”的访问请求 
  esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}

由于我们之前绑定了这个相应,即会触发:

void handleLED(){
  digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
  esp8266_server.sendHeader("Location","/");
  esp8266_server.send(303);
}

他在给 LED 取反后又重定向到根目录,即可实现我们的效果。

 

三、ESP8266WebServer 库

在之前我们基本使用了 ESP8266WebServer 库的功能,下面我们来配合案例详细了解这个库的 API。

3.1 创建并启动 Web Server

#include <ESP8266WebServer.h>   //  ESP8266WebServer库
ESP8266WebServer esp8266_server(80);  // 建立ESP8266WebServer对象,对象名称为esp8266_server

此时实例化了一个名为 esp8266_server 的webServer 的对象。当实例化完成后即自动启动这个服务。当然,此时我们的 8266 需要已经配置好 wifi 才能被外部访问。

3.2 配置路由处理

esp8266_server.on("/LED", handleLED);  // 无论GET 或POST请求都会触发
esp8266_server.on("/LED", HTTP_POST, handleLED);  // 无论GET 或POST请求都会触发

void onNotFound(THandlerFunction fn);    //配置无效的路由 用于404

void onFileUpload(THandlerFunction fn);    //配置处理文件上传的handler

3.3 获取请求类型与参数案例

先用一个案例来演示:

#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库

ESP8266WebServer esp8266_server(80);  // 建立ESP8266WebServer对象,对象名称为esp8266_server

const char* ssid     = "home";        // 连接WiFi名(此处使用home为示例)
const char* password = "123456"; // 连接WiFi密码(此处使用12345678为示例)

void setup(void){
  Serial.begin(9600);          // 启动串口通讯
  pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
  digitalWrite(LED_BUILTIN,1);// 改变LED的点亮或者熄灭状态
  WiFi.begin(ssid, password);  // 启动网络连接
  
  int i = 0;                                 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(i++); Serial.print(' ');
  }
 
  // 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();                   //  开启web服务器
  esp8266_server.onNotFound(handleNotFound);        
  Serial.println("HTTP esp8266_server started"); //  告知用户ESP8266网络服务功能已经启动
  Serial.println("---------------------------------------");
}
 
void loop(void){
  esp8266_server.handleClient();     // 处理http服务器访问
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){ 
  Serial.print("url:");
  Serial.println(esp8266_server.uri());

  Serial.print("method:");
  Serial.println(esp8266_server.method());

  Serial.print("arg count:");
  Serial.println(esp8266_server.args());

  Serial.print("request host:");
  Serial.println(esp8266_server.hostHeader());

  Serial.print("auth:");
  Serial.println(esp8266_server.authenticate("123", "456"));

  Serial.println("---------------------------------------");
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。
}

使用 postman 工具发送消息

192.168.0.105/123、POST 请求、无参数、填入 authorization 账号:123 密码:456

串口即收到信息。对于这个库来说,POST 请求枚举类型是 3,所以返回了method:3,auth 也验证通过。

如果用浏览器访问 192.168.0.105 也会给出相应的返回值。

3.4 获取请求类型方法和参数合集

以下函数均是 ESP8266WebServer 的实例方法

ESP8266WebServer esp8266_server(80);
esp8266_server.url(); //这样调用即可
String url();                //获取请求的url
HTTPMethod method();         //获取请求方法
String arg(String name);     //获取请求参数的值 name:根据关键字name获取请求参数的值
String arg(int i);           //i:获取第i个请求参数的值
int args();                  //获取参数个数
bool hasArg(String name);    //是否存在某个参数

//设置需要收集的请求头 headerkeys[]:请求头的名字 headerkeysCount:请求头的个数
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
String header(String name);  //获取请求头参数 name:请求头名称
String header(int i);        //i:获取第i个请求头参数
String headerName(int i);    //获取请求头名字 i:获取第i个请求头名字
int headers();               //获取请求头个数
bool hasHeader(String name); //判断是否存在某个请求头
String hostHeader();         //获取请求头Host的值
bool authenticate(const char * username, const char * password);    //认证校验

四、响应客户端请求

4.1 响应案例

在 2.2 的点灯案例中,我们编写了 handleLED 函数。在这里我们使用了 sendHeader 和 send 两个客户端响应类函数。

其功能是设置响应头,并且设置为 303 状态码提示浏览器进行刷新。

void handleLED(){
  digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
  esp8266_server.sendHeader("Location","/");
  esp8266_server.send(303);
}

4.2 响应客户端方法和参数合集

以下函数均是 ESP8266WebServer 的实例方法

ESP8266WebServer esp8266_server(80);
esp8266_server.esp8266_server.send(200); //这样调用即可
//设置响应头
//name: 响应头名
//value: 响应头值
//first: 是否需要放在第一行
void sendHeader(const String& name, const String& value, bool first = false);

//设置响应体长度
void setContentLength(const size_t contentLength);

//发送响应内容
void sendContent(const String& content);

//发送响应数据
void send(int code, const char* content_type = NULL, const String& content = String(""));
void send(int code, char* content_type, const String& content);
void send(int code, const String& content_type, const String& content);

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

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

相关文章

Vue2-Vue开发环境搭建

一、IDE编辑器&#xff1a;Vscode&#xff0c;自行下载安装即可 二、三种引入方式&#xff0c; 教程使用方式一引入 Vue官网&#xff1a;https://v2.cn.vuejs.org/v2/guide/installation.html 方式一&#xff1a;直接script引入 教程下载开发版本&#xff0c;下载到本地&…

使用人工智能机器人提高农业效率| 数据标注

人工智能技术创新不仅仅蔓延到智慧城市、智能建筑或新的混合工作模式&#xff1b;机器人还通过人工智能、自动拖拉机、实时监测农作物的传感器、无人机或水果和蔬菜收获机器人来彻底改变农业。今天&#xff0c;我们将向您介绍一些已经在农业中使用的最有趣的AI技术&#xff0c;…

微信小程序textarea的placeholder的行高怎么修改

目前不支持修改行高。如果你的内容设置了行高但是placeholder没有行高会导致输入内容的时候感觉不是对齐的&#xff0c;想要解决这个问题怎么办呢/ 我们可以自己写个text假装是placeholder的内容。然后textarea获取焦点输入内容的时候就不显示这个text的内容。 <view class…

新入公司 git基本命令使用(二) 小乌龟版

git命令行的操作复杂不直观,且容易出错. 这里推荐大家使用 git版小乌龟插件进行使用 下载地址 :https://tortoisegit.org/download/ 安装一路next即可 创建本地仓库 右键点击克隆, 然后输入项目地址,确认 拉取代码 右键点击同步 , 然后再界面中选择好对应的分支, 点击拉取 …

朴素贝叶斯分类算法和实例演示

文章目录贝叶斯公式算法原理实例演示代码实现本文开始&#xff0c;我们来学习一种新的机器学习方法&#xff1a;贝叶斯算法。 这次从最基础的朴素贝叶斯分类算法出发&#xff0c;了解相关的算法原理。 考虑如下一种分类问题&#xff1a;样本中只包含2类特征&#xff0c;标签只…

接口返回数据实体类属性大写变成小写

问题背景 今天遇到一个特别恶心的事情&#xff0c;我的返回实体类遵循了字段属性明明规则&#xff0c;驼峰命名法&#xff0c;在接口返回数据给前端的时候&#xff0c;所有数字那个字母全部自动变为了小写字母&#xff01; 错误的返回示例&#xff1a; 正确的返回示例&#x…

【鸟哥杂谈】腾讯云 CentOS8 Linux环境搭建docker

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-01-15 ❤️❤️ 本篇更新记录 2023-01-15 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

当青训营遇上码上掘金之主题四-攒青豆

theme: juejin 攒青豆 现有 n 个宽度为 1 的柱子&#xff0c;给出 n 个非负整数依次表示柱子的高度&#xff0c;排列后如下图所示&#xff0c;此时均匀从上空向下撒青豆&#xff0c;计算按此排列的柱子能接住多少青豆。&#xff08;不考虑边角堆积&#xff09; 以下为上图例子…

【JavaEE初阶】第一节.计算机是如何工作的

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 文章目录 前言 一、计算机发展历史 二、冯诺依曼体系 三、CPU 3.1 浅谈CPU 3.2 寄存器 3.3 指令 3.4 CPU的操作流程 3.5 时钟周期 四、编程语言 总结…

vue.js客服系统实时聊天项目开发(四)引入iconfont图标代码

普通引入模式下是这样的 首先&#xff0c;您需要在iconfont.cn上创建一个账号并添加图标。 然后&#xff0c;将iconfont的链接代码加入到页面的head标签中&#xff0c;例如&#xff1a; <link rel"stylesheet" href"//at.alicdn.com/t/font_123456_abcdefghi…

Docker为什莫方便(学习的记录)

Docker为什莫方便&#xff08;学习的记录&#xff09; 程序 — apk— 发布到商城------下载安装即可使用 程序----打包项目带上环境&#xff08;创建一个项目的镜像&#xff09;-----发布到docker仓库当中------下载安装运行即可 &#x1f315; docker的核心思想 将各个环境…

【手写 Vue2.x 源码】第二十七篇 - Vue 生命周期的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组依赖收集的实现 本篇&#xff0c;Vue 生命周期的实现 二&#xff0c;Vue.mixin 介绍 1&#xff0c;mixin 简介 Vue2 中可以通过 Vue.mixin 为 vue 进行功能扩展 开发中&#xff0c;经常使用 mixin 来为所有组件增加一些生…

机器学习的相关软件框架下载安装

文章目录一、Anaconda1. Anaconda 的下载2. Anaconda 的安装3. Anaconda Navigator 打不开问题&#xff08;不适用所有&#xff09;二、PyTorch-CPU1. PyTorch 环境创建2. PyTorch 下载3. Jupyter 中使用 PyTorch三、Python 版本升级与包的维护1. 更新 Anaconda2. 查看与更新 p…

回归预测 | MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机多输入单输出

回归预测 | MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机多输入单输出 目录回归预测 | MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机…

【MAUI】自动更新功能的安卓App

自动更新功能的安卓App自动更新主要下面4个步骤更新服务测试页面:MainPage.xaml测试自动更新主要下面4个步骤 1、获取最新版本号 2、提示用户发现更新&#xff0c;等待用户确认更新 3、下载最新的apk包 4、安装apk包 更新服务 为简单示例&#xff1a;直接在android平台文件夹…

Spring资源管理,Spring资源管理源码分析

文章目录一、Java标准资源管理1、Java 标准资源定位2、Java URL 协议扩展基于 java.net.URLStreamHandlerFactory基于 java.net.URLStreamHandler3、Java 标准资源管理扩展的步骤4、Spring为什么不用Java标准的资源管理二、Spring资源接口与实现1、Spring基本资源接口InputStre…

C++ 简单实现RPC网络通讯

RPC是远程调用系统简称&#xff0c;它允许程序调用运行在另一台计算机上的过程&#xff0c;就像调用本地的过程一样。RPC 实现了网络编程的“过程调用”模型&#xff0c;让程序员可以像调用本地函数一样调用远程函数。最近在做的也是远程调用过程&#xff0c;所以通过重新梳理R…

项目管理平台,如何助力CMMI3-5级高效落地?

近日CoCode旗下Co-ProjectV3.0智能项目管理平台全面升级&#xff0c;CoCode产品4大版本全新发布&#xff0c;用户不限版本30天免费试用&#xff1b;平台全面支持CMMI3-5级&#xff0c;助力CMMI高效落地。 一、4大版本全新发布 不限版本30天免费试用 Co-Project V3.0智能项目管理…

FPGA:组合逻辑电路的设计

文章目录组合逻辑电路的设计组合逻辑电路的设计步骤组合逻辑电路的设计举例例1例2组合逻辑电路的设计 根据实际逻辑问题&#xff0c;求出所要求逻辑功能的最简单逻辑电路。 组合逻辑电路的设计步骤 1.逻辑抽象&#xff1a;根据实际逻辑问题的因果关系确定输入、输出变量&…

【寒假每日一题】DAY8 倒置字符串

牛客网链接&#xff1a;传送门 【❤️温馨提示】自己做一遍&#xff0c;再看解析效果更佳哟 描述 将一句话的单词进行倒置&#xff0c;标点不倒置。输入描述&#xff1a; 每个测试输入包含1个测试用例&#xff1a; I like beijing. 输入用例长度不超过100输出描述&#xff1a…