Arduino ESP32Web配网


注意:设置的重置wifi信息的按钮定义在GPIO 0上面,上面那种开发板上的该引脚没有引出来,所以如果想不更改此引脚,短接需要用跳线条线来短接到GND,来触发,最方便的还是更换其他引脚。配网这种行为,不是经常去使用,放在此引脚上也无妨,看个人需求了

配网示例

#include <WiFi.h>
#include <DNSServer.h>
#include <WebServer.h>
#include <ESPmDNS.h>      //用于设备域名 MDNS.begin("esp32")
#include <esp_wifi.h>     //用于esp_wifi_restore() 删除保存的wifi信息const int baudRate = 115200;               //设置波特率
const byte DNS_PORT = 53;                  //设置DNS端口号
const int webPort = 80;                    //设置Web端口号
const int resetPin = 0;                    //设置重置按键引脚,用于删除WiFi信息
const int LED = 2;                         //设置LED引脚
const char* AP_SSID  = "NodeMCU-ESP32";    //设置AP热点名称
//const char* AP_PASS  = "";               //设置AP热点密码
const char* HOST_NAME = "MY_ESP32S";       //设置设备名
String scanNetworksID = "";                //用于储存扫描到的WiFi ID
int connectTimeOut_s = 15;                 //WiFi连接超时时间,单位秒
IPAddress apIP(192, 168, 4, 1);            //设置AP的IP地址
String wifi_ssid = "";                     //暂时存储wifi账号密码
String wifi_pass = "";                     //暂时存储wifi账号密码//定义根目录首页网页HTML源代码
#define ROOT_HTML  "<!DOCTYPE html><html><head><title>WIFI Config by lwang</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><style type=\"text/css\">.input{display: block; margin-top: 10px;}.input span{width: 100px; float: left; float: left; height: 36px; line-height: 36px;}.input input{height: 30px;width: 200px;}.btn{width: 120px; height: 35px; background-color: #000000; border:0px; color:#ffffff; margin-top:15px; margin-left:100px;}</style><body><form method=\"POST\" action=\"configwifi\"><label class=\"input\"><span>WiFi SSID</span><input type=\"text\" name=\"ssid\" value=\"\"></label><label class=\"input\"><span>WiFi PASS</span><input type=\"text\"  name=\"pass\"></label><input class=\"btn\" type=\"submit\" name=\"submit\" value=\"Submie\"> <p><span> Nearby wifi:</P></form>"
//定义成功页面HTML源代码
#define SUCCESS_HTML  "<html><body><font size=\"10\">successd,wifi connecting...<br />Please close this page manually.</font></body></html>"DNSServer dnsServer;            //创建dnsServer实例
WebServer server(webPort);      //开启web服务, 创建TCP SERVER,参数: 端口号,最大连接数//初始化AP模式
void initSoftAP(){WiFi.mode(WIFI_AP);     //配置为AP模式WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));   //设置AP热点IP和子网掩码if(WiFi.softAP(AP_SSID)){   //开启AP热点,如需要密码则添加第二个参数//打印相关信息Serial.println("ESP-32S SoftAP is right.");Serial.print("Soft-AP IP address = ");Serial.println(WiFi.softAPIP());Serial.println(String("MAC address = ")  + WiFi.softAPmacAddress().c_str());}else{  //开启热点失败Serial.println("WiFiAP Failed");delay(1000);Serial.println("restart now...");ESP.restart();  //重启复位esp32}
}//初始化DNS服务器
void initDNS(){ //判断将所有地址映射到esp32的ip上是否成功if(dnsServer.start(DNS_PORT, "*", apIP)){ Serial.println("start dnsserver success.");}else{Serial.println("start dnsserver failed.");}
}//初始化WebServer
void initWebServer(){//给设备设定域名esp32,完整的域名是esp32.local if(MDNS.begin("esp32")){Serial.println("MDNS responder started");}//必须添加第二个参数HTTP_GET,以下面这种格式去写,否则无法强制门户server.on("/", HTTP_GET, handleRoot);                      //  当浏览器请求服务器根目录(网站首页)时调用自定义函数handleRoot处理,设置主页回调函数,必须添加第二个参数HTTP_GET,否则无法强制门户server.on("/configwifi", HTTP_POST, handleConfigWifi);     //  当浏览器请求服务器/configwifi(表单字段)目录时调用自定义函数handleConfigWifi处理server.onNotFound(handleNotFound);                         //当浏览器请求的网络资源无法在服务器找到时调用自定义函数handleNotFound处理 //Tells the server to begin listening for incoming connections.Returns Noneserver.begin();                                           //启动TCP SERVER
//server.setNoDelay(true);                                  //关闭延时发送Serial.println("WebServer started!");
}//扫描WiFi
bool scanWiFi(){Serial.println("scan start");// 扫描附近WiFiint n = WiFi.scanNetworks();Serial.println("scan done");if (n == 0) {Serial.println("no networks found");scanNetworksID = "no networks found";return false;}else{Serial.print(n);Serial.println(" networks found");for (int i = 0; i < n; ++i) {// Print SSID and RSSI for each network foundSerial.print(i + 1);Serial.print(": ");Serial.print(WiFi.SSID(i));Serial.print(" (");Serial.print(WiFi.RSSI(i));Serial.print(")");Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");scanNetworksID += "<P>" + WiFi.SSID(i) + "</P>";delay(10);}return true;}
}void connectToWiFi(int timeOut_s){Serial.println("进入connectToWiFi()函数");//设置为STA模式并连接WIFIWiFi.mode(WIFI_STA);WiFi.setAutoConnect(true);//设置自动连接//用字符串成员函数c_str()生成一个const char*指针,指向以空字符终止的数组,即获取该字符串的指针。if(wifi_ssid !=""){Serial.println("用web配置信息连接.");WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str());wifi_ssid = "";wifi_pass = "";}else{Serial.println("用nvs保存的信息连接.");WiFi.begin();//连接上一次连接成功的wifi}//WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str());int Connect_time = 0; //用于连接计时,如果长时间连接不成功,复位设备while (WiFi.status() != WL_CONNECTED) {  //等待WIFI连接成功Serial.print(".");digitalWrite(LED,!digitalRead(LED));delay(500);Connect_time ++;if (Connect_time > 2*timeOut_s) {  //长时间连接不上,重新进入配网页面digitalWrite(LED,LOW);Serial.println("");Serial.println("WIFI autoconnect fail, start AP for webconfig now...");wifiConfig();   //转到网页端手动配置wifireturn;         //跳出 防止无限初始化//break;        //跳出 防止无限初始化}}if(WiFi.status() == WL_CONNECTED){Serial.println("WIFI connect Success");Serial.printf("SSID:%s", WiFi.SSID().c_str());Serial.printf(", PSW:%s\r\n", WiFi.psk().c_str());Serial.print("LocalIP:");Serial.print(WiFi.localIP());Serial.print(" ,GateIP:");Serial.println(WiFi.gatewayIP());Serial.print("WIFI status is:");Serial.print(WiFi.status());digitalWrite(LED,HIGH);      server.stop();}
}//用于配置WiFi
void wifiConfig(){initSoftAP();initDNS();initWebServer();scanWiFi();
}//处理网站根目录“/”(首页)的访问请求,将显示配置wifi的HTML页面
void handleRoot(){if (server.hasArg("selectSSID")){server.send(200, "text/html", ROOT_HTML + scanNetworksID + "</body></html>");}else{server.send(200, "text/html", ROOT_HTML + scanNetworksID + "</body></html>");}
}//提交数据后,返回给客户端信息函数
void handleConfigWifi(){//返回http状态//server.send(200, "text/html", SUCCESS_HTML);if (server.hasArg("ssid")) {//判断是否有账号参数Serial.print("got ssid:");wifi_ssid = server.arg("ssid");      //获取html表单输入框name名为"ssid"的内容// strcpy(sta_ssid, server.arg("ssid").c_str());//将账号参数拷贝到sta_ssid中Serial.println(wifi_ssid);}else{//没有参数Serial.println("error, not found ssid");server.send(200, "text/html", "<meta charset='UTF-8'>error, not found ssid");//返回错误页面return;}//密码与账号同理if (server.hasArg("pass")) {Serial.print("got password:");wifi_pass = server.arg("pass");       //获取html表单输入框name名为"pwd"的内容//strcpy(sta_pass, server.arg("pass").c_str());Serial.println(wifi_pass);}else{Serial.println("error, not found password");server.send(200, "text/html", "<meta charset='UTF-8'>error, not found password");return;}server.send(200, "text/html", "<meta charset='UTF-8'>SSID:"+wifi_ssid+"<br />password:"+wifi_pass+"<br />已取得WiFi信息,正在尝试连接,请手动关闭此页面。");//返回保存成功页面      delay(2000);    WiFi.softAPdisconnect(true);     //参数设置为true,设备将直接关闭接入点模式,即关闭设备所建立的WiFi网络。 server.close();                  //关闭web服务       WiFi.softAPdisconnect();         //在不输入参数的情况下调用该函数,将关闭接入点模式,并将当前配置的AP热点网络名和密码设置为空值.    Serial.println("WiFi Connect SSID:" + wifi_ssid + "  PASS:" + wifi_pass);   if(WiFi.status() != WL_CONNECTED){Serial.println("开始调用连接函数connectToWiFi()..");connectToWiFi(connectTimeOut_s);//进入配网阶段}else{Serial.println("提交的配置信息自动连接成功..");}
}// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){            // 当浏览器请求的网络资源无法在服务器找到时通过此自定义函数处理handleRoot();                 //访问不存在目录则返回配置页面
//   server.send(404, "text/plain", "404: Not found");
}//LED闪烁,led为脚号,n为次数,t为时间间隔ms
void blinkLED(int led,int n,int t){for(int i=0;i<2*n;i++){digitalWrite(led,!digitalRead(led));delay(t);}   }//删除保存的wifi信息,并使LED闪烁5次
void restoreWiFi(){delay(500);esp_wifi_restore();  //删除保存的wifi信息Serial.println("连接信息已清空,准备重启设备..");delay(10);           blinkLED(LED,5,500); //LED闪烁5次digitalWrite(LED,LOW);}void checkConnect(bool reConnect){if(WiFi.status() != WL_CONNECTED){//  Serial.println("WIFI未连接.");//  Serial.println(WiFi.status()); if(digitalRead(LED) != LOW){digitalWrite(LED,LOW);}    if(reConnect == true && WiFi.getMode() != WIFI_AP && WiFi.getMode() != WIFI_AP_STA ){Serial.println("WIFI未连接.");Serial.println("WiFi Mode:");Serial.println(WiFi.getMode());Serial.println("正在连接WiFi...");connectToWiFi(connectTimeOut_s);}  }else if(digitalRead(LED) != HIGH){digitalWrite(LED,HIGH);}}void setup() {pinMode(LED,OUTPUT);                  //配置LED口为输出口digitalWrite(LED,LOW);                //初始灯灭pinMode(resetPin, INPUT_PULLUP);      //按键上拉输入模式(默认高电平输入,按下时下拉接到低电平)Serial.begin(baudRate);WiFi.hostname(HOST_NAME);             //设置设备名connectToWiFi(connectTimeOut_s);
}void loop() {//长按5秒(P0)清除网络配置信息if(!digitalRead(resetPin)){delay(5000);if(!digitalRead(resetPin)){   Serial.println("\n按键已长按5秒,正在清空网络连保存接信息.");  restoreWiFi();    //删除保存的wifi信息 ESP.restart();    //重启复位esp32Serial.println("已重启设备.");}      }dnsServer.processNextRequest();   //检查客户端DNS请求server.handleClient();            //检查客户端(浏览器)http请求checkConnect(true);               //检测网络连接状态,参数true表示如果断开重新连接delay(30);
}
  • 编译信息
