...
嵌入式

esp8266 airkiss 配网

<

strong>直接上代码吧,这个技术的原理其实也是简单。
使用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()
{
}
vue跨域api代理配置 vscode编译arduino调试输出乱码解决方法。
biu biu biu
闲来无事做个了微信多开工具,分享一下~ Chrome启动参数大全(命令行参数) 把废旧的电视机顶盒华为悦盒ec6108v9刷成Ubuntu系统做家用NAS php date 参数详解 一个小时学会Git