跳转至

扫描

WiFi Scan API

学习目标

  • 理解主动扫描和被动扫描的区别
  • 掌握扫描参数配置和结果解析
  • 能够在 WS63 上扫描周边 WiFi 热点

规格与功能

WS63 扫描周边 WiFi,串口打印每个热点的 SSID、RSSI、加密方式、信道。

规格项 说明
扫描模式 主动扫描
扫描信道 全信道(1~13)
结果内容 SSID / BSSID / RSSI / 信道 / 加密方式

基本概念

主动扫描 vs 被动扫描

主动扫描 被动扫描
方式 STA 发送 Probe Request STA 听 Beacon
速度 快(主动问) 慢(等 AP 自己说)
功耗 较高 较低
结果 更完整(SSID 即使隐藏也能扫到?不能,但可探测存在) 仅广播 SSID 的 AP

主动扫描是最常用的模式。

扫描结果含义

字段 含义 示例
SSID 热点名称 "MyRouter"
BSSID AP 的 MAC 地址 AA:BB:CC:DD:EE:FF
RSSI 信号强度 -45 dBm(越近 0 越强)
Channel 信道 6(2.4GHz)
Security 加密方式 WPA2-PSK / Open

涉及 API

API 用途
wifi_sta_scan() 启动扫描
wifi_scan_stop() 停止扫描
wifi_event_register() 注册事件回调(扫描结果)

案例操作指导

编译烧录后串口打印周边 WiFi 列表:

[WiFi Scan] starting...
[WiFi Scan] SSID: MyRouter       RSSI: -45  Ch: 6   WPA2
[WiFi Scan] SSID: NeighborWiFi   RSSI: -72  Ch: 11  WPA2
[WiFi Scan] SSID: FreeWiFi       RSSI: -80  Ch: 1   Open
[WiFi Scan] done, 3 APs found

关键配置

  • 扫描模式:主动扫描
  • 扫描信道:全信道(1~13)
  • 扫描结果按 RSSI 降序展示(信号最强的排最前)

代码详解

启动扫描

wifi_scan_config_t scan_config = {
    .scan_type = WIFI_SCAN_ACTIVE,  // 主动扫描
    .channels  = 0,                 // 0 = 全信道
    .timeout   = 5000,              // 5 秒超时
};
wifi_sta_scan(&scan_config);

扫描结果回调

static void wifi_sta_get_scan_info(wifi_scan_result_t *result)
{
    printf("[WiFi Scan] SSID: %-20s RSSI: %-4d Ch: %-3d %s\n",
           result->ssid,
           result->rssi,
           result->channel,
           result->security == WIFI_SEC_OPEN ? "Open" : "WPA2");
}

static void wifi_scan_done_cb(void)
{
    printf("[WiFi Scan] done, %d APs found\n", g_ap_count);
}

扫描结果筛选

// 按 RSSI 过滤弱信号
if (result->rssi < -80) {
    return;  // 忽略信号太弱的 AP
}

// 按 SSID 过滤特定热点
if (strstr(result->ssid, "Target") == NULL) {
    return;  // 不是目标热点
}