1.首先你准备材料

一块Esb8266 NodeMCU CH340开发版(淘宝十几块钱买一个)一块0.96寸OLED 屏幕(4针)4根杜邦线电脑


这个是我用esp8266做的一个小时钟

2.有了材料后,再来了解一下强制门户认证的原理


强制门户认证所谓强制门户认证(Captive Portal),就是用户连接无线网之后并非直接获得互联网的连接权限,而是需要通过该无线网站点提供者所要求的身份验证之后才能得到访问互联网的许可(该许可由无线网站点提供者给予)。

你可以把无线站点想象成外卖平台,你要下单需要通过这个平台告知商家,由平台前往商家取货并负责订单的运输,你最后收到订单。那强制门户认证就是在你下单之前要求你进行登录平台以获得你相应的个人信息,订单记录等。

在很多公共场所都用到了这一技术,因为其方便快捷且易于管理,通常的无线加密诸如WPA2-WPA知道密码就能登录,难以管理连接的设备。在部分酒店,通过强制门户认证实现了输入房间号及姓名来接入互联网的认证方式,极大程度的提高了无线网接入客户的管理成本。在一些航班中,通过使用强制门户认证来实现对用户进行网络连接的定时收费。

我们在连接到wifi的时候,手机或者电脑都会访问一些特定的网址来检测这个wifi是不是有效wifi,还是一个无法访问互联网的wifi。而我们的突破口就在这个这些特定的网址

通过这个我手绘的图可以简单了解,现在我们只要将ip地址换成我们自己的ip地址就可以达到强制门户认证。

3.至于配置,可以参考这篇博客(1条消息) Esp8266时钟憨憨的憨憨的博客-CSDN博客esp8266时钟

4.在Arduino编写代码

