ESP8266实现Wi-Fi信号扫描并显示附近热点列表

2025-06发布3次浏览

在物联网开发中,ESP8266是一款非常受欢迎的微控制器,因其低功耗、高性能和内置Wi-Fi功能而备受青睐。通过ESP8266实现Wi-Fi信号扫描并显示附近热点列表是一项基础但实用的功能。本文将详细介绍如何使用ESP8266进行Wi-Fi信号扫描,并通过串口或显示屏展示扫描到的热点信息。


1. ESP8266 Wi-Fi扫描原理

ESP8266通过其Wi-Fi模块可以主动搜索周围的Wi-Fi热点。扫描过程分为两种模式:

  • 被动扫描:设备会监听信道上的所有数据包,从中提取SSID等信息。
  • 主动扫描:设备向每个信道发送探测请求(Probe Request),等待接入点(AP)返回探测响应(Probe Response)。

ESP8266的Arduino库提供了简单的API来执行Wi-Fi扫描任务,开发者无需深入了解底层协议细节。


2. 硬件准备

  • 主控芯片:ESP8266(如NodeMCU开发板)
  • 可选外设:OLED显示屏(I2C接口)
  • 数据传输:USB转TTL模块(用于调试)

3. 软件环境搭建

3.1 安装Arduino IDE

确保已安装最新版本的Arduino IDE,并添加ESP8266支持:

  1. 打开Arduino IDE,进入文件 -> 首选项
  2. 在“附加开发板管理器网址”中添加以下链接:
    https://arduino.esp8266.com/stable/package_esp8266com_index.json
    
  3. 进入工具 -> 开发板 -> 开发板管理器,搜索并安装esp8266

3.2 配置开发板

选择正确的开发板型号(如NodeMCU 1.0)、端口和上传速度。


4. 实现代码详解

以下代码展示了如何使用ESP8266扫描附近的Wi-Fi热点,并通过串口输出结果。

#include <ESP8266WiFi.h>

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

  Serial.println("Starting Wi-Fi scan...");
  int numberOfNetworks = WiFi.scanNetworks(); // 执行Wi-Fi扫描

  if (numberOfNetworks == 0) {
    Serial.println("No networks found.");
  } else {
    Serial.print("Found "); Serial.print(numberOfNetworks); Serial.println(" networks:");
    for (int i = 0; i < numberOfNetworks; ++i) {
      // 输出SSID、信号强度和加密类型
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));                // SSID
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));               // 信号强度
      Serial.print(" dBm)");
      Serial.print(" [");
      Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "Open" : "Encrypted");
      Serial.println("]");
    }
  }

  Serial.println("Scan complete.");
}

void loop() {
  // 扫描完成后无需重复操作
}

代码解析

  1. 初始化串口:设置波特率为115200,便于与电脑通信。
  2. 设置Wi-Fi模式WiFi.mode(WIFI_STA)确保ESP8266处于Station模式。
  3. 执行扫描:调用WiFi.scanNetworks()方法获取周围热点数量。
  4. 输出热点信息:遍历扫描结果,打印每个热点的SSID、信号强度(RSSI)和加密类型。

5. 结果展示

运行上述代码后,打开串口监视器,可以看到类似以下输出:

Starting Wi-Fi scan...
Found 5 networks:
1: MyHomeNetwork ( -52 dBm) [Encrypted]
2: GuestNetwork ( -60 dBm) [Encrypted]
3: NeighborSSID ( -70 dBm) [Encrypted]
4: FreePublicWiFi ( -65 dBm) [Open]
5: TestNetwork ( -75 dBm) [Encrypted]
Scan complete.

6. 使用OLED显示屏扩展功能

如果希望将热点信息显示在OLED屏幕上,可以引入Adafruit_SSD1306库。以下是扩展代码示例:

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  delay(100);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("Display initialization failed!");
    while (true) {}
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Scanning...");
  display.display();

  int numberOfNetworks = WiFi.scanNetworks();
  if (numberOfNetworks == 0) {
    display.clearDisplay();
    display.println("No networks found.");
    display.display();
  } else {
    display.clearDisplay();
    display.println("Found Networks:");
    for (int i = 0; i < numberOfNetworks && i < 5; ++i) { // 显示前5个网络
      display.print(i + 1);
      display.print(": ");
      display.println(WiFi.SSID(i));
    }
    display.display();
  }
}

void loop() {}

注意事项

  • OLED屏幕地址可能为0x3C0x3D,需根据实际硬件调整。
  • 如果热点数量过多,可分页显示或滚动刷新。

7. 流程图

以下为Wi-Fi扫描流程图:

flowchart TD
    A[开始] --> B[初始化串口和Wi-Fi模块]
    B --> C{是否找到热点}
    C --是--> D[获取热点信息(SSID、RSSI、加密类型)]
    C --否--> E[显示"未找到网络"]
    D --> F[显示热点信息]
    F --> G[结束]