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 秒扫描一次
}

运行与验证

  1. 将代码复制到 Arduino IDE,选择开发板为 ESP32S3 Dev Module,选择正确串口后编译烧录。
  2. 打开串口监视器,波特率设为 115200。
  3. 观察输出:应看到以 === 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 为空字符串。