#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display
const char* AP_NAME = "hello,world";//wifi名字
//暂时存储wifi账号密码
char sta_ssid[32] = "12345678";
char sta_password[64] = "12345678";
//配网页面代码
const char* page_html = "\
<!DOCTYPE html>\r\n\
<html lang='en'>\r\n\
<head>\r\n\
<meta charset='UTF-8'>\r\n\
<meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
<title>Document</title>\r\n\
</head>\r\n\
<body>\r\n\
<form name='input' action='/' method='POST'>\r\n\wifi名称: <br>\r\n\<input type='text' name='ssid'><br>\r\n\wifi密码:<br>\r\n\<input type='text' name='password'><br>\r\n\<input type='submit' value='保存'>\r\n\</form>\r\n\
</body>\r\n\
</html>\r\n\
";const byte DNS_PORT = 53;//DNS端口号
IPAddress apIP(192, 168, 4, 1);//esp8266-AP-IP地址
DNSServer dnsServer;//创建dnsServer实例
ESP8266WebServer server(80);//创建WebServervoid handleRoot() {//访问主页回调函数
server.send(200, "text/html", page_html);
}void handleRootPost() {//Post回调函数
Serial.println("handleRootPost");
if (server.hasArg("ssid")) {//判断是否有账号参数Serial.print("got ssid:");strcpy(sta_ssid, server.arg("ssid").c_str());//将账号参数拷贝到sta_ssid中Serial.println(sta_ssid);u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"u8g2.setFontDirection(0);u8g2.clearBuffer();u8g2.setCursor(0, 15);u8g2.printf(sta_ssid);u8g2.sendBuffer();delay(1000);
} else {//没有参数Serial.println("error, not found ssid");server.send(200, "text/html", "<meta charset='UTF-8'>error, not found ssid");//返回错误页面return;
}
//密码与账号同理
if (server.hasArg("password")) {Serial.print("got password:");strcpy(sta_password, server.arg("password").c_str());Serial.println(sta_password);u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.printf(sta_ssid);
u8g2.setCursor(0, 40);
u8g2.printf(sta_password);   // Chinese "Hello World"
u8g2.sendBuffer();
delay(1000);
} 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'>保存成功");//返回保存成功页面
delay(2000);
//连接wifi
connectNewWifi();
}void initBasic(void){//初始化基础
Serial.begin(115200);
WiFi.hostname("Smart-ESP8266");//设置ESP8266设备名
}void initSoftAP(void){//初始化AP模式
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
if(WiFi.softAP(AP_NAME)){Serial.println("ESP8266 SoftAP is right");
}
}void initWebServer(void){//初始化WebServer
//server.on("/",handleRoot);
//上面那行必须以下面这种格式去写否则无法强制门户
server.on("/", HTTP_GET, handleRoot);//设置主页回调函数
server.onNotFound(handleRoot);//设置无法响应的http请求的回调函数
server.on("/", HTTP_POST, handleRootPost);//设置Post请求回调函数
server.begin();//启动WebServer
Serial.println("WebServer started!");
}void initDNS(void){//初始化DNS服务器
if(dnsServer.start(DNS_PORT, "*", apIP)){//判断将所有地址映射到esp8266的ip上是否成功Serial.println("start dnsserver success.");
}
else Serial.println("start dnsserver failed.");
}void connectNewWifi(void){
int count = 0;while (1) {delay(500);count++;if(count > 1){//如果5秒内没有连上,就开启Web配网 可适当调整这个时间initSoftAP();initWebServer();initDNS();break;//跳出 防止无限初始化}Serial.print(".");
}
Serial.println("");
if(WiFi.status() == WL_CONNECTED){//如果连接上 就输出IP信息 防止未连接上break后会误输出Serial.println("WIFI Connected!");Serial.print("IP address: ");Serial.println(WiFi.localIP());//打印esp8266的IP地址server.stop();
}
}void setup() {
initBasic();
initSoftAP();
initWebServer();
initDNS();
u8g2.begin();
u8g2.enableUTF8Print();   // enable UTF8 support for the Arduino print() function}void loop() {
server.handleClient();
dnsServer.processNextRequest();}```

直接刷入你的esp8266就行,你输入的账号密码在保存后都可以在那个oled屏幕显示出来

5.如果要驱动和相关资源的话,可加qq群342096685

用esp8266实现强制门户(连接WiFi自动打开网页)相关推荐

  1. ESP8266的Web配网以及强制门户的实现(连接wifi自动打开网页)

    目录 前言 Web配网详解 强制门户详解 完整代码 实验效果 前言 1.Web配网概述 在应用到esp8266的场景,往往与wifi是离不开的,但用户的wifi账号密码又无从知晓,于是乎有了配网. 目 ...

  2. ESP8266Web配网(连接wifi自动打开网页)

    前言 1.Web配网概述 在应用到esp8266的场景,往往与wifi是离不开的,但用户的wifi账号密码又无从知晓,于是乎有了配网. 目前,市面上的配网方式多种多样,但其中博主觉得成功率最高,最方便 ...

  3. esp8266 esp12 AT指令连接wifi热点联网,HTTP获取OneNET物联网平台消息,控制四路远程开关

    esp8266 esp12 使用AT指令联网非常方便,很适合应对已经开发好的成品需要增加联网功能的需求. 使用AT指令进行开发,大多数是产品已经开发好,只需要增加小数据量的联网功能,而且不想对既有成品 ...

  4. Android Wifi自动打开并连接

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 转自:http://blog.csdn.net/yangwen123/article/details/9996 ...

  5. 电脑上的计算机自动打开,手机连接电脑自动打开word

    手机连接电脑弹出Microsoft Office Word 2007 win8系统处理方法:1. 在控制面板-&gt:硬件和声音-&gt:自动播放里,2. iphone手机的设置值是 ...

  6. 【电脑连接wifi不能访问网页但是微信和QQ可以登录如何解决】

    电脑连接wifi不能访问网页但是微信和QQ可以登录如何解决 选择WIFI,修改DNS配置 1.选择控制面板,找到连接的WLAN,右键选择"Internet协议版本4(TCP/IPV4)&qu ...

  7. 计算机通过路由器连接网络连接到服务器,用路由器连接网络无法打开网页怎么办【解决方法】...

    以前都是网线直接插在电脑上,现在用了无线路由器以后,有些页面打不开了,这该怎么解决呢?下面我们一起来看看使用路由器后有些网站打不开的解决方法. 有很多网友会遇到这样的问题 路由器连接网络有些网站打不开 ...

  8. 企业什么喜欢做电视看板,电视看板浏览网页的必备工具 电视看板浏览器 电视看板自动打开网页

    企业喜欢做电视看板主要是因为它可以提供以下几个方面的优势: 增强企业形象:电视看板可以将企业的信息和广告以更加生动.直观的方式呈现出来,提高企业形象和知名度. 提高工作效率:电视看板可以在企业内部作为 ...

  9. 定时自动打开网页的代码(抢券神器)

    今天分享下"定时自动打开网页的代码(抢券神器)"这篇文章,文中根据实例编码详细介绍,或许对大家的编程之路有着一定的参考空间与使用价值,需要的朋友接下来跟着云南仟龙Mark一起学习一 ...

最新文章

  1. word关闭未响应_大众途观全景天窗遮阳卷帘无法关闭
  2. 亲身体验后,为你安利 3 个远程桌面控制软件~
  3. ssm使用全注解实现增删改查案例——Emp
  4. JAVA基础之容器基础内容
  5. Java之五种遍历Map集合的方式
  6. tplink迷你路由器中继模式_斐讯无线路由器设置无线中继(无线扩展)
  7. 历史沉重,人人生活在历史里
  8. JavaSE面向对象-笔记
  9. Liunx 项目部署及域名访问
  10. Serv-u6.0提权新玩法
  11. django 22、python3.4环境下新建django应用失败报错计算机中丢失python27.dll的解决方法
  12. 安装CAD2006出现html,Win7系统安装cad2006出现已终止CAD2006-Simplifieng安装怎么办
  13. Digital Photo Professional 4 如何导出jpg
  14. 天耀18期 - 12.数据结构-1-2.LinkedList【作业】-猜数字.doc
  15. 什么是Java SDK
  16. ARM基本接口之LCD实验
  17. SDOI 2009 学校食堂(好难的状压QAQ
  18. zlib解压 被压缩的PDF(关键字FlateDecode)
  19. 关于EasyX和graphics.h的那些事(上)
  20. 自学考试英语二的考试要求

热门文章

  1. sql server 数据库同步时如果出现 进程未能读取文件 因为发生操作系统错误 5。解决方法:
  2. jpg转成pdf在线
  3. GBase 8s时间限制版本更换为正式版本操作
  4. qt上传文件到iis文件服务器,一篇文章快速搞懂Qt文件读写操作
  5. jieba import 失败ModuleNotFoundError: No module named ‘jieba.analyse‘; ‘jieba‘ is not a package
  6. 中小企业CRM评测-总评
  7. 递归神经网络RNN桨距控制控制风力发电机组
  8. 从底层本质上解析java是值传值还是引用传值
  9. 现在是时候将应用程序迁移到Java 17了?
  10. REVIT插件——BIM建模助手正式上线,新增30多项功能