开发环境
- 硬件: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的智能硬件。
| 编号 | 厂商 | 芯片 | 技术名称 | 发包方式 |
| 1 | TI | CC3200 | SmartConfig | 往某一固定IP发UDP包 |
| 2 | 高通 | QCA4004/QCA4002 | SmartConnection | - |
| 3 | 联发科MTK | MTK7681 | SmartConnection | 组播地址编码 |
| 4 | MARVELL | MC200+8801/MW300 | EasyConnect | 组播地址编码 |
| 5 | Reltek | AMEBA | SimpleConfig | 组播地址编码 |
| 6 | 乐鑫 | ESP8266 | SmartConfig | 组播,通过长度编码 |
| 7 | 新案线 | NL6621 | SmartConfig | 组播地址编码 |
| 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
