ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。

 网页

ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。_第1张图片

 

 




  
    
    
    
    ESP8266 配置信息
    
  
  
  
  
    
	

欢迎使用

1板载LED控制

LED状态:

2选择WIFI连接方式:

WIFI连接状态:


<2.1>普通WIFI上网(家庭)

WIFI名称:
WIFI密码:

<2.2>网页认证上网(学校和商场)

WIFI名称:
登陆网址:
上网密钥:

(上网密钥 = 账号(学号)+密码+其他信息)



  程序代码

 

/*


1 上电从rom读取上次WIFI地址
  成功-1网页交互  2MQTT通信
  失败-进入网页模式,等待新的密码


2 
  添加上电检测重连wifi, 如果是普通直连,如果是网页认证,直连+网页请求
*/


//------是否开启打印-----------------
#define Use_Serial Serial


//-----------------------------A-1 库引用开始-----------------//
#include 
#include   // 数学工具库
#include // eeprom  存储库

// WIFI库
#include 
//-------客户端---------
#include 
//---------服务器---------
#include   
#include  

//Mqtt
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"


//ESP获取自身ID
#ifdef ESP8266
extern "C" {
#include "user_interface.h"   //含有system_get_chip_id()的库
}
#endif

//-----------------------------A-1 库引用结束-----------------//




//-----------------------------A-2 变量声明开始-----------------//
int PIN_Led = D4;
bool PIN_Led_State=0;
ESP8266WebServer server ( 80 );  
//储存SN号
String SN;

/*----------------WIFI账号和密码--------------*/
 char ssid[50] = "";    // Enter SSID here
 char password[50] = "";  //Enter Password here
 
#define DEFAULT_STASSID "lovelamp"
#define DEFAULT_STAPSW  "lovelamp" 

// 用于存上次的WIFI和密码
#define MAGIC_NUMBER 0xAA
struct config_type
{
  char stassid[50];
  char stapsw[50];
  uint8_t magic;
};
config_type config_wifi;

//------mqtt头定义-----------------
#define AIO_SERVER      "www.dongvdong.top"  //mqtt服务器
#define AIO_SERVERPORT  1883  //端口
#define AIO_USERNAME    ""
#define AIO_KEY         ""
WiFiClient mqttclient;

//------mqtt通信-----------------
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);



 
//--------------HTTP请求------------------
struct http_request {  
  String  Referer;
  char host[20];
  int httpPort=80;
  String host_ur ;
  
  String usr_name;//账号
  String usr_pwd;//密码
 
  String postDate;

  };

String http_html;
//-----------------------------A-2 变量声明结束-----------------//


//-----------------------------A-3 函数声明开始-----------------//
void wifi_Init();
void saveConfig();
void loadConfig();
int hdulogin(struct http_request ruqest) ;
void http_wifi_xidian();
String getContentType(String filename);
void handleNotFound();
void handleMain();
void handlePin();
void handleWifi();
void http_jiexi(http_request ruqest);
void handleWifi_wangye();
void handleTest();
void MQTT_connect();
void onoffcallback(char *data, uint16_t len) ;
//---------------------------A-3 函数声明结束------------------------//


//-----------------------------A-3 函数-----------------//
//3-1管脚初始化
void get_espid(){
   SN = (String )system_get_chip_id();
  Use_Serial.println(SN);
  
  }
void LED_Int(){
  
   pinMode(D4, OUTPUT); 
  
  }
//3-2WIFI初始化
void wifi_Init(){
  Use_Serial.println("Connecting to ");

   

  Use_Serial.println(config_wifi.stassid);

  WiFi.begin(config_wifi.stassid, config_wifi.stapsw);
 int retries=3;
  while (WiFi.status() != WL_CONNECTED) {
  server.handleClient();  
  // retries--;
 // if (retries == 0) {
  //      Use_Serial.println("WIFI connect 3 times fail!");
     //   return;
      // }
       
  ESP.wdtFeed();
  delay(500);
  
  Use_Serial.print(".");
  PIN_Led_State = !PIN_Led_State;
  digitalWrite(PIN_Led, PIN_Led_State);
 
  }

  Use_Serial.println("--------------WIFI CONNECT!-------------  ");
  Use_Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
  Use_Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
  Use_Serial.println("----------------------------------------  ");
    
 
  }



/*
 *3-/2 保存参数到EEPROM
*/
void saveConfig()
{
  Serial.println("Save config!");
  Serial.print("stassid:");
  Serial.println(config_wifi.stassid);
  Serial.print("stapsw:");
  Serial.println(config_wifi.stapsw);
  EEPROM.begin(1024);
  uint8_t *p = (uint8_t*)(&config_wifi);
  for (int i = 0; i < sizeof(config_wifi); i++)
  {
    EEPROM.write(i, *(p + i));
  }
  EEPROM.commit();
}
/*
 * 从EEPROM加载参数
*/
void loadConfig()
{
  EEPROM.begin(1024);
  uint8_t *p = (uint8_t*)(&config_wifi);
  for (int i = 0; i < sizeof(config_wifi); i++)
  {
    *(p + i) = EEPROM.read(i);
  }
  EEPROM.commit();
  //出厂自带
  if (config_wifi.magic != MAGIC_NUMBER)
  {
    strcpy(config_wifi.stassid, DEFAULT_STASSID);
    strcpy(config_wifi.stapsw, DEFAULT_STAPSW);
    config_wifi.magic = MAGIC_NUMBER;
    saveConfig();
    Serial.println("Restore config!");
  }
  Serial.println(" ");
  Serial.println("-----Read config-----");
  Serial.print("stassid:");
  Serial.println(config_wifi.stassid);
  Serial.print("stapsw:");
  Serial.println(config_wifi.stapsw);
  Serial.println("-------------------");

   //  ssid=String(config.stassid);
   //  password=String(config.stapsw);
}
 
  
//3-3ESP8266建立无线热点
void SET_AP(){
  
  // 设置内网
  IPAddress softLocal(192,168,4,1);   // 1 设置内网WIFI IP地址
  IPAddress softGateway(192,168,4,1);
  IPAddress softSubnet(255,255,255,0);
  WiFi.softAPConfig(softLocal, softGateway, softSubnet);
   
  String apName = ("ESP8266_"+(String)ESP.getChipId());  // 2 设置WIFI名称
  const char *softAPName = apName.c_str();
   
  WiFi.softAP(softAPName, "admin");      // 3创建wifi  名称 +密码 adminadmin

  Use_Serial.print("softAPName: ");  // 5输出WIFI 名称
  Use_Serial.println(apName);

  IPAddress myIP = WiFi.softAPIP();  // 4输出创建的WIFI IP地址
  Use_Serial.print("AP IP address: ");     
  Use_Serial.println(myIP);
  
  }
//3-4ESP建立网页服务器
void Server_int(){
  
   server.on ("/", handleMain); // 绑定‘/’地址到handleMain方法处理 ----  返回主页面 一键配网页面 
  server.on ("/pin", HTTP_GET, handlePin); // 绑定‘/pin’地址到handlePin方法处理  ---- 开关灯请求 
   server.on ("/wifi", HTTP_GET, handleWifi); // 绑定‘/wifi’地址到handlePWIFI方法处理  --- 重新配网请求
    server.on ("/wifi_wangye", HTTP_GET, handleWifi_wangye);
    server.on ("/test", HTTP_GET, handleTest);
    server.onNotFound ( handleNotFound ); // NotFound处理
   server.begin(); 
   
   Use_Serial.println ( "HTTP server started" );
  
  }
//3-5-1 网页服务器主页
void handleMain() {  

  /* 返回信息给浏览器(状态码,Content-type, 内容) 

   * 这里是访问当前设备ip直接返回一个String 

   */  

  Serial.print("handleMain");  

  File file = SPIFFS.open("/index.html", "r");  

  size_t sent = server.streamFile(file, "text/html");  

  file.close();  

  return;  

}  
//3-5-2 网页控制引脚
/* 引脚更改处理 

 * 访问地址为htp://192.162.xxx.xxx/pin?a=XXX的时候根据a的值来进行对应的处理 

 */  

void handlePin() {  

  if(server.hasArg("a")) { // 请求中是否包含有a的参数  

    String action = server.arg("a"); // 获得a参数的值  

    if(action == "on") { // a=on  

      digitalWrite(2, LOW); // 点亮8266上的蓝色led,led是低电平驱动,需要拉低才能亮  

      server.send ( 200, "text/html", "Pin 2 has turn on"); return; // 返回数据  

    } else if(action == "off") { // a=off  

      digitalWrite(2, HIGH); // 熄灭板载led  

      server.send ( 200, "text/html", "Pin 2 has turn off"); return;  

    }  

    server.send ( 200, "text/html", "unknown action"); return;  

  }  

  server.send ( 200, "text/html", "action no found");  

}  

//3-5-3 网页修改普通家庭WIFI连接账号密码
/* WIFI更改处理 

 * 访问地址为htp://192.162.xxx.xxx/wifi?config=on&name=Testwifi&pwd=123456
  根据wifi进入 WIFI数据处理函数
  根据config的值来进行 on
  根据name的值来进行  wifi名字传输
  根据pwd的值来进行   wifi密码传输


 */  


