目的
ESP8266可以通过扫描获取周围环境中的WiFi热点,所以我们也可以先扫描一下再决定连接到某个网络上,这也是一种常见的应用场景。
使用演示
同步扫描
使用下面代码进行同步扫描,同步扫描时会阻塞程序运行:
#include "ESP8266WiFi.h"
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA); //设置为STA模式
WiFi.disconnect(); //断开当前可能的连接
delay(100);
Serial.println("scan start");
int n = WiFi.scanNetworks(); //扫描并返回搜索到的网络数量,该方法默认会阻塞
Serial.println("scan done");
if (n != 0)
{
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i)
{
Serial.println();
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i)); //打印网络名称
Serial.print(" ");
Serial.print(WiFi.RSSI(i)); //打印信号强度
Serial.print(" ");
Serial.print(WiFi.channel(i)); //打印网络使用通道
Serial.print(" ");
Serial.print((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? "未加密" : "加密"); //打印是否加密
delay(10);
}
}
}
void loop()
{
}
异步扫描
使用下面代码进行异步扫描,异步扫描不会阻塞程序运行:
#include "ESP8266WiFi.h"
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA); //设置为STA模式
WiFi.disconnect(); //断开当前可能的连接
delay(100);
Serial.println("开始扫描");
WiFi.scanNetworks(true); //启动异步扫描
}
void loop()
{
delay(1000);
int n = WiFi.scanComplete(); //获取扫描状态
if (n >= 0)
{
Serial.println("扫描完成");
for (int i = 0; i < n; ++i)
{
Serial.println();
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i)); //打印网络名称
Serial.print(" ");
Serial.print(WiFi.RSSI(i)); //打印信号强度
Serial.print(" ");
Serial.print(WiFi.channel(i)); //打印网络使用通道
Serial.print(" ");
Serial.print((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? "未加密" : "加密"); //打印是否加密
delay(10);
}
WiFi.scanDelete(); //清除内存中的扫描结果
}
else if (n == -1)
{
Serial.println("正在扫描");
}
else if (n == -2)
{
Serial.println("未进行扫描");
}
}
总结
扫描网络功能为ESP8266的使用又增加了一种应用场景,使用起来将会更加方便。
更多内容可以参考如下:
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-examples.html
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-class.html
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp