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断电保存貌似读取有误。其他功能正常

本文标签: 一键