ESP32 WiFi扫描附近热点并记录信号强度

2025-06发布6次浏览

在物联网(IoT)开发中,ESP32 是一款非常受欢迎的微控制器,它集成了双核处理器、WiFi 和蓝牙功能。本文将详细介绍如何使用 ESP32 扫描附近的 WiFi 热点,并记录每个热点的信号强度(RSSI)。我们将通过 Arduino IDE 编写代码来实现这一功能。


1. 准备工作

在开始之前,请确保以下准备工作已完成:

  • 安装了最新版本的 Arduino IDE。
  • 在 Arduino IDE 中正确配置了 ESP32 开发板支持(可以通过 Boards Manager 安装)。
  • 已经连接好 ESP32 开发板并确认其正常运行。

2. 基本概念解析

2.1 WiFi 扫描原理

WiFi 扫描是指设备主动搜索周围可用的 WiFi 网络。ESP32 的 WiFi 模块可以通过调用 WiFi.scanNetworks() 方法来获取附近的所有 WiFi 热点信息,包括 SSID(网络名称)、BSSID(MAC 地址)、信号强度(RSSI)等。

2.2 RSSI(接收信号强度指示)

RSSI 是一个衡量无线信号强度的指标,通常以 dBm 为单位。RSSI 的值范围一般在 -100 到 0 之间,数值越大表示信号越强。例如:

  • -30 dBm:极强信号。
  • -50 dBm:强信号。
  • -70 dBm:弱信号。
  • -90 dBm:极弱信号。

3. 实现步骤

3.1 初始化 WiFi 模块

在程序启动时,需要初始化 WiFi 模块并设置为 Station 模式(STA 模式),以便扫描周围的 WiFi 热点。

3.2 执行 WiFi 扫描

调用 WiFi.scanNetworks() 方法进行扫描,该方法会返回扫描到的 WiFi 热点数量。随后可以使用相关方法提取每个热点的 SSID 和 RSSI 值。

3.3 记录和显示结果

将扫描到的热点信息存储到数组或文件中,并通过串口或其他方式输出结果。


4. 示例代码

以下是完整的代码示例:

#include <WiFi.h>

void setup() {
  Serial.begin(115200); // 初始化串口通信
  WiFi.mode(WIFI_STA);  // 设置为 Station 模式
  delay(100);
}

void loop() {
  int num Networks = WiFi.scanNetworks(); // 扫描 WiFi 热点

  if (numNetworks == 0) {
    Serial.println("未找到任何 WiFi 热点");
  } else {
    Serial.print("共找到 ");
    Serial.print(numNetworks);
    Serial.println(" 个 WiFi 热点");

    for (int i = 0; i < numNetworks; ++i) {
      // 获取每个热点的信息
      String ssid = WiFi.SSID(i);
      int rssi = WiFi.RSSI(i);

      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(ssid);       // 输出 SSID
      Serial.print(" (RSSI=");
      Serial.print(rssi);       // 输出 RSSI
      Serial.println(" dBm)");
    }
  }

  Serial.println("扫描完成");
  WiFi.scanDelete(); // 清除扫描结果
  delay(5000);       // 每 5 秒扫描一次
}

5. 流程图

以下是上述代码逻辑的流程图:

graph TD
    A[开始] --> B{初始化 WiFi 模块};
    B --> C[进入主循环];
    C --> D{执行 WiFi 扫描};
    D --> E[判断是否有热点];
    E --否--> F[输出无热点提示];
    E --是--> G[遍历热点列表];
    G --> H[记录 SSID 和 RSSI];
    H --> I[输出热点信息];
    I --> J[清除扫描结果];
    J --> K[延迟 5 秒];
    K --> C;

6. 注意事项

  1. 扫描时间:WiFi 扫描是一个耗时操作,可能需要几百毫秒才能完成。因此,在实际应用中应避免频繁扫描。
  2. 信号干扰:RSSI 值可能会因环境因素(如障碍物、其他无线设备)而波动,建议多次扫描取平均值以提高准确性。
  3. 隐私问题:在某些地区,未经许可扫描和记录 WiFi 热点信息可能涉及隐私问题,请遵守当地法律法规。

7. 扩展讨论

7.1 使用 EEPROM 或 Flash 存储热点信息

如果需要长期保存扫描到的热点信息,可以考虑使用 ESP32 的 EEPROM 或 Flash 存储功能。这在需要离线分析数据的场景中非常有用。

7.2 结合地理定位

通过记录 WiFi 热点的 BSSID 和 RSSI 值,结合数据库中的已知热点位置信息,可以实现基于 WiFi 的室内定位系统。

7.3 动态可视化

将扫描到的热点信息通过 HTTP POST 请求发送到服务器,或者使用 OLED 屏幕实时显示热点信息,可以增强用户体验。