第一版 原型系统

连上西电的网

直接发送上网的认证信息

返回认证结果网页

成功上网

#include <ESP8266WiFi.h>

 #define Use_Serial Serial

struct http_request{

  String  Referer;
char* host;
int httpPort = 80;
String host_ur ;
String postDate ; }; /*WIFI账号和密码*/ const char* ssid = "stu-xdwlan"; // Enter SSID here
const char* password = ""; //Enter Password here /*网页认证上网模式 */
String usr_name="1601120383";//账号
String usr_pwd="mimaHENFuzb";//密码 加密-1 /*网页认证上网post*/
String Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
char* host = "10.255.44.33";
int httpPort = 80;
String host_ur = "srun_portal_pc.php";
String postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+usr_name+"&password="+usr_pwd; /*--------------------------------------------------------------
*
通过上网认证,请自己修改postDate中的学号和密码 ---------------------------------------------------------------*/
int hdulogin() { WiFiClient client; if (!client.connect(host, httpPort)) {
Use_Serial.println("connection failed");
return 1;
}
delay(10); if (postDate.length() && postDate != "0") {
String data = (String)postDate;
int length = data.length(); String postRequest =
(String)("POST ") + "/"+host_ur+" HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: Keep Alive\r\n" +
"Content-Length: " + length + "\r\n" +
"Accept: */*\r\n" +
"Origin: http://"+host+"\r\n" +
"Upgrade-Insecure-Requests: 1"+"\r\n" +
"Content-Type: application/x-www-form-urlencoded;" + "\r\n" +
"User-Agent: zyzandESP8266\r\n" +
"Accept-Encoding: gzip, deflate"+"\r\n" +
"Accept-Language: zh-CN,zh;q=0.9"+"\r\n" +
"\r\n" +
data + "\r\n"; client.print(postRequest);
delay(600);
//处理返回信息
String line = client.readStringUntil('\n');
while (client.available() > 0) {
line += "\r\n"+client.readStringUntil('\n');
}
Use_Serial.println(line);
client.stop(); if (line.indexOf("logon success") != -1 || line.indexOf("不需要") != -1) { //认证成功
return 0;
}
else {
return 2;
} }
client.stop();
return 2;
} void setup() {
Use_Serial.begin(115200);
delay(1000); Use_Serial.println("Connecting to ");
Use_Serial.println(ssid); //connect to your local wi-fi network
WiFi.begin(ssid, password); //check wi-fi is connected to wi-fi network
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Use_Serial.print(".");
}
Use_Serial.println("");
Use_Serial.println("WiFi connected"); hdulogin();
} void loop()
{ }

  

第二版  直接访问百度

连上西电WIFI

认证上网后

ping 百度或者其他网页

返回 请求网页源码

bug  百度能ping通,但是没网页,换了自己的服务器,访问hass,有数据

