第一版 原型系统
连上西电的网
直接发送上网的认证信息
返回认证结果网页
成功上网
#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 " + "Host: " + host + " " + "Connection: Keep Alive " + "Content-Length: " + length + " " + "Accept: */* " + "Origin: http://"+host+" " + "Upgrade-Insecure-Requests: 1"+" " + "Content-Type: application/x-www-form-urlencoded;" + " " + "User-Agent: zyzandESP8266 " + "Accept-Encoding: gzip, deflate"+" " + "Accept-Language: zh-CN,zh;q=0.9"+" " + " " + data + " "; client.print(postRequest); delay(600); //处理返回信息 String line = client.readStringUntil(' '); while (client.available() > 0) { line += " "+client.readStringUntil(' '); } 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 " + "Host: " +ruqest.host + " " + "Connection: Keep Alive " + "Content-Length: " + length + " " + "Accept: */* " + "Origin: http://"+ruqest.host+" " + "Upgrade-Insecure-Requests: 1"+" " + "Content-Type: application/x-www-form-urlencoded;" + " " + "User-Agent: zyzandESP8266 " + "Accept-Encoding: gzip, deflate"+" " + "Accept-Language: zh-CN,zh;q=0.9"+" " + " " + data + " "; client.print(postRequest); delay(600); //处理返回信息 String line = client.readStringUntil(' '); while (client.available() > 0) { line += " "+client.readStringUntil(' '); } 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 ", httpCode); // 数据正常返回 if (httpCode == 200) { String payload = http.getString(); Serial.print(payload); } else{ Serial.print("httpCode... failed "); delay(5000); } } else { Serial.print("GET... failed "); } delay(5000); } }
第三版 HTTP+MQTT
西电网页认证上网
直接连接公网mqtt
手机发消息,esp8266向电脑打印出来
arduino 不支持中文汉字打印输出
上面是 西电网页认证后返回的网页源码
下面是从MQTT服务器接收的数据
至此初步完成ESP8266网页认证上网模式。
下一步,将固定的post请求信息换成网页输入可以配置的
- 网页输入wifi名(网页认证模式的wifi),无密码
- 网页输入自己的学号和密码
- 自动截取给网页服务器返回的 http请求和参数格式
- 由此配置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 " + "Host: " +ruqest.host + " " + "Connection: Keep Alive " + "Content-Length: " + length + " " + "Accept: */* " + "Origin: http://"+ruqest.host+" " + "Upgrade-Insecure-Requests: 1"+" " + "Content-Type: application/x-www-form-urlencoded;" + " " + "User-Agent: zyzandESP8266 " + "Accept-Encoding: gzip, deflate"+" " + "Accept-Language: zh-CN,zh;q=0.9"+" " + " " + data + " "; client.print(postRequest); delay(600); //处理返回信息 String line = client.readStringUntil(' '); while (client.available() > 0) { line += " "+client.readStringUntil(' '); } 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 "); } delay(5000); }