【ESP8266】实现自助WiFi配网的两种方式:WiFiManager 和 SmartConfig

wifimanager 库使用流程

image

 

wifimanager 官方实例

使用WifiManager三部曲:

  • 引入头文件
#include <WiFiManager.h>
  • 配置具体参数
  • 启动WifiManager服务

请读者烧录以下代码:
例子源码

/**
 *  功能:测试WifiManager功能demo
 *  作者:单片机菜鸟
 *  时间:2019-12-13
 *  描述:
 *      1.启动wifimanager AP配置页面,通过手机连接esp8266生成的AP热点来进入设置页面
 *      2.请在手机浏览器上输入 192.168.4.25
 *      2.测试官方方法的使用
*/

#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino

//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h>          //https://github.com/bblanchon/ArduinoJson
//for LED status
#include <Ticker.h>

void initSystem();
void initWifiManager();
void configModeCallback(WiFiManager *myWiFiManager);
void saveConfigCallback();
void tick();

//flag for saving data
bool shouldSaveConfig = false;
//for LED status
Ticker ticker;

//define your default values here, if there are different values in config.json, they are overwritten.
char mqtt_server[40];
char mqtt_port[6] = "8080";
char api_key[34] = "Your ApiKey";

void setup() {
  // put your setup code here, to run once:
  initSystem();
  initWifiManager();
  //if you get here you have connected to the WiFi
  Serial.println("connected...so easy :)");
  ticker.detach();
  //keep LED on
  digitalWrite(BUILTIN_LED, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:

}

/**
 * 功能描述:初始化esp8266
 */
void initSystem(){
  Serial.begin(115200);
  Serial.println();
  //set led pin as output
  pinMode(BUILTIN_LED, OUTPUT);
  // start ticker with 0.5 because we start in AP mode and try to connect
  ticker.attach(0.6, tick);
}

/**
 * 功能描述:初始化wifimanager
 */
void initWifiManager(){
  /***  步骤一:创建 wifimanager对象 **/
  WiFiManager wifiManager;
  /*************************************/
  /*** 步骤二:进行一系列配置,参考配置类方法 **/
  // 重置保存的修改 目标是为了每次进来都是去掉配置页面
  wifiManager.resetSettings();
  // 配置连接超时
  wifiManager.setConnectTimeout(60);
  // 打印调试内容
  wifiManager.setDebugOutput(true);
  // 设置最小信号强度
  wifiManager.setMinimumSignalQuality(30);
  // 设置固定AP信息
  IPAddress _ip = IPAddress(192, 168, 4, 25);
  IPAddress _gw = IPAddress(192, 168, 4, 1);
  IPAddress _sn = IPAddress(255, 255, 255, 0);
  wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);
  // 设置进入AP模式的回调
  wifiManager.setAPCallback(configModeCallback);
  // 设置点击保存的回调
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  // 设置 如果配置错误的ssid或者密码 退出配置模式
  wifiManager.setBreakAfterConfig(true);
  // 设置过滤重复的AP 默认可以不用调用 这里只是示范
  wifiManager.setRemoveDuplicateAPs(true);
  // 添加额外的参数 博哥这里只是示范 比如加入 mqtt 服务器地址 port 端口号  apikey 后面可以结合onenet使用
  WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40);
  WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 6);
  WiFiManagerParameter custom_apikey("apikey", "onenet apikey", api_key, 32);
  wifiManager.addParameter(&custom_mqtt_server);
  wifiManager.addParameter(&custom_mqtt_port);
  wifiManager.addParameter(&custom_apikey);

  /*************************************/
  /*** 步骤三:尝试连接网络,失败去到配置页面 **/
  // ssid 命名为danpianjicainiao pwd是123456
  if (!wifiManager.autoConnect("danpianjicainiao","123456")) {
      Serial.println("failed to connect and hit timeout");
      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(1000);
  }
  /*************************************/
  // 读取配置页面配置好的信息
  strcpy(mqtt_server, custom_mqtt_server.getValue());
  strcpy(mqtt_port, custom_mqtt_port.getValue());
  strcpy(api_key, custom_apikey.getValue());

  // 保存自定义信息
  if (shouldSaveConfig) {
      Serial.println("saving config");
      DynamicJsonBuffer jsonBuffer;
      JsonObject& json = jsonBuffer.createObject();
      json["mqtt_server"] = mqtt_server;
      json["mqtt_port"] = mqtt_port;
      json["api_key"] = api_key;
      json.printTo(Serial);
      //end save
  }

  Serial.println("local ip");
  Serial.println(WiFi.localIP());
}

