网络重连
用airkiss配网,get百度,1分钟1次,不通就重启路由器。
#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();
}