使用 1.0  版本的库 WiFi 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\WiFi
使用 1.1.0  版本的库 DNSServer 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\DNSServer
使用 1.0  版本的库 WebServer 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\WebServer
使用 1.0  版本的库 ESPmDNS 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\ESPmDNS
使用 1.0  版本的库 FS 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\FS
"C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\xtensa-esp32-elf-gcc\\1.22.0-97-gc752ad5-5.2.0/bin/xtensa-esp32-elf-size" -A "d:\\arduino\\MyHexDir/ESP32webwifi.ino.elf"
项目使用了 769122 字节,占用了 (58%) 程序存储空间。最大为 1310720 字节。
全局变量使用了41056字节,(12%)的动态内存,余留286624字节局部变量。最大为327680字节。

Arduino ESP32Web配网相关推荐

  1. Arduino ESP32Web配网(二)

    Arduino ESP32Web配网(二) 相关篇<Arduino ESP32Web配网> 相对于之前的那篇文章,这篇的配网有不同的地方就是,html页面修饰了一下. 配网操作 1.如果是 ...

  2. 【Arduino自动配网+微信Airkiss配网】

    Arduino自动配网+微信Airkiss配网 一.Arduino自动配网 当密码输入正确时 当密码输入错误时 自动配网的代码 二.Arduino微信Airkiss配网. 关注安信可公众号选择微信配网 ...

  3. ESP8266 arduino 一键配网之后掉电不丢失wifi数据

    本文关注掉电丢失wifi数据和不丢失数据的异同点. 一.软硬件 所用硬件如下图,软件是arduino 1.8.9. 二.代码分析 代码如下: void smartConfig() {WiFi.mode ...

  4. ESP8266 Blinker 小爱同学 本地控制 手机配网 四路开关 物联网 arduino编程详细注释

    作为一名注册12年CSDN的电脑爱好者,没有从事喜欢的IT行业还是颇有那么一丝丝的想念. 通过一段时间的arduino编程和ESP8266学习,参考示例程序等,完善了自己的一份小爱同学四开关控制的程序 ...

  5. ESP8266 web配网微信小程序配网 全平台配网库 arduino 傻瓜式通用库

    wifi_link_tool esp8266通用配网库 (arduino) 库地址:点击进入GitHub 这是一个为esp8266设计的通用配网库 该库免费提供 使用请注明出处 允许毕业设计使用本库 ...

  6. Arduino+ESP8266自动配网并上传温湿度、光照强度到OneNET

    前言:     从接触ESP8266到现在有一段时间了,也感受到ESP8266的强大,其高性价比给极客者们带来了极大的福音.之前用ESP8266改装了一部遥控车,使其能用手机控制,手机app是用易安卓 ...

  7. 使用Arduino开发ESP32(二十九):WiFismartconfig,一键配网,又名快连

    前言 目前流行的wifi配置模式一般有以下2种: 1:智能硬件处于AP模式,手机用于station模式,手机连接智能插座的AP后组成局域网,手机发送需要连接路由的SSID及密码至智能插座,智能硬件主动 ...

  8. ESP32 C3 使用ConfigWiFi配网

    ESP32C3 的配网方式有好多种,这里主要使用AP配网方式.在 ESP32C3 上建立热点AP,使用手机连接上后在浏览器打开配置网页,输入WIFI信息,完成配网.这种方式很可靠,而且允许在电脑端完成 ...

  9. WiFi-ESP8266入门http(3-4)网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信...

    网页一键配网(1若为普通wifi直连  2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信 工程连接:https://github.com/Dongvdong/ESP8266_H ...

最新文章

  1. Python基础入门教程:使用 Python 3 协程快速获得一个代理池
  2. boseqc35能不能连电脑_连win7都用不了?轻量级LXLE系统,只要10分钟,旧电脑也能运行如飞!...
  3. 自由自在珍珠奶茶以市场细分来创新品牌
  4. JS中数据类型、内置对象、包装类型对象、typeof关系
  5. RTMPdump(libRTMP) 源代码分析 7: 建立一个流媒体连接 (NetStream部分 2)
  6. 【Spring】SpringMVC之REST编程风格
  7. 【整理】强化学习与MDP
  8. I2C 协议分析和学习
  9. JAVA线程池的创建
  10. Hierarchical clustering
  11. 支付宝-生成二维码实现url,实现支付
  12. java 里面耦合和解耦
  13. 如何判断JS拿给我的是不是新机
  14. python可视化Bokeh 线形图(带分页)
  15. 如何学好编程(一):什么叫编程
  16. React全家桶+AntD 实战二
  17. 谈绿之韵传销斗争路!董事长胡国安感慨十年沉浮
  18. 深入理解拉普拉斯特征映射
  19. CSDN博客周刊·2008年第4期
  20. traceroute命令

热门文章

  1. 如何制作公众号首图?教你一键套用图片模板
  2. 安恒6月月赛 DASCTF 6th Re 部分wp
  3. Lifeline功能介绍01——日历及时间轴的查看
  4. 广州车展开幕:超定律智能纯电SUV埃安Y全球首发
  5. php手机号正则替换中间四位
  6. 大学计算机实践教程课后答案,大学计算机基础实践教程习题答案.pdf
  7. 人才测评之计划能力,如何提高计划能力?
  8. Springboot毕设项目电子竞技赛事管理系统f1v55java+VUE+Mybatis+Maven+Mysql+sprnig)
  9. SMB Signing not required
  10. 深度学习基础技术分析2:神经网络(含代码分析)