#include <ESP8266WiFi.h>
#include <string.h>
#include <ESP8266HTTPClient.h>
#define Use_Serial Serial #ifdef ESP8266
extern "C" {
#include "user_interface.h" //含有system_get_chip_id()的库
}
#endif //储存SN号
String SN; struct http_request {
String Referer;
char* host;
int httpPort=80;
String host_ur ; String usr_name;//账号
String usr_pwd;//密码 String postDate; }; /*WIFI账号和密码*/ const char* ssid = "stu-xdwlan"; // Enter SSID here
const char* password = ""; //Enter Password here /*网页认证上网post*/
// String Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
// char* host = "10.255.44.33";
// int httpPort = 80;
// String host_ur = "srun_portal_pc.php"; /*网页认证上网模式 */
// String usr_name;//账号
// String usr_pwd;//密码
// String postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+usr_name+"&password="+usr_pwd; /*--------------------------------------------------------------
*
通过上网认证,请自己修改postDate中的学号和密码 ---------------------------------------------------------------*/
int hdulogin(struct http_request ruqest) {
WiFiClient client; if (!client.connect(ruqest.host, ruqest.httpPort)) {
Use_Serial.println("connection failed");
return 1;
}
delay(10); if (ruqest.postDate.length() && ruqest.postDate != "0") {
String data = (String)ruqest.postDate;
int length = data.length(); String postRequest =
(String)("POST ") + "/"+ruqest.host_ur+" HTTP/1.1\r\n" +
"Host: " +ruqest.host + "\r\n" +
"Connection: Keep Alive\r\n" +
"Content-Length: " + length + "\r\n" +
"Accept: */*\r\n" +
"Origin: http://"+ruqest.host+"\r\n" +
"Upgrade-Insecure-Requests: 1"+"\r\n" +
"Content-Type: application/x-www-form-urlencoded;" + "\r\n" +
"User-Agent: zyzandESP8266\r\n" +
"Accept-Encoding: gzip, deflate"+"\r\n" +
"Accept-Language: zh-CN,zh;q=0.9"+"\r\n" +
"\r\n" +
data + "\r\n"; client.print(postRequest);
delay(600);
//处理返回信息
String line = client.readStringUntil('\n');
while (client.available() > 0) {
line += "\r\n"+client.readStringUntil('\n');
}
Use_Serial.println(line);
client.stop(); if (line.indexOf("时间") != -1 || line.indexOf("登陆") != -1) { //认证成功
return 0;
Use_Serial.println("time ----------- find ");
}
else {
return 2;
} }
client.stop();
return 2;
} void setup() {
Use_Serial.begin(115200);
delay(1000); Use_Serial.println("Connecting to ");
Use_Serial.println(ssid); //connect to your local wi-fi network
WiFi.begin(ssid, password); //check wi-fi is connected to wi-fi network
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Use_Serial.print(".");
}
Use_Serial.println("");
Use_Serial.println("WiFi connected"); SN = (String )system_get_chip_id();
Serial.println(SN); // 认证上网
http_request ruqest;
ruqest.Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
ruqest.host = "10.255.44.33";
ruqest.httpPort = 80;
ruqest.host_ur = "srun_portal_pc.php";
ruqest.usr_name="1601120383";//账号
ruqest.usr_pwd="mimaHENFuzb";//密码 密码已经修改 +1
ruqest.postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+ ruqest.usr_name+"&password="+ruqest.usr_pwd; hdulogin(ruqest); } void loop()
{ if(WiFi.status() == WL_CONNECTED){ HTTPClient http; http.begin("www.baidu.com", 80,"/"); //HTTP int httpCode = http.GET(); if (httpCode) {
// 打印返回代码
Serial.printf("code=%d\n", httpCode); // 数据正常返回
if (httpCode == 200) {
String payload = http.getString();
Serial.print(payload); }
else{
Serial.print("httpCode... failed\n");
delay(5000);
} }
else {
Serial.print("GET... failed\n");
}
delay(5000);
}
}

  第三版 HTTP+MQTT

西电网页认证上网

直接连接公网mqtt

手机发消息,esp8266向电脑打印出来

arduino 不支持中文汉字打印输出

上面是 西电网页认证后返回的网页源码

下面是从MQTT服务器接收的数据

至此初步完成ESP8266网页认证上网模式。

下一步,将固定的post请求信息换成网页输入可以配置的

  1. 网页输入wifi名(网页认证模式的wifi),无密码
  2. 网页输入自己的学号和密码
  3. 自动截取给网页服务器返回的 http请求和参数格式
  4. 由此配置ESO8266来网页认证上网

关于网页服务器建立,返回页面,手动输入配置信息的教程看 ESP8266路由文件教程。

