在物联网(IoT)开发中,ESP32 是一款非常受欢迎的微控制器,它集成了双核处理器、WiFi 和蓝牙功能。本文将详细介绍如何使用 ESP32 扫描附近的 WiFi 热点,并记录每个热点的信号强度(RSSI)。我们将通过 Arduino IDE 编写代码来实现这一功能。
在开始之前,请确保以下准备工作已完成:
WiFi 扫描是指设备主动搜索周围可用的 WiFi 网络。ESP32 的 WiFi 模块可以通过调用 WiFi.scanNetworks()
方法来获取附近的所有 WiFi 热点信息,包括 SSID(网络名称)、BSSID(MAC 地址)、信号强度(RSSI)等。
RSSI 是一个衡量无线信号强度的指标,通常以 dBm 为单位。RSSI 的值范围一般在 -100 到 0 之间,数值越大表示信号越强。例如:
-30 dBm
:极强信号。-50 dBm
:强信号。-70 dBm
:弱信号。-90 dBm
:极弱信号。在程序启动时,需要初始化 WiFi 模块并设置为 Station 模式(STA 模式),以便扫描周围的 WiFi 热点。
调用 WiFi.scanNetworks()
方法进行扫描,该方法会返回扫描到的 WiFi 热点数量。随后可以使用相关方法提取每个热点的 SSID 和 RSSI 值。
将扫描到的热点信息存储到数组或文件中,并通过串口或其他方式输出结果。
以下是完整的代码示例:
#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 秒扫描一次
}
以下是上述代码逻辑的流程图:
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;
如果需要长期保存扫描到的热点信息,可以考虑使用 ESP32 的 EEPROM 或 Flash 存储功能。这在需要离线分析数据的场景中非常有用。
通过记录 WiFi 热点的 BSSID 和 RSSI 值,结合数据库中的已知热点位置信息,可以实现基于 WiFi 的室内定位系统。
将扫描到的热点信息通过 HTTP POST 请求发送到服务器,或者使用 OLED 屏幕实时显示热点信息,可以增强用户体验。