【无标题】

smartconfig配网

#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include <Ticker.h>
//#include <WiFiUdp.h>
//#include <TimeLib.h>
//const char *ssid     = " ";
//const char *password = " ";
#define HOST_NAME "bemfa"
char config_flag = 0;
const char* host = "www.baidu.com";

// 结构体,用于存储配网信息

struct config_type {
  char stassid[32];
  char stapsw[64];
  char cuid[40];
  char ctopic[32];
  uint8_t reboot;
  uint8_t magic;
};
config_type config;
void doSmartconfig();
void saveConfig();
void initWiFi();
void loadConfig();
void restoreFactory();
void waitKey();


// airkiss配网

void doSmartconfig() {
  Serial.println(" Smartconfig begin,Waiting for WeChat Config.....");
  WiFi.mode(WIFI_STA);
  WiFi.stopSmartConfig();
  WiFi.beginSmartConfig();
  int cnt = 0;
  bool flag_ok = false;
  while (!WiFi.smartConfigDone()) {
    Serial.println(" Smartconfig begin,Waiting for WeChat Config.....");
    digitalWrite(2, HIGH);
    delay(100);
    digitalWrite(2, LOW);
    delay(100);

    if (flag_ok == true) continue;
    if (WiFi.smartConfigDone()) {
      strcpy(config.stassid, WiFi.SSID().c_str());
      strcpy(config.stapsw, WiFi.psk().c_str());
      config.magic = 0xAA;
      saveConfig();
      flag_ok = true;
    }
    cnt++;
    if (cnt >= 600) {
      delayRestart(0);
    }
  }
}
//存储配网信息

void saveConfig() {
  int rand_key;
  uint8_t mac[6];
  WiFi.macAddress(mac);
  config.reboot = 0;
  EEPROM.begin(256);
  uint8_t *p = (uint8_t *)(&config);
  for (int i = 0; i < sizeof(config); i++) {
    EEPROM.write(i, *(p + i));
  }
  EEPROM.commit();
}
Ticker delayTimer;

void delayRestart(float t) {
  delayTimer.attach(t, []() {
    ESP.restart();
  });
}


// 初始化wifi信息,并连接路由器网络

void initWiFi() {
  char temp[32];
  uint8_t mac[6];
  WiFi.macAddress(mac);
  sprintf(temp, "%s_%02X%02X%02X", HOST_NAME, mac[3], mac[4], mac[5]);
  WiFi.hostname(temp);
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.disconnect();                          //断开连接
    WiFi.mode(WIFI_STA);                        //STA模式
    WiFi.begin(config.stassid, config.stapsw);  //连接路由器
  }
  while (WiFi.status() != WL_CONNECTED) {  //检查是否连接成功
    delay(500);
    Serial.print(".");
    void fast();
  }
  Serial.println("wifi config ok");
  WiFi.softAP(temp);
}


//  加载存储的信息,并检查是否进行了反复5次重启恢复出厂信息

uint8_t *p = (uint8_t *)(&config);
void loadConfig() {
  uint8_t mac[6];
  WiFi.macAddress(mac);
  EEPROM.begin(256);
  for (int i = 0; i < sizeof(config); i++) {
    *(p + i) = EEPROM.read(i);
  }
  config.reboot = config.reboot + 1;
  if (config.reboot >= 4) {
    restoreFactory();
  }
  if (config.magic != 0xAA) {
    config_flag = 1;
  }
  EEPROM.begin(256);
  for (int i = 0; i < sizeof(config); i++) {
    EEPROM.write(i, *(p + i));
  }
  EEPROM.commit();
  delay(2000);
  EEPROM.begin(256);
  config.reboot = 0;
  for (int i = 0; i < sizeof(config); i++) {
    EEPROM.write(i, *(p + i));
  }
  EEPROM.commit();
  delay(2000);

}

//  恢复出厂设置,清除存储的wifi信息

void restoreFactory() {
  Serial.println("Restore Factory....... ");
  config.magic = 0x00;
  strcpy(config.stassid, "");
  strcpy(config.stapsw, "");
  strcpy(config.cuid, "");
  strcpy(config.ctopic, "");
  config.magic = 0x00;
  saveConfig();
  delayRestart(1);
  while (1) {
    delay(100);
  }
}

//  检查是否需要airkiss配网

void waitKey() {
  if (config_flag == 1) {
    doSmartconfig();
  }
}

// 单片机初始化函数

void setup() {
  Serial.begin(115200);
  pinMode( 0 , OUTPUT);
  pinMode( 2 , OUTPUT);
  digitalWrite( 0 , LOW );
  digitalWrite( 2 , LOW );
  loadConfig();
  waitKey();
  initWiFi();
  Serial.print("Connecting.");
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("connected");
  digitalWrite(2, HIGH);

}
void net() {
  if (WiFi.status() == WL_CONNECTED) {
    // 尝试发送HTTP GET请求
    WiFiClient client;
    if (!client.connect(host, 80)) {
      Serial.println("网络不通");
      digitalWrite(0, HIGH);
      delay(2000);
      digitalWrite(0, LOW);
      delay(2000);
    } else {
      client.print(String("GET / HTTP/1.1\r\n") +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");
      unsigned long start = millis();
      while (client.available() == 0 && millis() - start < 3000) {
        delay(1);
      }
      if (client.available()) {
        // 如果有响应,说明网络通
        String response = client.readStringUntil('\n');
        Serial.println(response); // 打印响应的第一行作为确认
      } else {
        Serial.println("没有收到响应,网络可能不通");
      }
      client.stop();
    }
  } else {
    Serial.println("WiFi未连接");

  }

  // 每隔1分钟执行一次
  delay(1000);
}
void loop() {
  Serial.println(config.stassid);
  Serial.println(config.stapsw);
  delay(2000);
  net();
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值