ESP32的AP模式使用

news2025/7/27 23:05:58

WifiClient 和WebServe有啥区别?

(14 封私信 / 1 条消息) httpclient 和webservice有啥区别? - 知乎 (zhihu.com)

1.Webservice两大核心:soap(理解为要传输的数据)wsdl(理解为传输数据xml的说明)

soap = xml + http,数据格式只能是:xml

soap协议是面向对象编程的,使用wdsl可以生成客户端调用的代码

httpclient传递的是json数据,需要将对象转换成json再进行调用

json比html更为精简,传递效率更高。

httpClient是基于http协议的,只能传递json数据,也就是调用完服务端方法返回json数据,客户端需要自己解析json数据。

webservice是基于soap(=http+xml)协议的,是面向对象编程的,可以直接传输一个对象,客户端有了这个对象就可以像调用本地的方法一样调用服务端方法。

ESP32

#include <WiFi.h>

#include <WebServer.h>

const int LED = 2;                         //设置LED引脚
const char* AP_SSID  = "ESP32";        //设置AP热点名称
const char* AP_PASS  = "123456789";               //设置AP热点密码
IPAddress apIP(192, 168, 4, 1);  //设置AP的IP地址

const int webPort = 80; //设置Web端口号

WebServer server(webPort); //开启web服务, 创建TCP SERVER,参数: 端口号,最大连接数

WiFi.mode(WIFI_AP);     //配置为AP模式
 WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));   //设置AP热点IP和子网掩码

#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>

const char *AP_SSID = "ESP32_AP";
const char *AP_Password = ""; // 不填写,则代表无密码
WebServer server(80);

String command; // String to store app command state.

void handleRoot() // 处理网站根目录"/"的访问请求
{

  if (server.hasArg("State"))
  {
    Serial.println(server.arg("State"));
  }
  server.send(200, "text/html", "");
  delay(1);
}
void handleNotFound()
{
  server.send(404, "text/plain", "404: Not found");
}

void goForword() {}

void setup()
{
  Serial.begin(115200);
  WiFi.softAP(AP_SSID, AP_Password);
  Serial.print("AP模式建立的WIFI名称:");
  Serial.println(AP_SSID);
  Serial.print("AP模式建立的IP地址:");
  Serial.println(WiFi.softAPIP());
  // Starting WEB-server
  server.begin();             // start esp32 server
  server.on("/", handleRoot); // 告诉MCU如何处理浏览器的HTTP请求
  server.onNotFound(handleNotFound);
}

void loop()
{
  server.handleClient(); // 检测有没有设备通过网络向MCU发送请求
  command = server.arg("State");
  Serial.println(command);
  if (command == "F")
    goForword();
}

WebServer库函数

WebServer是非常常用的一个功能,在设备上使用该功能用户就可以不依赖app直接通过浏览器访问和操作设备。另外即使是用app的,对于app开发来说直接访问webapi也比处理tcp/udp要方便些。

(10条消息) 使用Arduino开发ESP32(09):WebServer使用演示与说明_Naisu Xu的博客-CSDN博客

WebServer简单点理解就是网页服务器,主要干的活就是用户访问链接的时候执行相应的动作,对于开发来说主要处理的就是注册链接并编写用户访问该链接时需要执行的操作

  • 引入相应库#include <WebServer.h>
  • 声明WebServer对象并设置端口号,一般WebServer端口号使用80
  • 使用on()方法注册链接与回调函数;
  • 使用begin()方法启动服务器进行请求监听;
  • 使用handleClient()处理来自客户端的请求;
#include <WiFi.h>
#include <WebServer.h> //引入相应库

const char *ssid = "********";
const char *password = "********";

WebServer server(80); //声明WebServer对象

void handleRoot() //回调函数
{
  server.send(200, "text/plain", "这是根页面");
}

void handleP1() //回调函数
{
  server.send(200, "text/plain", "这是P1页面");
}

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.mode(WIFI_STA);
  WiFi.setSleep(false);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected");
  Serial.print("IP Address:");
  Serial.println(WiFi.localIP());

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

  server.on("/p1", handleP1); //注册链接"/p1"与对应回调函数

  server.on("/p2", []() { //注册链接"/p2",对应回调函数通过内联函数声明
    server.send(200, "text/plain", "这是P2页面,由内联函数声明");
  });

  server.begin(); //启动服务器
  Serial.println("Web server started");
}

void loop()
{
  server.handleClient(); //处理来自客户端的请求
}

ESP8266

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>