#include <ESP8266WiFi.h>
#include <string.h>
#include <ESP8266HTTPClient.h>
#define Use_Serial Serial #include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h" #define AIO_SERVER "www.dongvdong.top"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME ""
#define AIO_KEY ""
WiFiClient mqttclient;
Adafruit_MQTT_Client mqtt(&mqttclient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/test", MQTT_QOS_1);
void onoffcallback(char *data, uint16_t len) {
Serial.print("Hey we're in a onoff callback, the button value is: ");
Serial.println(data);
} void MQTT_connect() {
int8_t ret; // Stop if already connected.
if (mqtt.connected()) {
return;
} Serial.print("Connecting to MQTT... "); uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 10 seconds...");
mqtt.disconnect();
delay(10000); // wait 10 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT Connected!");
} #ifdef ESP8266
extern "C" {
#include "user_interface.h" //含有system_get_chip_id()的库
}
#endif //储存SN号
String SN; struct http_request {
String Referer;
char* host;
int httpPort=80;
String host_ur ; String usr_name;//账号
String usr_pwd;//密码 String postDate; }; /*WIFI账号和密码*/ const char* ssid = "stu-xdwlan"; // Enter SSID here
const char* password = ""; //Enter Password here /*网页认证上网post*/
// String Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
// char* host = "10.255.44.33";
// int httpPort = 80;
// String host_ur = "srun_portal_pc.php"; /*网页认证上网模式 */
// String usr_name;//账号
// String usr_pwd;//密码
// String postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+usr_name+"&password="+usr_pwd; /*--------------------------------------------------------------
*
通过上网认证,请自己修改postDate中的学号和密码 ---------------------------------------------------------------*/
int hdulogin(struct http_request ruqest) {
WiFiClient client; if (!client.connect(ruqest.host, ruqest.httpPort)) {
Use_Serial.println("connection failed");
return 1;
}
delay(10); if (ruqest.postDate.length() && ruqest.postDate != "0") {
String data = (String)ruqest.postDate;
int length = data.length(); String postRequest =
(String)("POST ") + "/"+ruqest.host_ur+" HTTP/1.1\r\n" +
"Host: " +ruqest.host + "\r\n" +
"Connection: Keep Alive\r\n" +
"Content-Length: " + length + "\r\n" +
"Accept: */*\r\n" +
"Origin: http://"+ruqest.host+"\r\n" +
"Upgrade-Insecure-Requests: 1"+"\r\n" +
"Content-Type: application/x-www-form-urlencoded;" + "\r\n" +
"User-Agent: zyzandESP8266\r\n" +
"Accept-Encoding: gzip, deflate"+"\r\n" +
"Accept-Language: zh-CN,zh;q=0.9"+"\r\n" +
"\r\n" +
data + "\r\n"; client.print(postRequest);
delay(600);
//处理返回信息
String line = client.readStringUntil('\n');
while (client.available() > 0) {
line += "\r\n"+client.readStringUntil('\n');
}
Use_Serial.println(line);
client.stop(); if (line.indexOf("时间") != -1 || line.indexOf("登陆") != -1) { //认证成功
return 0;
Use_Serial.println("time ----------- find ");
}
else {
return 2;
} }
client.stop();
return 2;
} void setup() {
Use_Serial.begin(115200);
delay(1000); Use_Serial.println("Connecting to ");
Use_Serial.println(ssid); //connect to your local wi-fi network
WiFi.begin(ssid, password); //check wi-fi is connected to wi-fi network
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Use_Serial.print(".");
}
Use_Serial.println("");
Use_Serial.println("WiFi connected"); SN = (String )system_get_chip_id();
Serial.println(SN); onoffbutton.setCallback(onoffcallback);
mqtt.subscribe(&onoffbutton); // 认证上网
http_request ruqest;
ruqest.Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
ruqest.host = "10.255.44.33";
ruqest.httpPort = 80;
ruqest.host_ur = "srun_portal_pc.php";
ruqest.usr_name="1601120383";//账号
ruqest.usr_pwd="mimaHENFuzb";//密码 经修改 +1
ruqest.postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+ ruqest.usr_name+"&password="+ruqest.usr_pwd; hdulogin(ruqest); } void loop()
{ if(WiFi.status() == WL_CONNECTED){ MQTT_connect();
mqtt.processPackets(10000);
if(! mqtt.ping()) {
mqtt.disconnect(); } }
else {
Serial.print("wifi... failed\n"); }
delay(5000);
}

  

WiFi-ESP8266入门http(3-3)网页认证上网-post请求-ESP8266程序的更多相关文章

  1. WiFi-ESP8266入门http(3-2)网页认证上网-post请求

    测试账号密码 加密模式  1 18011210338  + 015871     - 测试2 1601120382       +1 mimaHENFuzb  -1 打开网页 手机端 http://1 ...

  2. WiFi-ESP8266入门http(3-1)网页认证上网-post请求(原教程)

    教程:http://geek-workshop.com/thread-37484-1-1.html 源码:链接:https://pan.baidu.com/s/1yuYYqsM-WSOb0AbyAT0 ...

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

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

  4. 我了解到的新知识之—Apple Captive Portal 网页认证登陆公共Wifi

    因为今天一个用户遇到选择公司WiFi后,无法弹出网页认证登陆界面的问题,随即上网搜索相关信息,因为公司内没有VPN,无法FQ,只能用bing来搜索一下相关信息了. Captive Portal听起来好 ...

  5. ESP8266入门学习笔记1:资料获取

    乐鑫官网:https://www.espressif.com/zh-hans/products/hardware/esp8266ex/overview 乐鑫资料:https://www.espress ...

  6. ESP8266 HTTP 项目(1)在刻度盘上进行ESP8266 NodeMCU模拟读取的步骤

    https://circuits4you.com/2018/02/03/esp8266-nodemcu-adc-analog-value-on-dial-gauge/ ESP8266(NodeMCU) ...

  7. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. Jmeter Web 性能测试入门 (二):Fiddler 抓取 http/https 请求

    jmeter自带了拦截request的功能,并且也有对应的tool:badboy 可以用.但由于我经常做移动端的项目,个人还是习惯用fiddler来收集request. 官网下载并安装Fiddler ...

  9. 将win7电脑无线网变身WiFi热点,让手机、笔记本共享上网

    1.以管理员身份运行命令提示符:快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡:运行命令:netsh wlan set hostednetwork mode=allow ssid= ...

随机推荐

  1. C# AESCBC256 与 java AESCBC256 加解密

    和某上市公司对接接口,他们试用 java AES CBC PKCS5 256 加解密.网上C# 基本不合适. 注意:C# PKCS7 对应 java PKCS5 /// <summary> ...

  2. 整理:手机端弹出提示框,使用的bootstrap中的模态框(modal,弹出层),比kendo弹出效果好

    效果图: 我的代码示例: <!--提示模态框--> <div class="modal fade" id="myModal" tabindex ...

  3. thinkphp简洁、美观、靠谱的分页类

    我们要实现如下图分页效果 这个分页类是在thinkphp框架内置的分页类的基础上修改而来:原分页类的一些设计,在实际运用中感觉不是很方便: 1.只有一页内容时不显示分页: 2.原分页类在当前页是第一页 ...

  4. jquery网页日历显示控件calendar3.1使用详解

    关于日历插件,我做了好多次尝试,一直致力于开发一款简单易用的日历控件.我的想法是争取在引用这个控件后,用一行js代码就能做出一个日历,若在加点参数,就能自定义外观和功能丰富多彩的日历.Calendar ...

  5. angular 用拦截器统一处理http请求和响应 比如加token

    想使用angularjs里的htpp向后台发送请求,现在有个用户唯一识别的token想要放到headers里面去,也就是{headres:{'token':1}} index.html里引入以下js: ...

  6. Python 'xxx' codec can't decode byte xxx常见编码错

    'xxx' codec can't decode byte xxx常见编码错误处理 by:授客 QQ:1033553122 测试环境 python 3.3.2 win7 问题描述 利用python文件 ...

  7. Python基础知识点

    自学记录: 1.字符串 python中单引号和双引号使用完全相同. 使用三引号('''或""")可以指定一个多行字符串. 转义符 '\' 反斜杠可以用来转义,使用r可以让 ...

  8. C#:读取视频的宽度和高度等信息

    读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 通过ffmpeg执行一条CMD命令可以读取出视频的帧高度和帧宽度信息. 如图: 蓝线框中可以看到获取到的帧高度和帧宽度. ...

  9. 口碑点餐相关问题FAQ

    1.菜品上传中:出现重复错误或者违禁词 检查并修改商家中心本次上传中的重复菜品,或者删除口碑掌柜以及第三方平台已添加的重复菜品(重复菜品临时快捷办法:修改菜品名称) 2.手持pos 打开自动接单,无响 ...

  10. 【Linux高频命令专题(24)】grep

    简述 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则 ...