ESP32C3:手机连接开发板创建的热点WEB后,输入可用WIFI信息后进行联网

本文主要是介绍ESP32C3:手机连接开发板创建的热点WEB后,输入可用WIFI信息后进行联网,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

客户端测试:

 串口测试:

 逻辑解释:

- `#include <WiFi.h>` 和 `#include <WebServer.h>` 导入了其它库,用于 ESP32C3 与 Wi-Fi 和 Web 服务器的交互。
- `const char* ssid = "ESP32C3";` 定义了 Wi-Fi AP 的名称。
- `WebServer server(80);` 创建了一个 Web 服务器对象,并将其绑定到 80 端口。
- `handleRoot()`: 当 Web 服务器收到根路径(/)的 GET 请求时,会调用该函数,它在客户端网页上显示输入 Wi-Fi 凭据的表单。
- `handleConnect()`: 当 Web 服务器收到路由为 /connect 的 POST 请求时,会调用该函数。 该函数会从请求中获取 Wi-Fi 凭据并将其用于 Wi-Fi 连接。如果连接成功,则会向客户端发出成功消息;如果连接失败,则会向客户端发出失败信息。
- `setup()` 函数的作用是执行一些初始化操作,例如设置调试串口,开启 Wi-Fi 并将 ESP32 设置为 AP。它还将路由器映射到 `handleRoot()` 和 `handleConnect()` 函数上,并开始运行 Web 服务器。
- `loop()`函数是无限循环,在其中,调用 `server.handleClient()` 方法,以便服务器能够实时地处理客户端的请求。

代码部分:
 

#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "ESP32C3";
WebServer server(80);
void handleRoot() {String html = "<form action='/connect' method='post'>Enter WiFi credentials:<br><input type='text' name='ssid' value=''><br><input type='password' name='password' value=''><br><input type='submit' value='Connect'></form>";server.send(200, "text/html", "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1.0'></head><body>"+html+"</body></html>");
}
void handleConnect() {String ssid = server.arg("ssid");String password = server.arg("password");Serial.println(ssid);Serial.println(password);WiFi.begin(ssid.c_str(), password.c_str());unsigned long timeout = millis();while (WiFi.status() != WL_CONNECTED && millis() - timeout < 10000) {delay(1000);}if (WiFi.status() == WL_CONNECTED) {server.send(200, "text/html", "<p>Connected to WiFi</p>");Serial.println("成功连接WIFI");} else {server.send(200, "text/html", "<p>Failed to connect to WiFi</p>");Serial.println("失败连接WIFI");}
}
void setup() {Serial.begin(115200);WiFi.mode(WIFI_AP_STA); // enable Station and AP modeWiFi.softAP(ssid);Serial.print("AP IP address: ");Serial.println(WiFi.softAPIP());server.on("/", handleRoot);server.on("/connect", HTTP_POST, handleConnect);server.begin();
}
void loop() {server.handleClient();
}

迭代版本:

1.增加LED展示效果:通电点亮+5V电源指示灯,联网成功双灯常亮模式,联网失败呼吸灯闪烁(失败后按RST重启连接热点重新给正确的WIFI信息)

2.增加企业微信机器人接口,联网成功会通知,通过访问:192.168.4.1/send?txt=XXX 还可进行消息推送

代码:
 

#define LED_BUILTIN_0 (12)
#define LED_BUILTIN_1 (13)#include <WiFi.h>
#include <WebServer.h>
#include <HTTPClient.h>
// 开发板热点名称
const char* ssid = "ESP32C3";
// 企业微信机器人 webhook URL
const char* webhookUrl = "请填写webhook URL";WebServer server(80);
void handleRoot() {String html = "<form action='/connect' method='post'>Enter WiFi credentials:<br><input type='text' name='ssid' value=''><br><input type='password' name='password' value=''><br><input type='submit' value='Connect'></form>";server.send(200, "text/html", "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1.0'></head><body>"+html+"</body></html>");
}
void handleSend() {if (WiFi.status() == WL_CONNECTED) {// 如 "/send?txt=test",其中的 "txt=test" 就是一个参数,使用 server.arg("txt") 可以获取它的值,即 "test"String message = "ESP32C3推送消息:" + server.arg("txt");Serial.println("接收到推送消息:");Serial.println(message);sendToWechatWebhook(message); // 调用sendToWechatWebhook函数发送请求字符串信息server.send(200, "text/plain", "消息推送成功!"); // 告诉客户端请求已完成Serial.println("推送消息成功!");} else {server.send(200, "text/plain", "无法连接网络,请检查网络连接!"); // 网络连接失败,返回错误提示Serial.println("推送消息失败!");}
}
void handleConnect() {String ssid = server.arg("ssid");String password = server.arg("password");Serial.println(ssid);Serial.println(password);WiFi.begin(ssid.c_str(), password.c_str());unsigned long timeout = millis();while (WiFi.status() != WL_CONNECTED && millis() - timeout < 10000) {Serial.println("Connecting to WiFi...");delay(1000);}if (WiFi.status() == WL_CONNECTED) {server.send(200, "text/html", "<p>Connected to WiFi</p>");Serial.println("成功连接WIFI");// 连接成功灯常亮,亮度偏低analogWrite(LED_BUILTIN_0, 10);analogWrite(LED_BUILTIN_1, 10); // 发送消息到企业微信机器人String message = "ESP32C3 成功连接了 WiFi " + String(ssid);sendToWechatWebhook(message);} else {server.send(200, "text/html", "<p>Failed to connect to WiFi</p>");Serial.println("失败连接WIFI");while (true) {// 渐亮,范围0-255for (int i = 0; i < 100; i++) {analogWrite(LED_BUILTIN_0, i);analogWrite(LED_BUILTIN_1, i);delay(10); }// 渐灭范围255-0for (int i = 100; i >= 0; i--) {analogWrite(LED_BUILTIN_0, i);analogWrite(LED_BUILTIN_1, i);delay(10); }}}
}
void setup() {Serial.begin(115200);//只量一个电源灯pinMode(LED_BUILTIN_1, OUTPUT);WiFi.mode(WIFI_AP_STA); // enable Station and AP modeWiFi.softAP(ssid);Serial.print("AP IP address: ");Serial.println(WiFi.softAPIP());server.on("/", handleRoot);server.on("/connect", HTTP_POST, handleConnect);server.on("/send", HTTP_GET, handleSend); server.begin();
}
void loop() {server.handleClient();
}
void sendToWechatWebhook(String message) {HTTPClient https;https.begin(webhookUrl);String payload = "{\"msgtype\":\"text\",\"text\":{\"content\":\"" + message + "\"}}";int httpResponseCode = https.POST(payload);if (httpResponseCode == HTTP_CODE_OK) {Serial.println("Message sent to WeChat webhook");} else {Serial.println("Failed to send message to WeChat webhook");}https.end();
}

这篇关于ESP32C3:手机连接开发板创建的热点WEB后,输入可用WIFI信息后进行联网的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354436

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

99%的人都选错了! 路由器WiFi双频合一还是分开好的专业解析与适用场景探讨

《99%的人都选错了!路由器WiFi双频合一还是分开好的专业解析与适用场景探讨》关于双频路由器的“双频合一”与“分开使用”两种模式,用户往往存在诸多疑问,本文将从多个维度深入探讨这两种模式的优缺点,... 在如今“没有WiFi就等于与世隔绝”的时代,越来越多家庭、办公室都开始配置双频无线路由器。但你有没有注

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin