1 前言

在使用 Wi-Fi 功能时,我们的操作往往是打开手机上的 Wi-Fi 设备,搜索到想要连接的热点,输入密码,联网成功,其实这个过程是有对应的专业术语的,分别是:扫描(Scanning)、认证(Authentication)、关联(Association)。下面用一张图来表示这个过程。

2 扫描目的

扫描主要是找到一个无线网络,然后加入到该网络中。

3 扫描方式

ESP Wi-Fi 有以下几种扫描方式:

模式 描述
主动扫描 通过发送 probe request 进行扫描。该模式为默认的扫描模式。
被动扫描 不发送 probe request。跳至某一特定信道并等待 beacon。应用程序可通过 wifi_scan_config_t 中的 scan_type 字段使能被动扫描。
快速扫描 在这种模式下,扫描在检测到匹配的 AP 后立即完成,即使通道没有被完全扫描到。你可以设置信号强度的阈值,以及选择由 AP 提供的所需的认证模式。Wi-Fi 驱动程序将忽略不符合所述标准的 AP。
全信道扫描 只有在扫描完所有通道后,扫描才会结束;Wi-Fi 驱动程序将存储 4 个完全匹配的 AP。对 AP 的排序方法包括 rssi 和 authmode。扫描后,Wi-Fi 驱动会根据排序选择最适合的 AP。
特定信道扫描 仅扫描特定的信道。wifi_scan_config_t 中的 channel 字段为 1-14 时,当前模式为特定信道扫描。
前端扫描 在 station 模式下 Wi-Fi 未连接时,可进行前端扫描。Wi-Fi 驱动程序决定进行前端扫描还是后端扫描,应用程序无法配置这两种模式。
后端扫描 在 station 模式或 station/AP 共存模式下 Wi-Fi 已连接时,可进行后端扫描。Wi-Fi 驱动程序决定进行前端扫描还是后端扫描,应用程序无法配置这两种模式。

4. 如何使用相关 API

4.1 初始化 Wi-Fi 环境

首先,Wi-Fi 子系统的初始化需要由我们自己来自行,当我们写自己的程序时,需要通过调用 esp_wifi_init(&config)方法来完成 。

ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();assert(sta_netif);wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));

4.2 设置操作模式

可以调用函数 esp_wifi_set_mode() 来设定,扫描需要在 station 或者 station/softap 共存模式下完成,同时,我们也可以调用 esp_wifi_get_mode() 来检索我们目前的模式。

ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));

4.3 开始扫描

ESP_ERROR_CHECK(esp_wifi_start());
esp_wifi_scan_start(NULL, true);

调用 esp_wifi_scan_start(const wifi_scan_config_t *config, bool block) 函数来完成 Wi-Fi 扫描功能 ,同时也可以调用该接口设置扫描类型与其他扫描属性,下表详细描述了结构体 wifi_scan_config_t 各字段信息。

字段 字段
ssid 如果该字段的值不为 NULL,则仅可扫描到具有相同 SSID 值的 AP
bssid 如果该字段的值不为 NULL,则仅可扫描到具有相同 BSSID 值的 AP
channel 如果该字段值为 0,将进行全信道扫描;反之,将针对特定信道进行扫描。
show_hidden 如果该字段值为 0,本次扫描将忽略具有隐藏 SSID 的 AP;反之,这些 AP 也会在扫描时被视为正常 AP
scan_type 如果该字段值为为 WIFI_SCAN_TYPE_ACTIVE,则本次扫描为主动扫描;反之,将被视为被动扫描。
scan_time

该字段用于控制每个信道的扫描时间。

被动扫描时,scan_time.passive 字段负责为每个信道指定扫描时间。

主动扫描时,每个信道的扫描时间如下列表所示。其中,min 代表 scan_time_active_min,max 代表 scan_time_active_max。

min=0, max=0:每个信道的扫描时间为 120 ms。

min>0, max=0:每个信道的扫描时间为 120 ms。

min=0, max>0:每个信道的扫描时间为 max ms。

min>0, max>0:每个信道扫描的最短时间为 min ms。 如果在这段时间内未找到 AP,将跳转至下一个信道。如这段时间内找到 AP,则该信道的扫描时间为 max ms。

如希望提升 Wi-Fi 扫描性能,则可修改上述两个参数。

4.4 查看扫描结果

在发出开始执行扫描的请求后,我们将被通知扫描,当 SYSTEM_EVENT_SCAN_DONE 事件发布完成, 我们就认为扫描完成。

