#include <ESP8266WiFi.h>
#include <EspSaveCrash.h>//重启
//自动保存 如果wifi不再了就会重启如果连接不上就 重新配置了!还没加入隔多少次重新连接原来保存的!2017-6-9-10:52小和QQ496631085
#include <EEPROM.h>
#define EEPROM_SIZE 512//EEPROM 大小
//#define addr 0//wifi mode地址
#define Udp_Port 1//UDP server 端口号
//#define LED_BRIGHTNESS_ADDR 2//led亮度信息存储地址
#define id_addr 3 //devID 存储地址
#define ssid_addr 4//ssid长度地址
#define pwd_addr 5//password长度地址
#define USART_addr 6//usart setting flag addr
#define DATA_addr 11//数据开始地址
#define lianjie_addr 10//数据开始地址
WiFiClient client;
#define LED 5//LED彩灯脚
bool lianjiebz = 0; //0是配置STA模式 1是连接保存
char *ssidz;
char *pwdz;
int ipm=0;//ip每隔多少检测一次ip然后判断是否重启
int ipmt=0;
void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig....ing");
String pwd = read_pwd();
String ssid = read_ssid();
Serial.println(ssid);
Serial.println(pwd);
WiFi.beginSmartConfig();
while (1)
{
Serial.print(".");
digitalWrite(LED, 0);
delay(500);
digitalWrite(LED, 1);
delay(500);//LED灯闪烁
if (WiFi.smartConfigDone())
{
ssid = WiFi.SSID().c_str();
pwd = WiFi.psk().c_str();
Serial.println("SmartConfig Success");
Serial.println(ssid);
Serial.println(pwd);
save_ssid_pwd(ssid, pwd); //保存密码
save_udp_ser_port(3);
save_lianjie(1);
break;
}
}
}
void setup()
{
Serial.begin(115200);
Init_EEPROM();
Serial.println("Start module");
pinMode(LED, OUTPUT);
digitalWrite(LED, 0);
if (read_udp_ser_port() == 3 && read_lianjie() == 1) {
String pwd = read_pwd();
delay(55);
String ssid = read_ssid();
delay(55);
Serial.println("duqudeWifi");
Serial.println(ssid);
Serial.println(pwd);
const char *pwdz = pwd.c_str();
const char *ssidz = ssid.c_str();
Serial.print("lianjwifiing............");
delay(55);
Serial.println(ssidz);
Serial.println(pwdz);
WiFi.begin(ssidz, pwdz);//连接wifi
int rest_s=0;
while (WiFi.status() != WL_CONNECTED)
//WiFi.status() 这个函数是wifi连接状态,返回wifi链接状态
{
Serial.print("_");
delay(1000);
rest_s++;
if(rest_s>=5)
{save_lianjie(0);ESP.reset();}
}
}
else smartConfig();
//获取IP地址——————————
IPAddress myIP = WiFi.localIP();
while( myIP[0]==0)
{ //IPAddress
myIP = WiFi.localIP();delay(500);}
Serial.println(myIP);
//获取IP地址——————————
}
void loop()
{
//每隔多少秒执行一次--------判定是否有ip----------
if(millis()/1000!=ipmt)
{ipmt=millis()/1000;
ipm++;
if(ipm>=10){ipm=0;PDIP();}
}
//每隔多少秒执行一次--------判定是否有ip----------
delay(1000);
Serial.print("+");
}
void PDIP(){
//获取IP地址——————————
IPAddress myIP = WiFi.localIP();
while( myIP[0]==0)//如果ip为0000就开始重启
{ //IPAddress
myIP = WiFi.localIP();
Serial.println(myIP);
delay(500);
ESP.reset();}
Serial.println(myIP);
//获取IP地址——————————
}
void Init_EEPROM() //初始化EEPROM size
{
EEPROM.begin(EEPROM_SIZE);//初始化EEPROM
}
int read_dev_id() //读取dev id信息
{
return EEPROM.read(id_addr);
}
bool read_lianjie() //读取dev id信息
{
return EEPROM.read(lianjie_addr);
}
int read_udp_ser_port() //读取UDP server 端口号
{
return EEPROM.read(Udp_Port);
}
/*
int read_wifi_mode() //读取wifu mode信息
{
return EEPROM.read(addr);
}*/
String read_ssid() //读取ssid数据
{
int ssid_length = EEPROM.read(ssid_addr); //读取ssid数据长度
String temp = "";
for (int i = 0; i < ssid_length; i++)
{
temp += char(EEPROM.read(DATA_addr + i)); //读取数据
}
return temp;
}
String read_pwd() //读取password数据
{
int pwd_length = EEPROM.read(pwd_addr); //读取password数据长度
int ssid_length = EEPROM.read(ssid_addr); //读取ssid数据长度
int add = DATA_addr + ssid_length; //password数据起始地址
String temp = "";
for (int i = 0; i < pwd_length; i++)
{
temp += char(EEPROM.read(add + i)); //读取数据
}
return temp;
}
void write_string(int addr, String buf) //从addr地址开始写入buf
{
char _buf[buf.length() + 1];
buf.toCharArray(_buf, buf.length() + 1); //转换成char数组
for (int i = 0; i < buf.length(); i++) //写入数据
{
EEPROM.write(addr + i, _buf[i]);
}
EEPROM.commit();
}
void save_udp_ser_port(int port) //保存UDP server port 数据
{
EEPROM.write(Udp_Port, port);
EEPROM.commit();
}
void save_ssid(String ssid) //保存ssid数据
{
EEPROM.write(ssid_addr, ssid.length());//写入长度数据
String temp = "";
temp += ssid;
temp += read_pwd();
write_string(DATA_addr, temp); //保存数据
}
void save_pwd(String pwd) //保存password数据
{
EEPROM.write(pwd_addr, pwd.length());//写入长度数据
String temp = "";
temp += read_ssid();
temp += pwd;
write_string(DATA_addr, temp); //保存数据
}
void save_ssid_pwd(String ssid, String pwd) //保存ssid password 信息
{
EEPROM.write(ssid_addr, ssid.length());//写入长度数据
EEPROM.write(pwd_addr, pwd.length());//写入长度数据
String temp = ssid + pwd;
write_string(DATA_addr, temp); //保存数据
}
/*
void save_wifi_mode(int wifi_mode) //保存wifi mode信息
{
EEPROM.write(addr,wifi_mode);
EEPROM.commit();
}*/
void save_dev_id(int id) //保存dev id信息
{
EEPROM.write(id_addr, id);
EEPROM.commit();
}
void save_lianjie(bool id) //保存dev id信息
{
EEPROM.write(lianjie_addr, id);
EEPROM.commit();
}
void save_init()
{
// save_wifi_mode(2);
// save_ssid_pwd();
// save_dev_id(1)
// save_udp_ser_port(55);
}