//SSID and Password to your ESP Access Point
const char* ssid = "Robot Wifi";
const char* password = "*******";

#define Light  16 // Light  GPIO16(D0).

ESP8266WebServer server(80); // 网络服务器标准http端口号为80,因此这里使用80为端口号

接入点模式(Access Point, 也称 AP)

void setup{
//--------"启动网络服务功能"程序部分开始-------- //  此部分为程序为本示例程序重点1
  esp8266_server.begin();                   //  详细讲解请参见太极创客网站《零基础入门学用物联网》
  esp8266_server.on("/", handleRoot);       //  第3章-第2节 ESP8266-NodeMCU网络服务器-1
  esp8266_server.onNotFound(handleNotFound);        
//--------"启动网络服务功能"程序部分结束--------
}
void loop(void){
  esp8266_server.handleClient();     // 处理http服务器访问
}
 
/* 以下两个函数为本示例程序重点2
详细讲解请参见太极创客网站《零基础入门学用物联网》
第3章-第2节 3_2_1_First_Web_Server 的说明讲解*/                                                                            
void handleRoot() {   //处理网站根目录“/”的访问请求 
  esp8266_server.send(200, "text/plain", "Hello from ESP8266");   // NodeMCU将调用此函数。
}
 
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){                                        // 当浏览器请求的网络资源无法在服务器找到时,
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。
}
 esp8266_server.begin(); 

使用了ESP8266WebServer库中的begin函数,这个函数的作用是让单片机启动网络服务功能,该函数无需任何参数。

esp8266_server.on("/", handleRoot)

调用了ESP8266WebServer库中的on函数,该函数的作用是指挥ESP8266来如何处理浏览器的HTTP请求。on函数一共有两个参数第一个参数是字符串”/”,第二个参数是一个执行函数的名称handleRoot

参数”/”的作用:一个网站有很多页面,为了加以区分,这些页面都有各自的名称

handlRoot函数的主要作用是告诉NodeMCU该如何生成和发送网站首页给浏览器。

esp8266_server.on("/", handleRoot)。它的作用就是告诉NodeMCU,当有浏览器请求网站首页时,请执行handlRoot函数来生成网站首页内容然后发送给浏览器。

当在浏览器地址栏只输入IP地址而没有任何附加信息时,浏览器就会知道我们要获取一个网站首页信息。

esp8266_server.onNotFound(handleNotFound)

esp8266_server.onNotFound(handleNotFound)使用了onNotFound函数。它的作用是指挥NodeMCU在收到无法满足的http请求时应该如何处理。

onNotFound函数就是用来告诉NodeMCU如果出现无法满足的http请求时该如何进行处理。onNotFound函数有一个参数,这个参数的内容是函数handleNotFound的名字。

esp8266_server.send(404, "text/plain", "404: Not found")

这条语句调用了ESP8266WebServer库中的send函数。该函数的作用是生成并且发送http响应信息。也就是说,电脑浏览器所收到的网页信息都是通过send函数生成并且发送的

404是一个服务器状态码,含义:客户端的请求有错误。send函数的最后一个参数使用了一个字符串”404: Not found”。这个字符串的内容才是真正显示在浏览器中供我们阅读的内容。你可以任意的改变这个字符串的内容。

send函数还有一个字符串参数“text/plain”。它的作用是说明http响应体的信息类型在这段示例中,我们用“text/plain”的原因是要告诉浏览器后面的”404: Not found”为一段纯文本信息。这里当然也可以使用其它类型的信息。

send函数一共有3个参数:第一个参数为服务器状态码,通常为404或200,200表示成功接收请求。第二个参数:说明http响应信息类型“text/plain”第三个参数为响应体的具体信息

setHeader:响应数据头
Content-Type:内容类型
text/plain:普通文本类型
text/html:解析html格式类型

application/x-jpg:下载图片的
image/jpeg:直接显示图片
charset=utf-8:编码是utf-8

void handleRoot() {                         
    esp8266_server.send(200, "text/plain", "Hello from ESP8266");
}

用于生成和发送首页信息的函数:handleRoot

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

loop函数中唯一的一条语句,这句程序调用了handleClient函数。它的主要作用之一是检查有没有设备通过网络向NodeMCU发送请求函数handleClient每次被调用时,NodeMCU都会检查一下是否有人发送http请求。因此我们需要把它放在loop函数中,从而确保它能经常被调用。假如我们的loop函数里有类似delay一类的函数延迟程序运行,那么这时候就一定要注意了。如果handleClient函数长时间得不到调用,NodeMCU的网络服务会变得很不稳定。因此在使用NodeMCU执行网络服务功能的时候,一定要确保handleClient函数经常得以调用。我在这里反复强调这一点是因为这一点非常关键,请务必注意!