Wi-Fi 扫描结束后,扫描的结果会存储在 ESP32 分配的动态存储器内部,当我们调用 esp_wifi_scan_get_ap_records(uint16_t *number, wifi_ap_record_t *ap_records) 时,会返回所存储的 ap 信息,这时也会释放内部分配的存储。

扫描记录包含在包含 wifi_ap_record_t 结构的一个示例,如下所示:

/** @brief Description of a WiFi AP */
typedef struct {uint8_t bssid[6];                     /**< MAC address of AP */uint8_t ssid[33];                     /**< SSID of AP */uint8_t primary;                      /**< channel of AP */wifi_second_chan_t second;            /**< secondary channel of AP */int8_t  rssi;                         /**< signal strength of AP */wifi_auth_mode_t authmode;            /**< authmode of AP */wifi_cipher_type_t pairwise_cipher;   /**< pairwise cipher of AP */wifi_cipher_type_t group_cipher;      /**< group cipher of AP */wifi_ant_t ant;                       /**< antenna used to receive beacon from AP */uint32_t phy_11b:1;                   /**< bit: 0 flag to identify if 11b mode is enabled or not */uint32_t phy_11g:1;                   /**< bit: 1 flag to identify if 11g mode is enabled or not */uint32_t phy_11n:1;                   /**< bit: 2 flag to identify if 11n mode is enabled or not */uint32_t phy_lr:1;                    /**< bit: 3 flag to identify if low rate is enabled or not */uint32_t wps:1;                       /**< bit: 4 flag to identify if WPS is supported or not */uint32_t ftm_responder:1;             /**< bit: 5 flag to identify if FTM is supported in responder mode */uint32_t ftm_initiator:1;             /**< bit: 6 flag to identify if FTM is supported in initiator mode */uint32_t reserved:25;                 /**< bit: 7..31 reserved */wifi_country_t country;               /**< country information of AP */
} wifi_ap_record_t;

如果我们希望在完成扫描之前自行取消扫描,我们可以调用 esp_wifi_scan_stop() 。

ap 扫描的个数可以通过 ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count)) 接口获取。

4.5 参考示例

1) scan 示例

可以在 menuconfig 中设置保存 ap 的数据,默认设置 10 个,最大支持到 20 个。

idf.py menuconfig---->Example Configuration---->(10)Max size of scan list

运行结果如下:


I (636) wifi_init: rx ba win: 6
I (636) wifi_init: tcpip mbox: 32
I (646) wifi_init: udp mbox: 6
I (646) wifi_init: tcp mbox: 6
I (646) wifi_init: tcp tx win: 5744
I (656) wifi_init: tcp rx win: 5744
I (656) wifi_init: tcp mss: 1440
I (666) wifi_init: WiFi IRAM OP enabled
I (666) wifi_init: WiFi RX IRAM OP enabled
I (676) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
I (786) wifi:mode : sta (30:ae:a4:10:85:60)
I (786) wifi:enable tsf
I (2886) scan: Total APs scanned = 72
I (2886) scan: SSID         iot
I (2886) scan: RSSI         -25
I (2886) scan: Authmode     WIFI_AUTH_WPA2_PSK
I (2886) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (2896) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (2896) scan: Channel      1I (2906) scan: SSID        cc2.4
I (2906) scan: RSSI         -26
I (2906) scan: Authmode     WIFI_AUTH_WPA_WPA2_PSK
I (2916) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (2916) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (2926) scan: Channel      1I (2926) scan: SSID        MERCURY_C6D4
I (2936) scan: RSSI         -37
I (2936) scan: Authmode     WIFI_AUTH_WPA_WPA2_PSK
I (2946) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (2946) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (2956) scan: Channel      1I (2956) scan: SSID        Huawei-jyf
I (2956) scan: RSSI         -38
I (2966) scan: Authmode     WIFI_AUTH_WPA_WPA2_PSK
I (2966) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (2976) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (2976) scan: Channel      5I (2986) scan: SSID        cgh
I (2986) scan: RSSI         -41
I (2986) scan: Authmode     WIFI_AUTH_WPA_WPA2_PSK
I (2996) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (2996) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (3006) scan: Channel      11I (3006) scan: SSID       myssid
I (3016) scan: RSSI         -45
I (3016) scan: Authmode     WIFI_AUTH_WPA2_PSK
I (3026) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (3026) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (3036) scan: Channel      7I (3036) scan: SSID        xiaomi_2.4g
I (3036) scan: RSSI         -46
I (3046) scan: Authmode     WIFI_AUTH_OPEN
I (3046) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_NONE
I (3056) scan: Group Cipher     WIFI_CIPHER_TYPE_NONE
I (3056) scan: Channel      2I (3066) scan: SSID        myap
I (3066) scan: RSSI         -49
I (3066) scan: Authmode     WIFI_AUTH_WPA_WPA2_PSK
I (3076) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (3076) scan: Group Cipher     WIFI_CIPHER_TYPE_TKIP
I (3086) scan: Channel      11I (3086) scan: SSID       394
I (3096) scan: RSSI         -51
I (3096) scan: Authmode     WIFI_AUTH_OPEN
I (3096) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_NONE
I (3106) scan: Group Cipher     WIFI_CIPHER_TYPE_NONE
I (3116) scan: Channel      5I (3116) scan: SSID        TL-XDR1860_1
I (3116) scan: RSSI         -52
I (3126) scan: Authmode     WIFI_AUTH_WPA_WPA2_PSK
I (3126) scan: Pairwise Cipher  WIFI_CIPHER_TYPE_CCMP
I (3136) scan: Group Cipher     WIFI_CIPHER_TYPE_CCMP
I (3136) scan: Channel      5

2) fast scan 示例

可以在 menuconfig 中配置快速扫描或者全信道扫描方式。

idf.py menuconfig---->Example Configuration---->[*]fast scan threshold

快速扫描运行结果如下:

I (635) wifi_init: rx ba win: 6
I (635) wifi_init: tcpip mbox: 32
I (645) wifi_init: udp mbox: 6
I (645) wifi_init: tcp mbox: 6
I (645) wifi_init: tcp tx win: 5744
I (655) wifi_init: tcp rx win: 5744
I (655) wifi_init: tcp mss: 1440
I (665) wifi_init: WiFi IRAM OP enabled
I (665) wifi_init: WiFi RX IRAM OP enabled
I (765) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
I (865) wifi:mode : sta (30:ae:a4:10:85:60)
I (865) wifi:enable tsf
I (875) wifi:new:<1,0>, old:<1,0>, ap:<255,255>, sta:<1,0>, prof:8
I (1645) wifi:state: init -> auth (b0)
I (1695) wifi:state: auth -> assoc (0)
I (1725) wifi:state: assoc -> run (10)
I (3795) wifi:connected with iot, aid = 58, channel 1, BW20, bssid = 30:a2:c2:70:27:88
I (3795) wifi:security: WPA2-PSK, phy: bgn, rssi: -25
I (3815) wifi:pm start, type: 1I (3815) wifi:AP's beacon interval = 102400 us, DTIM period = 1
I (4565) scan: got ip:192.168.3.17
I (4565) esp_netif_handlers: sta ip: 192.168.3.17, mask: 255.255.255.0, gw: 192.168.3.1

全信道扫描

I (786) wifi:mode : sta (30:ae:a4:10:85:60)
I (796) wifi:enable tsf
I (806) wifi:new:<1,0>, old:<1,0>, ap:<255,255>, sta:<1,0>, prof:8
I (806) wifi:state: init -> auth (b0)
I (826) wifi:state: auth -> assoc (0)
I (826) wifi:state: assoc -> init (3a0)
I (826) wifi:new:<1,0>, old:<1,0>, ap:<255,255>, sta:<1,0>, prof:8
I (2886) wifi:new:<1,0>, old:<1,0>, ap:<255,255>, sta:<1,0>, prof:8
I (2886) wifi:state: init -> auth (b0)
I (2896) wifi:state: auth -> assoc (0)
I (2906) wifi:state: assoc -> run (10)
I (3006) wifi:connected with iot, aid = 60, channel 1, BW20, bssid = 30:a2:c2:70:27:88
I (3006) wifi:security: WPA2-PSK, phy: bgn, rssi: -25
I (3006) wifi:pm start, type: 1I (3076) wifi:AP's beacon interval = 102400 us, DTIM period = 1
I (4066) scan: got ip:192.168.3.17
I (4066) esp_netif_handlers: sta ip: 192.168.3.17, mask: 255.255.255.0, gw: 192.168.3.1

优缺点对比

优点:快速扫描连接时间会缩短 1 s 左右

缺点:如果有同名的 SSID 和 PASSWORD ,这种情况下连接的不一定是最优的 AP ,但全信道扫描连接的 AP 一定是最优的。

