开发环境

  • 硬件:esp8266-NodeMCU(CP2102)
  • IDE:Arduino

WIFI工作模式

esp8266的wifi工作模式有三种:

  • STA模式(Station):工作在STA模式下的8266就像是一个接收机一样,它可以接收来自无线路由器发出的信号,实现了8266通过接收路由器的信号而能够连接互联网,如果把8266安装在硬件设备上,就可以实现硬件设备的远程控制。可以理解为此时8266是主动去连接别人,即此时的8266是一个客户端,为主动去连接他人的模式。
  • AP模式(Wireless Access Point):工作在AP模式下的8266就像是一个热点一样,手机、电脑等都可以连接到此“热点”,从而实现了手机、电脑等设备可以和8266进行局域网的无线通信。此模式下的8266是一个无线网络的创建者,可以理解为此时8266是被别人连接,即此时的8266是一个服务器端,为被他人连接的模式。
  • STA+AP模式:两种模式共存,既可以通过路由器连接到互联网,也可以作为WiFi热点,使其他设备连接到这个模块,实现广域网与局域网的无缝切换。

无线配网方式

目前主流的esp8266的无线配网方式有两种:

1.esp8266处于 AP 模式(类似路由器,组成局域网),手机用于 STA 模式

手机连接到处于 AP 模式的esp8266后组成局域网,手机发送需要连接路由的 SSID 及密码至智能硬件,智能硬件主动去连接指定路由后,完成配网。

2.一键配网(smartConfig)模式

esp8266处于STA模式下,监听网络中的所有报文,手机 APP 将 SSID 和密码编码到 UDP 报文中,通过广播包或组播报发送,esp8266接收到 UDP 报文后解码,得到正确的 SSID 和密码,然后主动连接指定 SSID 的路由完成连接,此方法可以使用手机APP(Esptouch)或者微信公众号(安信可科技)实现UDP报文发送,适合拥有独立app的智能硬件。

编号厂商芯片技术名称发包方式
1TICC3200SmartConfig往某一固定IP发UDP包
2高通QCA4004/QCA4002SmartConnection-
3联发科MTKMTK7681SmartConnection组播地址编码
4MARVELLMC200+8801/MW300EasyConnect组播地址编码
5ReltekAMEBASimpleConfig组播地址编码
6乐鑫ESP8266SmartConfig组播,通过长度编码
7新案线NL6621SmartConfig组播地址编码
8微信-AirKiss全网广播,通过长度编码

代码

#include <ESP8266WiFi.h>
#include <WiFiManager.h>
#include <Ticker.h>
bool WIFI_Status = true;
Ticker ledTicker;//led定时器

void ledSwtich(){
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); //亮则灭,灭则亮
  Serial.print(".");
}
void smartConfig(){
  WiFi.mode(WIFI_STA);//WIFI工作模式为STA模式
  Serial.println("Wait for Smartconfig...");
  ledTicker.detach();
  ledTicker.attach(1,ledSwtich);
  WiFi.beginSmartConfig();//开始SmartConfig,监听UDP包
  while (1){
    delay(100);                
    if (WiFi.smartConfigDone()){//如果配网完成则推出循环
      Serial.println("SmartConfig Success");
      ledTicker.detach();
      ledTicker.attach(0.5,ledSwtich);
      WIFI_Status = true;
      break;
    } 
  }
}
void wifiConnect(){
  //清空wifi配置
  WiFiManager wifiManager;
  wifiManager.resetSettings();
  Serial.println("ESP8266 WiFi Settings Cleared");
  
  int timeout=0;//判断连接时长
  Serial.println("\r\n正在连接");
  ledTicker.attach(0.5,ledSwtich);
  while(WiFi.status()!=WL_CONNECTED){
      if(WIFI_Status){//尝试wifi连接
        delay(1000);               
        timeout++;
        if(timeout>=5){//5s超时
          timeout=0;
          WIFI_Status = false;
          Serial.println("WiFi连接失败,请用手机智能配网"); 
        }
      }
      else{//智能配网
          smartConfig();
      }
   }  
   ledTicker.detach();
   digitalWrite(LED_BUILTIN,LOW);
   Serial.println("连接成功");  
   Serial.printf("SSID:%s\n", WiFi.SSID().c_str());
   Serial.printf("PSW:%s\n", WiFi.psk().c_str());
   Serial.printf("IP:%s\n",WiFi.localIP().toString().c_str());
   //Serial.println(WiFi.localIP());
}
void setup() {
  Serial.begin(9600);
  delay(10);
  pinMode(LED_BUILTIN, OUTPUT);
  
  wifiConnect();
  
  
}
void loop() {
  
}

依赖

项目->加载库->管理库->wifimanager by tzapu

安卓APP源码

IOSApp源码