zoukankan      html  css  js  c++  java
  • WiFi-ESP8266入门http(3-3)网页认证上网-post请求-ESP8266程序

     第一版 原型系统

     连上西电的网

    直接发送上网的认证信息

    返回认证结果网页

    成功上网

    #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请求信息换成网页输入可以配置的

    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
    " +
                             "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);
    }
    

      

  • 相关阅读:
    罗辑思维 140 认钱不认人(刚需是扯淡,一切都是稀缺,人生全是选择)——理性永远都是最珍贵的
    程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)
    Qt中使用ActiveX(3篇)
    windows下的socket网络编程(入门级)
    网络数据包发送工具PacketSender中文源码
    avalon.js实现一个简易日历
    avalonJS入门(一)
    JS中的模块规范(CommonJS,AMD,CMD)
    程序员必看的书
    简单的语音聊天室
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/9616614.html
Copyright © 2011-2022 走看看