ESP Wi-Fi 扫描入门相关推荐

  1. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰

    龙源期刊网 http://www.qikan.com.cn 浅谈 ZigBee 和 Wi - Fi 的共存和干扰 作者:姜伟 朱凯 刘童 来源:<科技视界> 2013 年第 16 期 [摘 ...

  2. 比较802.11ac(Wi‑Fi 5)和802.11ax(Wi‑Fi 6)

    MIMO 802.11ac仅在下行模式下,支持多用户MIMO. 802.11ax不仅下行链路:也在上行链路支持MIMO功能,因此多个用户可以同时上传视频. 调制方法 802.11ax具有更高的调制方案 ...

  3. android环境监测,基于Wi―Fi和Android家居环境监测与实现

    摘 要 为了人们生活环境健康安全,实现家居环境检测,利用现在手持智能设备,设计出一种基于Android的家居检测系统.本文采用了具有Android操作系统的智能手机或平板电脑作为家居设备终端,以STM ...

  4. 【Win10 应用开发】扫描和连接Wi-fi网络

    原文:[Win10 应用开发]扫描和连接Wi-fi网络 老周今天带大家去"扫雷"了,别当真,是扫描并连接指定无线网络,时尚一点叫Wi-fi. 所以,今天的任务要求你的设备至少有1张 ...

  5. ESP32-C3入门教程——导读

    文章目录 一.环境篇 二.基础篇 三.系统篇 四.WiFi篇 五.蓝牙篇 六.网络篇 七.IoT篇 八.问题篇 九.开源代码 十.视频演示 关于更新进度 有超链接的文章是已经完成的,可以点击跳转直接看 ...

  6. [RK3288][Android6.0] 一律运行WLAN漫游扫描选项

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 开发者选项中有一栏是""Always allow Wi‑Fi Roam Sca ...

  7. APP自动化测试框架-UiAutomator2基础入门

    前言 很早以前,我用uiautomator+java实践过Android APP自动化测试,不过今天要提的不是uiautomator,而是uiautomator2.听起来uiautomator2像是u ...

  8. ESP32-S2上使用SPI接口芯片DM9051NP转以太网的无线物联网网关开发指导

    前言 DM9051NP芯片 SPI接口占用管脚数量比以太网PHY的RMII/MII少,PCBA版线布局可更精简.而DM9051NP驱动软件方面,由于源代码已集成在ESP IDF中,可见其可靠度以及网口 ...

  9. 推荐:数据竞赛的利器XGBoost的常见面试题

    XGBoost的威名想必大家都有所耳闻,它不仅是数据科学竞赛神器,在工业界中也被广泛地使用.本文给大家分享珍藏了多年的XGBoost高频面试题,希望能够加深大家对XGBoost的理解,更重要的是能够在 ...

最新文章

  1. EventBus3.0源码解析
  2. WEB开发中的会话控制
  3. bzoj2875: [Noi2012]随机数生成器
  4. chrome自动提交文件_实用!8个 chrome插件玩转GitHub,单个文件下载小意思
  5. 微信公众平台消息接口开发(2)-封装weixin.class.php
  6. 【转】ABP源码分析十五:ABP中的实用扩展方法
  7. qt中QMap与QMultimap用foreach遍历
  8. 调用支付jsapl缺少参数:totalfee openid无法取得_微信支付的软件架构,牛逼!
  9. ngnix 映射路径配置_MyBatis Config(三)映射文件mappers标签
  10. IntelliJ IDEA 中文官方文档
  11. angularjs1-8,cacheFactory,sce
  12. sqluldr2导出过blob字段_sqluldr2导出数据没有文件也没有报错
  13. 虚拟机安装win10 64/32bit系统
  14. Struts 2的基石——拦截器(Interceptor)详细讲解
  15. python 3des加密_Python 3DES 加密解密
  16. 基于dsp语音降噪算法c语言,基于DSP的语音降噪实时实现.PDF
  17. 微生物组-扩增子16S分析和可视化(2023.2)
  18. MySQL与CVM自建数据库优势_UCloud云数据库MySQL产品优势及与自建数据库对比
  19. Matlab视频处理
  20. 实现PPT演示的"非全屏播放"效果

热门文章

  1. OpenStack概述
  2. 概率论——泊松随机变量
  3. 离开美国大厂的华人科技大佬们都去哪了?
  4. [问题已处理]-在win10上安装prometheus监控
  5. MySQL BETWEEN 和 IN 用法
  6. 操作系统-操作系统简介
  7. 史玉柱故事之九:采访手记
  8. 一个公式解释:没钱没资源,运营如何破局?(转)
  9. php向用户发送电子邮件确认注册,php – 发送电子邮件以确认注册FOSUserBundle
  10. 执业医师考试该如何备考?