void HTTP_handleRoot(void)
{

  if (server.hasArg("State"))
  {
    Serial.println(server.arg("State"));
  }
  server.send(200, "text/html", "");
  delay(1);
}

ESP8266 – ESP8266WebServer库 – send

  • 说明:在MCU所建立的物联网服务器在运行过程中,如果有客户端向ESP8266服务器发送HTTP请求,ESP8266服务器可使用本函数向客户端发送响应信息
  • 语法:send(responseCode, contentType, responseContent)
    • responseCode: 响应状态码(类型:int)
    •  contentType: 响应内容类型,本参数为可选参数,如不使用本参数则默认为空NULL(可使用字符串类型),例如:"text/html"    、"text/plain"
    •  responseContent: 响应内容,本参数为可选参数,如不使用本参数则默认为空字符串(可使用字符串类型)

ESP8266 – ESP8266WebServer库 – streamFile

ESP8266 – ESP8266WebServer库 – streamFile – 太极创客 (taichi-maker.com)

  1. 说明:在所建立的物联网服务器运行中,如果有客户端向服务器发送HTTP请求,服务器将会对客户端发送响应信息。本函数可用于向服务器响应体中添加自定义信息。可以实现此功能的函数共有3个:sendContent、sendContent_P、streamFile。这三个函数虽然功能相同,但是他们所发送的信息存储位置有很大的区别。
    1.  sendContent函数:发送的信息通常是程序中的一个字符串。优点:接调用程序内字符串,这个操作比起另外两种方法来说更加简单直接。但是其缺点是,由于存储发送信息的字符串是在程序中的,这会占用开发板的动态内存空间。因此,使用sendContent函数时,发送信息的大小受到了限制。
    2.  sendContent_P:发送的响应信息必须存储在程序存储空间,这一特点大大优化了程序内存占用问题。使用此函数对发送较大的响应信息时非常有帮助。缺点:sendContent_P的信息仍是写在程序中,如果发送的信息需要分为多个文件存储,使用此函数是无法胜任的
    3. streamFile:使用streamFile函数来发送响应信息是最推荐的操作方法。因为此函数利用了MCU的闪存文件系统来存储发送的信息内容(看一下物联网教程关于闪存操作的这一节)。此函数既可以节省程序内存空间,又运行将需要发送的信息分为多个文件进行保存。但是使用streamFile时需要我们使用Arduino IDE的闪存文件上传工具预先将文件上传到闪存中。
      语法:streamFile(file, contentType)
    4. 参数:file – 存储有响应信息的闪存文件对象,contentType(可选参数) – 响应信息系类型 (const String& )3-3 ESP8266 NodeMCU 闪存文件系统(SPIFFS) – 太极创客 (taichi-maker.com)

ESP8266 – ESP8266WebServer库 – hasArg

 说明:ESP8266 – ESP8266WebServer库 – hasArg – 太极创客 (taichi-maker.com)

使用此函数,可以获取客户端向ESP8266物联网服务器发送的请求信息中有无指定的参数。

 语法:server.hasArg(name)

参数:name,需要确认的请求体中的参数名(参数类型: String)

返回值:返回是否存在指定参数(类型bool)

假设您的开发板IP地址为192.168.0.106,那么接下来您可以通过浏览器输入以下地址信息。

http://192.168.0.106/?token=abc

在以下示例程序中,我们使用了server.hasArg("token")来判断请求信息中是否有名称为”token”的参数。如果有此参数,则通过串口监视器输出参数数值。如下图示:

 通常与Server.arg()结合使用。

//自定义返回请求体信息
void echo_args() {
  if (server.hasArg("token")) {
    Serial.print("请求中token参数的值:"); 
    Serial.println(server.arg("token"));
  }
  else {
    Serial.println("当前请求中无法找到指定请求体内容");
  }
}

ESP8266 – ESP8266WebServer库 – arg

说明:使用本函数,我们可以获取客户端向ESP8266物联网服务器发送的指定参数的数值

语法:name      请求体中的参数名(参数类型: String)  

           index      请求体中的参数序列号(参数类型: int)

 返回值:   指定参数的数值(类型:String)

ESP8266 – ESP8266WebServer库

