admin管理员组文章数量:1627951
#include <EEPROM.h>
#
#include <DNSServer.h>
#include <dummy.h>
#include <ESP8266WebServer.h>
String sta_ssid,sta_password,SSIDA,PASSA;
const char* home_html= " <!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <h1>无线配网8266</h1> </head> <body><form name='input' action='/' method='POST'>路由器名称: <br><input type='text' name='ssid'><br>wifi密码:<br><input type='text' name='password'><br><input type='submit' value='保存'></form></body></html>";
const char*AP_NAME = "无线配网8266"; //8266wifi名字
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IPAddress apIP(192, 168, 4, 1); //配网IP地址
ESP8266WebServer server(80);//创建80端口服务器
const byte DNS_PORT = 53; //dns端口
DNSServer dnsServer;
//++++++++++++++++++++++++++
//构建初始化函数
void initBasic(void) {
Serial.begin(115200); //设置串口波特率
WiFi.hostname("esp8266");//设置设备名称(路由器可查)
}
//+++++++++++++++++++
//AP模式设置
void initSoftAP(void)
{
WiFi.mode(WIFI_AP);//设置WIFI模式为AP模式(热点模式)
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); //配置AP网络设置 apIP=192.168.4.1 (ip地址,网关ip地址,子网掩码)
if (WiFi.softAP(AP_NAME)) {
Serial.println("ap star");
}
}
//+++++++++++
//获取配网主页数据 函数handleRoot 功能描述:响应root请求,也就是ip请求
void handleRoot()
{
server.send(200, "text/html", home_html);
//第一个参数是返回的 HTTP 代码,200 表示一切正常
//第二个参数是 mime-type 类型,浏览器通过这个来判断发来的是什么文件
//第三个参数是 HTML 源码
}
//+++++++++++++++
//发出post请求并调用请求处理程序 函数handleRootPort
void handleRootPost() {
Serial.println("handleRootPost");//串口打印函数以提示运行
//+++++++++++++++++
//判断是否输入路由器名字
if (server.hasArg("ssid"))
{
Serial.println("路由器名字 ssid:");
sta_ssid=server.arg("ssid");
//strcpy (sta_ssid,server.arg("ssid").c_str()); //拷贝数据到STA 模式中(联网模式SSID) strcpy(a,b)b赋值到a
Serial.println(sta_ssid);//串口打印ssid数据
}
else {
server.send(200, "text/html", "<meta charset='UTF-8'>error,not found ssid"); //判断无输入 返回错误页面
return;//返回函数
}
//++++++++++++++++++++++++
//判断是否输入路由器密码
if (server.hasArg("password"))
{
Serial.println("路由器密码 password:");
sta_password=server.arg("password");
//strcpy (sta_password,server.arg("password").c_str()); //拷贝数据到STA 模式中(联网模式password)
Serial.println(sta_password);//串口打印password数据
}
else {
server.send(200, "text/html", "<meta charset='UTF-8'>error,not found password"); //判断无输入 返回错误页面
return;//返回函数
}
server.send(200, "text/html", "<meta charset='UTF-8'>保存成功"); //返回成功提示
delay(2000);//延时2秒
writeeeprom();//调用写eeprom
delay(2000);//延时2秒
connectNewWiFi();//链接wifi(自定义函数)
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//定义web服务
void initWebServer(void) {
// server.on("/", HTTP_GET, handleRoot); //以HTTP_GET方式访问根目录,执行handleRoot函数
server.on("/", HTTP_POST,handleRootPost); //以HTTP_POST方式访问根目录,执行handleRootPost函数
server.onNotFound(handleRoot);//无法响应回调handleroot
server.begin();//启动web服务器
Serial.println("WebServer start");//串口打印提示已打开服务
}
//+++++++++++++++++++++++
//强制弹出登陆界面
void initDNS(void) {
if (dnsServer.start(DNS_PORT, "*", apIP))
{
//判断地址映射8266是否成功并输出提示
Serial.println("DNS start");
} else Serial.println("DNS Not found");//反之输出失败提示
}
//++++++++++++++++++++++++++++++++++
//定义STA模式联网函数connectNewWiFi
void connectNewWiFi(void) {
Serial.println("Connect to Wifi");
readeeprom();//检测数据是否可用
WiFi.mode(WIFI_STA);//打开STA模式
WiFi.setAutoConnect(true);//设置自动连接
WiFi.begin(sta_ssid,sta_password);//连接wifi
Serial.println(WiFi.getMode());
Serial.println("Connect to Wifi"); // 输出提示正在连接
int count = 0; //定义变量count
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);//如果wifi没连接 延时1秒
count ++; //count +1 变量增加
if (count > 30) {
//当循环到count递增大于10 重启配网步骤
initSoftAP();
initWebServer();
initDNS();
break;//跳出while 循环(防止bug)
}
Serial.println("."); //输出等待
}
Serial.println("");
if (WiFi.status() == WL_CONNECTED) {
//判断连接成功
Serial.println(sta_ssid);
Serial.println("IP address:");
Serial.println(WiFi.localIP());//输出wifi ip地址
server.stop();//关闭配网web服务
}
}
//++++++++++++++++++++++++++++++
//掉电保存函数writeeeprom and readeeprom
byte SSID_ADDR=0; //数据地址
byte PASSWORD_ADDR=0;//数据地址
byte SSID_NUM=0; //wifi名称
byte PASSWORD_NUM=0;//wifi密码
void writeeeprom(){
SSID_NUM=sta_ssid.length();//获取名称长度
PASSWORD_NUM=sta_password.length();//获取密码长度
EEPROM.write(SSID_ADDR,SSID_NUM);//申请储存名称
EEPROM.write(PASSWORD_ADDR,PASSWORD_NUM);//申请储存密码
for (int i=0;i<SSID_NUM;i++){
EEPROM.write(SSID_ADDR+1,SSID_NUM);}
for (int x=0;x<PASSWORD_NUM;x++){
EEPROM.write(PASSWORD_ADDR+1,PASSWORD_NUM);//申请储存密码
}
EEPROMmit();//保存到eeprom
//写函数
}
void readeeprom(){
if(EEPROM.read(SSID_ADDR) !=0)
{
//如果有数据执行赋值
for (int a=0;a<SSID_ADDR;a++){
sta_ssid +=char(EEPROM.read(SSID_NUM+a));}
Serial.println(sta_ssid);
Serial.println(" YOU SSID@!");
for (int b=0;b<PASSWORD_ADDR;b++){
sta_password +=char(EEPROM.read(PASSWORD_NUM+b));}
Serial.println(sta_password);
Serial.println("NO FUND ");
WiFi.mode(WIFI_STA);
WiFi.begin(sta_ssid,sta_password);//连接wifi
}else{ Serial.println("NO FUND YOU SSID@!");}//尝试连接wifi
}
//=========================================
//串口中断
//void serialEvent(){
// if(Serial.available()>0){
// Serial.println("ssssssssss");
//
// }
//
//
// }
void setup() {
EEPROM.begin(1024);//初始化EEPROM申请内存
initBasic();//调用函数初始化
connectNewWiFi();//尝试连接wifi
}
void loop() {
server.handleClient();//调用函数handleClient检查http服务器访问
dnsServer.processNextRequest();//调用函数
}
ESP8266 or ESP32 一键配网
出了一点小问题。EEPROM断电保存貌似读取有误。其他功能正常
本文标签: 一键
版权声明:本文标题:ESP8266 or ESP32 一键配网 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729002887a1182725.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论