ESP32 使用 beacon 超时机制检测 AP 是否活跃。如果 station 在 inactive 时间内未收到所连接 AP 的 beacon,将发生 beacon 超时。inactive 时间通过调用函数 esp_wifi_set_inactive_time() 设置。
beacon 超时发生后,station 将向 AP 发送 5 个 probe request,如果仍未从 AP 接收到 probe response 或 beacon,station 将与 AP 断开连接并产生 WIFI_EVENT_STA_DISCONNECTED 事件。
需要注意的是,扫描过程中会重置 beacon 超时所使用的定时器,即扫描过程会影响 WIFI_EVENT_STA_BEACON_TIMEOUT 事件的触发。
API esp_wifi_set_config() 可用于配置 station。配置的参数信息会保存到 NVS 中。下表详细介绍了各个字段。
字段 | 描述 |
---|---|
ssid | station 想要连接的目标 AP 的 SSID。 |
password | 目标 AP 的密码。 |
scan_method | WIFI_FAST_SCAN 模式下,扫描到一个匹配的 AP 时即结束。WIFI_ALL_CHANNEL_SCAN 模式下,在所有信道扫描所有匹配的 AP。默认扫描模式是 WIFI_FAST_SCAN。 |
bssid_set | 如果 bssid_set 为 0,station 连接 SSID 与 “ssid” 字段相同的 AP,同时忽略字段 “bssid”。其他情况下,station 连接 SSID 与 “ssid” 字段相同、BSSID 与 “bssid” 字段也相同的 AP。 |
bssid | 只有当 bssid_set 为 1 时有效。见字段 “bssid_set”。 |
channel | 该字段为 0 时,station 扫描信道 1 ~ N 寻找目标 AP;否则,station 首先扫描值与 “channel” 字段相同的信道,再扫描其他信道。如果您不知道目标 AP 在哪个信道,请将该字段设置为 0。 |
sort_method | 该字段仅用于 WIFI_ALL_CHANNEL_SCAN 模式。 如果设置为 WIFI_CONNECT_AP_BY_SIGNAL,所有匹配的 AP 将会按照信号强度排序,信号最好的 AP 会被首先连接。比如,如果 station 想要连接 ssid 为 “apxx” 的 AP,且扫描到两个这样的 AP。第一个 AP 的信号为 -90 dBm,第二个 AP 的信号为 -30 dBm,station 首先连接第二个 AP。除非失败,才会连接第一个。 如果设置为 WIFI_CONNECT_AP_BY_SECURITY,所有匹配的 AP 将会按照安全性排序。比如,如果 station 想要连接 ssid 为 “apxx” 的 AP,并且扫描到两个这样的 AP。第一个 AP 为开放式,第二个 AP 为 WPA2 加密,station 首先连接第二个 AP。除非失败,才会连接第一个。 |
threshold | 该字段用来筛选找到的 AP,如果 AP 的 RSSI 或安全模式小于配置的阈值,则不会被连接。 如果 RSSI 设置为 0,则表示默认阈值、默认 RSSI 阈值为 -127 dBm。如果 authmode 阈值设置为 0,则表示默认阈值,默认 authmode 阈值无授权。 |
注意
二、抓包分析
苹果电脑自带抓包工具
How to Sniff Packets & Capture Packet Trace in Mac OS X the Easy Way
乐鑫 Wireshark 使用指南 - ESP32 - — ESP-IDF 编程指南 latest 文档
ref:
Wi-Fi 驱动程序 - ESP32 - — ESP-IDF 编程指南 latest 文档
wifi:bcn_timout,ap_probe_send_start after esp_http_client use? (IDFGH-3754) · Issue #5674 · espressif/esp-idf · GitHub