/**
 * 功能描述:配置进入AP模式通知回调
 */
void configModeCallback (WiFiManager *myWiFiManager) {
  Serial.println("Entered config mode");
  Serial.println(WiFi.softAPIP());
  //if you used auto generated SSID, print it
  Serial.println(myWiFiManager->getConfigPortalSSID());
  //entered config mode, make led toggle faster
  ticker.attach(0.2, tick);
}

/**
 * 功能描述:设置点击保存的回调
 */
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

/**
 * 功能描述:设置LED灯闪烁,提示用户进入配置模式
 */
void tick(){
  //toggle state
  int state = digitalRead(BUILTIN_LED);  // get the current state of GPIO1 pin
  digitalWrite(BUILTIN_LED, !state);     // set pin to the opposite state
}

 

Smartconfig  

esp8266启动后连接WiFi时,连接WiFi失败时,会启动ap模式让客户连接   客户使用手机或者电脑连接esp8266建立的WiFi网络通过页面进行WiFi配置

这种方法虽然解决了配网的问题但是操作相对繁琐

 

smartconfig 需要使用手机app将wifi账号密码发送给目标板

工作原理  通过手机app端发送包含WiFi信息的udp广播包,智能中断的wifi芯片可以接收到该udp包

知道udp包的组成形式,就可以通过接受到的udp包解密出的wifi密码  。然后智能硬件配置到收到的用户名密码到指定的WiFi AP上。

简单理解的操作步骤如下:

  1. 8266端作为Station,进入Smartconfig模式,等待手机端发送用户民和密码;
  2. 手机端把填写当前网络的密码通过UDP广播;
  3. 8266获取UDP包后配置,连接网路;                                                                      

 

 在乐鑫官网找到相对应的手机app下载

image

Smartconfig  的相关代码

 #include <ESP8266WiFi.h>
 
bool AutoConfig()//断电重连
{
    WiFi.begin();
    //如果觉得时间太长可改
    for (int i = 0; i < 20; i++)
    {
        int wstatus = WiFi.status();
        if (wstatus == WL_CONNECTED)
        {
          Serial.println("WIFI SmartConfig Success");
          Serial.printf("SSID:%s", WiFi.SSID().c_str());
          Serial.printf(", PSW:%s\r\n", WiFi.psk().c_str());
          Serial.print("LocalIP:");
          Serial.print(WiFi.localIP());
          Serial.print(" ,GateIP:");
          Serial.println(WiFi.gatewayIP());
          return true;
        }
        else
        {
          Serial.print("WIFI AutoConfig Waiting......");
          Serial.println(wstatus);//返回值一般为6说明未连接
          delay(1000);
        }
    }
    Serial.println("WIFI AutoConfig Faild!" );
    return false;
}
 
void SmartConfig()//一键配网
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig...");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    delay(500);                   // wait for a second
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      Serial.print("IP Address: ");
      Serial.println(WiFi.localIP());
      break;
    }
  }
}
void setup()
{
    Serial.begin(115200);
    if(!AutoConfig)
    {
    SmartConfig();
    }
    
}
void loop(){
}

 

 

参考文章:

1. https://blog.csdn.net/xuqingyuxu/article/details/127070055

2. https://www.cnblogs.com/danpianjicainiao/p/12046427.html#_label1_0

作者:单片机菜鸟

 

3. 

目标学习项目:

 菜鸡专属/云台电子宠物

链接:https://gitee.com/zerocjzs/desktop-robot-series

image

 

posted @ 2025-07-30 00:49  FBshark  阅读(392)  评论(0)    收藏  举报