2. 扫描并列出周边 WiFi 网络
任务目标
在 ESP32-S3 上实现 WiFi 扫描功能,获取周边可见网络的 SSID、信号强度(RSSI)、认证方式、信道等信息,并通过串口输出。本案例使用 Arduino 框架,代码可直接编译烧录运行。
环境与依赖
- 硬件:ESP32-S3 开发板(如 ESP32-S3-DevKitC-1)
- 软件:Arduino IDE 或 PlatformIO,需安装
esp32开发板支持包(版本 ≥ 2.0.0) - 无需额外库,使用内置
WiFi.h
关键完整代码
#include <WiFi.h>
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n=== WiFi Scanner ===");
WiFi.mode(WIFI_STA); // 设置为工作站模式
WiFi.disconnect(); // 断开任何已有连接,确保扫描干净
delay(100);
}
void loop() {
Serial.println("\n--- 开始扫描 ---");
int n = WiFi.scanNetworks(); // 执行扫描,返回找到的网络数
if (n == WIFI_SCAN_FAILED) {
Serial.println("扫描失败,请重试");
return;
}
Serial.printf("找到 %d 个网络\n", n);
Serial.println("序号 | SSID | RSSI(dBm) | 信道 | 加密方式");
for (int i = 0; i < n; i++) {
String ssid = WiFi.SSID(i);
int32_t rssi = WiFi.RSSI(i);
int channel = WiFi.channel(i);
wifi_auth_mode_t encrypt = WiFi.encryptionType(i);
// 加密方式转为可读字符串
String encStr;
switch (encrypt) {
case WIFI_AUTH_OPEN: encStr = "开放"; break;
case WIFI_AUTH_WEP: encStr = "WEP"; break;
case WIFI_AUTH_WPA_PSK: encStr = "WPA"; break;
case WIFI_AUTH_WPA2_PSK: encStr = "WPA2"; break;
case WIFI_AUTH_WPA_WPA2_PSK: encStr = "WPA/WPA2"; break;
case WIFI_AUTH_WPA2_ENTERPRISE: encStr = "WPA2-企业"; break;
case WIFI_AUTH_WPA3_PSK: encStr = "WPA3"; break;
case WIFI_AUTH_WPA2_WPA3_PSK: encStr = "WPA2/WPA3"; break;
default: encStr = "未知"; break;
}
// 对齐输出
Serial.printf("%-4d | %-24s | %-9d | %-3d | %s\n",
i + 1, ssid.c_str(), rssi, channel, encStr.c_str());
}
Serial.println("--- 扫描结束 ---");
delay(5000); // 每 5 秒扫描一次
}
运行与验证
- 将代码复制到 Arduino IDE,选择开发板为
ESP32S3 Dev Module,选择正确串口后编译烧录。 - 打开串口监视器,波特率设为 115200。
- 观察输出:应看到以
=== WiFi Scanner ===开头的信息,随后每 5 秒打印一次扫描结果,列出周边网络。
通过条件:串口输出中能看到至少一个周边 WiFi 网络的 SSID 和对应的 RSSI 数值(如 -45 dBm),且列表格式与代码中的表头一致。若附近无任何 WiFi 信号,输出会显示 找到 0 个网络,此时可移动到有路由器的位置重新观察。
常见问题
- 扫描失败(返回 -1):多为射频干扰或连续扫描过快导致,可增加
delay(1000)后再扫描,或重启开发板。 - 看不到中文 SSID:串口监视器需设置为 UTF-8 编码,否则中文 SSID 会显示为乱码,但 RSSI 和信道信息不受影响。
- 隐藏网络:默认不显示未广播 SSID 的网络,如需扫描隐藏网络,需在
scanNetworks中传入参数true(即WiFi.scanNetworks(true)),此时隐藏网络的 SSID 为空字符串。