ESP8266 – ESP8266WebServer库 – 太极创客 (taichi-maker.com)

ESP8266WebServer库用于HTTP协议通讯。通过ESP8266WebServer库,我们可以使用ESP8266开发板建立网络服务器,从而允许其它网络设备以及物联网设备通过HTTP协议访问并实现物联网信息交流。

由于HTTP协议是建立在TCP协议基础之上的,可以使用WIFIServer库来实现HTTP通讯,在这一点上,WIFIServer与ESP8266WebServer库在功能上形成了互补

太极创客官网本节有ESP8266WebServer库的整体结构图

ESP8266 – WiFiClient库

WiFiClient库用于ESP8266的TCP协议物联网通讯。TCP协议又称传输控制协议,是Transmission Control Protocol的简称。

通过WiFiClient库,我们可以使用ESP8266利用互联网或局域网向网络服务器发送请求,从而获取网络信息,实现物联网应用

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

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

相关文章

Java类变量和类方法(static)

文章目录类变量-提出问题类变量内存布局如何定义类变量如何访问类变量类变量使用细节类方法介绍类变量-提出问题 提出问题的主要目的就是让大家思考解决之道&#xff0c;从而引出我要讲的知识点. 说:有一群小孩在玩堆雪人,不时有新的小孩加入&#xff0c;请问如何知道现在共有…

客服系统Golang源码

客服系统 概述 采用Golang语言&#xff0c;基于 gRPC [Mongo Vue3WebsocketRabbitMQ]来实现系统 用户侧逻辑采用匿名注册模式&#xff0c;Token采用JWT技术&#xff0c;服务端不保存Token信息&#xff0c;用户每次使用检测Token合法时返回新的Token来达到续期的目的 后端分…

kubernetes集群基于kubeadm部署以及常见问题解决

文章目录集群类型主机规划环境初始化检查操作系统版本关闭防火墙设置主机名主机名解析时间同步关闭 SELinux关闭 swap 分区将桥接的IPv4流量传递到iptables的链开启ipvs安装容器运行时&#xff08;Docker&#xff09;卸载Docker旧版本&#xff1a;安装 gcc 相关安装Docker设置阿…

Vivado_AXI Quad SPI_IP核

填一下前面的坑。 介绍关于Vivado中AXI Quad SPI v3.2的使用方法。 参考资料&#xff1a;pg153-axi-quad-spi.pdf&#xff0c;可自行在官网下载。 以该IP核的Standard SPI Mode的使用为例。 Address Space OffsetRegister NameAccess TypeDefault Value (hex)Description40hS…

【JavaSE】抽象类

前言&#xff1a; 作者简介&#xff1a;爱吃大白菜1132 人生格言:纸上得来终觉浅&#xff0c;绝知此事要躬行 如果文章知识点有错误的地方不吝赐教&#xff0c;和大家一起学习&#xff0c;一起进步&#xff01; 如果觉得博主文章还不错的话&#xff0c;希望三连支持&#xff01…

知物由学 | 弹幕蜂拥而入,智能审核平台如何用技术破局?

导读&#xff1a;弹幕的出现增加了视频观看者的深度参与感&#xff0c;弹幕也逐渐成为国内各大视频网站最基本的评论交互形式&#xff0c;本文将通过网易易盾在弹幕实现原理及交互方式方面的实践&#xff0c;具体介绍弹幕相较于传统聊天室的区别与实践经验&#xff0c;希望能为…

【检索资讯】2022年控制理论与应用国际会议(ICOCAT 2022)已成功被EI检索

ICOCTA 2022&#xff08;www.icocta.org&#xff09; 2022年控制理论与应用国际会议&#xff08;ICOCAT 2022&#xff09;已成功被EI&#xff0c;Scopus检索&#xff0c;作者可自行登录EI数据库查询检索&#xff0c; ICOCTA 2023会议预告 重要信息 会议官网&#xff1a;www.i…

新品速看丨创新微MinewSemi正式推出GNSS高精度卫星定位导航模块

致力于GNSS、蓝牙、Wi-Fi、LoRa、UWB等物联网无线模块研究的一站式供应商——创新微MinewSemi近日推出了数款基于多种卫星导航授时、多星多频、具有低功耗、高灵敏度、抗干扰、高性能的工业级GNSS高精度定位模块。 此次推出的GNSS模块各有特点&#xff0c;满足用户不同需求&…

【LeetCode】用队列实现栈和用栈实现队列(C语言)

目录 1.用队列实现栈 增删 求栈顶元素 判断栈为空 2.用栈实现队列 增删 返回队列开头的数据 判断队列为空 尾言 源码 队列实现栈 栈实现队列 刚讲完栈和队列&#xff0c;LeetCode上有两题栈与队列的互相实现&#xff0c;简单地讲讲思路和实现吧。 1.用队列实现栈 原题地址&am…

婴幼儿蛋白质过敏怎么回事

很多孩子吃了含蛋白质的食物后会出现瘙痒或痱子等过敏症状&#xff0c;甚至全身发红。这是因为一些过敏体质的孩子儿童会对蛋白质过敏。婴儿蛋白质过敏会导致一些严重的问题&#xff0c;那么当婴儿蛋白质过敏发生时&#xff0c;该怎么以下是一个详细的介绍&#xff01;目录蛋白…

[Spring Boot]08 IDEA接入MyBatisCodeHelper代码自动生成器

目录前言一、插件市场安装插件二、使用插件自动生成代码前言 上次介绍了&#xff0c;原生mybatis的方法&#xff1a; 06 Spring Boot接入mybatis通用mapper插件自动生成器。 这次&#xff0c;再介绍下插件MyBatisCodeHelper-Pro的用法&#xff0c;使用此方法更加简单和方便。 …

老照片修复工具哪个好?这几个修复软件你快看看

相信我们很多小伙伴的爷爷奶奶家里都会有很多老照片&#xff0c;这些照片由于年代久远&#xff0c;或多或少都会有些损坏&#xff0c;不是泛黄就是有些褶皱&#xff0c;如果我们想将照片进行流传下去&#xff0c;肯定就是将其修复并重新洗出来啦。要是不想出门找专业的摄影师修…

Spring Boot 整合 MyBatis Plus实现多数据源的两种方式

第一种&#xff1a;使用配置类的方式&#xff1a; 项目结构 xml依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

hadoop 3.3大数据集群搭建系列3-安装Hive

文章目录一. 下载hive二. 解压三. 添加Hive核心配置&#xff0c;选择远程MySQL模式四. 下载连接MySQL的驱动包到hive的lib目录下五. MySQL下创建hive数据库六. 执行Hive的初始化工作七. 验证初始化是否成功八. 使用hive参考:一. 下载hive cd /home/software wget https://mirr…

简单搭建redis哨兵集群

文章目录简单搭建redis哨兵集群配置参数说明配置部署哨兵集群检查哨兵状态其他配置踩坑记录简单搭建redis哨兵集群 配置参数说明 sentinel monitor mymaster 10.0.0.4 6379 指定对一个 master 的监控&#xff0c;给监控的 master 指定的一个名称。 sentinel down-after-mill…

Ubuntu配置NFS服务器(Linux挂载Linux)

Ubuntu配置NFS服务器 服务器端的配置 Ubuntu安装NFS服务器端 sudo apt-get install nfs-kernel-server服务端查看版本 nfsstat -s在桌面上创建共享目录 mkdir share修改/etc/export配置文件&#xff0c;在后面添加如下语句 /home/xxx/桌面/share *(rw,sync,no_root_squas…

Java异常处理机制

文章目录异常的概念引入的小例子基本概念异常体系图常见异常分类常见的运行时异常编译异常异常处理try-catch-finallythrows小练习自定义异常自定义异常的步骤throw与throws练习题异常的概念 引入的小例子 public class Exception01 {public static void main(String[] args)…

如何在图片上添加水印?快把这些方法收好

相信有些小伙伴经常会在网络上&#xff0c;分享自己拍摄的图片吧。那大家是否有遇到过发布的图片&#xff0c;被其他人盗用&#xff0c;并在其它平台上发布的情况呢&#xff1f;其实我们可以在图片上添加上个人水印&#xff0c;这样子就可以有效减少图片被人盗用的情况。那你们…

【springboot】20、Spring Boot 整合 MyBatis

文章目录基本介绍1、引入相关依赖2、数据库基本配置3、编写mapper接口和映射文件4、指定Mapper文件的位置5、测试总结基本介绍 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果…

英伟达RTX 4080正式发布!这一波是谁赢麻了?

在RTX40系列发布之前&#xff0c;我一直以为今年经济不行&#xff0c;直到看到大家抢购4090的样子&#xff0c;才发现只有我的经济不行。 距离英伟达 RTX 4090显卡的发布已经过去了一个月&#xff0c;40系列家族又出一员大将——英伟达 RTX 4080&#xff0c;公版定价9499在上市…