esp8266 airkiss 配网
<
使用arduino
核心代码:
WiFi.mode(WIFI_STA);
// 先停止一次smart 防止重复调用
WiFi.stopSmartConfig();
// 初始化smart
WiFi.beginSmartConfig();
// 成功标志
bool flag_ok = false;
// 等待配置完成
while (!WiFi.smartConfigDone())
{
delay(300);
if (flag_ok == true)
continue;
if (WiFi.smartConfigDone())
{
// WiFi.SSID().c_str()
// WiFi.psk().c_str()
// 得到ssid和pak密码
flag_ok = true;
}
}
完整代码:
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include <Ticker.h>
/**
* 结构体,用于存储配网信息
*/
struct config_type
{
char stassid[32];
char stapsw[64];
// 配网标志
uint8_t magic;
};
config_type config;
char config_flag = 0;
void doSmartconfig();
void delayRestart(float t);
void saveConfig();
void loadConfig();
void initWiFi();
Ticker delayTimer;
// 延时重启 主要为了连不上网重启esp
void delayRestart(float t)
{
delayTimer.attach(t, []()
{ ESP.restart(); });
}
/**
* airkiss配网
*/
void doSmartconfig()
{
Serial.print(" Smartconfig begin,Waiting for WeChat Config.....");
WiFi.mode(WIFI_STA);
WiFi.stopSmartConfig();
WiFi.beginSmartConfig();
int cnt = 0;
bool flag_ok = false;
while (!WiFi.smartConfigDone())
{
delay(300);
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()
{
uint8_t mac[6];
WiFi.macAddress(mac);
EEPROM.begin(512);
uint8_t *p = (uint8_t *)(&config);
for (int i = 0; i < sizeof(config); i++)
{
EEPROM.write(i, *(p + i));
}
EEPROM.commit();
}
/**
* 加载存储的信息
*/
uint8_t *p = (uint8_t *)(&config);
void loadConfig()
{
uint8_t mac[6];
WiFi.macAddress(mac);
EEPROM.begin(512);
for (int i = 0; i < sizeof(config); i++)
{
*(p + i) = EEPROM.read(i);
}
// 检查配网标志
if (config.magic != 0xAA)
{
config_flag = 1;
// 进入配网
doSmartconfig();
}
}
/**
* 初始化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)
{
// 检查是否连接成功
Serial.print(".");
delay(500);
}
Serial.println("wifi config ok");
}
void setup()
{
loadConfig();
initWiFi();
}
void loop()
{
}