开发环境
- 硬件: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