void handleWifi(){
  
  
   if(server.hasArg("config")) { // 请求中是否包含有a的参数  

    String config = server.arg("config"); // 获得a参数的值  
        String wifiname;
        String wifipwd;

     
        
    if(config == "on") { // a=on  
          if(server.hasArg("name")) { // 请求中是否包含有a的参数  
        wifiname = server.arg("name"); // 获得a参数的值

          }
          
    if(server.hasArg("pwd")) { // 请求中是否包含有a的参数  
         wifipwd = server.arg("pwd"); // 获得a参数的值    
           }
                  
          String backtxt= "Wifiname: "+ wifiname  +"/r/n wifipwd: "+ wifipwd ;// 用于串口和网页返回信息
          
          Use_Serial.println ( backtxt); // 串口打印给电脑
          
          server.send ( 200, "text/html", backtxt); // 网页返回给手机提示
           // wifi连接开始

         wifiname.toCharArray(config_wifi.stassid, 50);    // 从网页得到的 WIFI名
         wifipwd.toCharArray(config_wifi.stapsw, 50);  //从网页得到的 WIFI密码               
         
         saveConfig();
         wifi_Init();
 
              
     
       
          return;          
           

    } else if(config == "off") { // a=off  
                server.send ( 200, "text/html", "config  is off!");
        return;

    }  

    server.send ( 200, "text/html", "unknown action"); return;  

  }  

  server.send ( 200, "text/html", "action no found");  
  
  }


//3-5-4  网页认证西电上网-- 无用
void http_wifi_xidian(){

////  通过上网认证,请自己修改postDate中的学号和密码
 // 例如:
  /*网页认证上网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;
  
  // 认证上网
  http_request ruqest;
  ruqest.Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
  String("10.255.44.33").toCharArray( ruqest.host , 20); 
  ruqest.httpPort = 80;
  ruqest.host_ur = "srun_portal_pc.php";
  ruqest.usr_name="1601120383";//账号  密码已修改 要+1
  ruqest.usr_pwd="mimaHENFuza";//密码  密码已修改 要-1
  ruqest.postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+ ruqest.usr_name+"&password="+ruqest.usr_pwd;
     

   if (hdulogin(ruqest) == 0) {
    
      Use_Serial.println("WEB Login Success!");
    }
    else {
      
      Use_Serial.println("WEB Login Fail!");
    }
  
  }


//3-5-5-1 网页认证上网
void handleWifi_wangye(){
  if(server.hasArg("config")) { // 请求中是否包含有a的参数  
// 1 解析数据是否正常
    String config = server.arg("config"); // 获得a参数的值  
        String wifi_wname,wifi_wpwd,wifi_wip,wifi_postdata;
          
  if(config == "on") { // a=on  
        if(server.hasArg("wifi_wname")) { // 请求中是否包含有a的参数  
        wifi_wname = server.arg("wifi_wname"); // 获得a参数的值
           if(wifi_wname.length()==0){            
             server.send ( 200, "text/html", "please input WIFI名称!"); // 网页返回给手机提示
            return;} 
          }
        if(server.hasArg("wifi_wpwd")) { // 请求中是否包含有a的参数  
        wifi_wpwd = server.arg("wifi_wpwd"); // 获得a参数的值
               
          }
     if(server.hasArg("wifi_wip")) { // 请求中是否包含有a的参数  
         wifi_wip = server.arg("wifi_wip"); // 获得a参数的值    
          if(wifi_wip.length()==0){            
             server.send ( 200, "text/html", "please input 登陆网址!"); // 网页返回给手机提示
            return;} 

           }
        if(server.hasArg("wifi_postdata")) { // 请求中是否包含有a的参数  

            String message=server.arg(3);
            for (uint8_t i=4; i 0) {
    Use_Serial.println(client.readStringUntil('\n'));
    line += client.readStringUntil('\n');
    
   // line += client.readStringUntil('\n');
    }

    http_html=line;
    
    client.stop();
    
    if (line.indexOf("时间") != -1 || line.indexOf("登陆") != -1) { //认证成功
      return 0;
    
    }
    else {
      return 2;
    }

  }
  client.stop();
  return 2;
}

//3-5-6 网页测试
void handleTest(){ 
     server.send(200, "text/html", http_html);
  }

//3-5-。。。 网页没有对应请求如何处理
void handleNotFound() {  

  String path = server.uri();  

  Serial.print("load url:");  

  Serial.println(path);  

  String contentType = getContentType(path);  

  String pathWithGz = path + ".gz";  

  if(SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)){  

    if(SPIFFS.exists(pathWithGz))  

      path += ".gz";  

    File file = SPIFFS.open(path, "r");  

    size_t sent = server.streamFile(file, contentType);  

    file.close(); 

  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i

  

转载于:https://www.cnblogs.com/kekeoutlook/p/9689210.html

你可能感兴趣的:(ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。)