添加 ESP-IDF Wi-Fi Station 示例及相关配置文件
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
ARG DOCKER_TAG=latest
|
||||||
|
FROM espressif/idf:${DOCKER_TAG}
|
||||||
|
|
||||||
|
ENV LC_ALL=C.UTF-8
|
||||||
|
ENV LANG=C.UTF-8
|
||||||
|
|
||||||
|
RUN apt-get update -y && apt-get install udev -y
|
||||||
|
|
||||||
|
RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/opt/esp/entrypoint.sh" ]
|
||||||
|
|
||||||
|
CMD ["/bin/bash", "-c"]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "ESP-IDF QEMU",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash",
|
||||||
|
"idf.gitPath": "/usr/bin/git",
|
||||||
|
"idf.espIdfPath": "/opt/esp/idf",
|
||||||
|
"idf.toolsPath": "/opt/esp/tools",
|
||||||
|
"idf.pythonBinPath": "/opt/esp/idf/venv/bin/python3",
|
||||||
|
"idf.useIDFKConfig": true
|
||||||
|
},
|
||||||
|
"extensions": [
|
||||||
|
"espressif.esp-idf-extension",
|
||||||
|
"espressif.esp-idf-web"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged"]
|
||||||
|
}
|
||||||
+78
@@ -0,0 +1,78 @@
|
|||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Directory metadata
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# Log files
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Build artifacts and directories
|
||||||
|
**/build/
|
||||||
|
build/
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.out
|
||||||
|
*.exe # For any host-side utilities compiled on Windows
|
||||||
|
|
||||||
|
# ESP-IDF specific build outputs
|
||||||
|
*.bin
|
||||||
|
*.elf
|
||||||
|
*.map
|
||||||
|
flasher_args.json # Generated in build directory
|
||||||
|
sdkconfig.old
|
||||||
|
sdkconfig
|
||||||
|
|
||||||
|
# ESP-IDF dependencies
|
||||||
|
# For older versions or manual component management
|
||||||
|
/components/.idf/
|
||||||
|
**/components/.idf/
|
||||||
|
# For modern ESP-IDF component manager
|
||||||
|
managed_components/
|
||||||
|
# If ESP-IDF tools are installed/referenced locally to the project
|
||||||
|
.espressif/
|
||||||
|
|
||||||
|
# CMake generated files
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles/
|
||||||
|
cmake_install.cmake
|
||||||
|
install_manifest.txt
|
||||||
|
CTestTestfile.cmake
|
||||||
|
|
||||||
|
# Python environment files
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
__pycache__/
|
||||||
|
*.egg-info/
|
||||||
|
dist/
|
||||||
|
|
||||||
|
# Virtual environment folders
|
||||||
|
venv/
|
||||||
|
.venv/
|
||||||
|
env/
|
||||||
|
|
||||||
|
# Language Servers
|
||||||
|
.clangd/
|
||||||
|
.ccls-cache/
|
||||||
|
compile_commands.json
|
||||||
|
|
||||||
|
# Windows specific
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# User-specific configuration files
|
||||||
|
*.user
|
||||||
|
*.workspace # General workspace files, can be from various tools
|
||||||
|
*.suo # Visual Studio Solution User Options
|
||||||
|
*.sln.docstates # Visual Studio
|
||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "ESP-IDF",
|
||||||
|
"compilerPath": "/Users/yulinling/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20260121/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc",
|
||||||
|
"compileCommands": "${config:idf.buildPath}/compile_commands.json",
|
||||||
|
"intelliSenseMode": "gcc-x86",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"browse": {
|
||||||
|
"path": [
|
||||||
|
"${workspaceFolder}"
|
||||||
|
],
|
||||||
|
"limitSymbolsToIncludedHeaders": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
Vendored
+10
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "gdbtarget",
|
||||||
|
"request": "attach",
|
||||||
|
"name": "Eclipse CDT GDB Adapter"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Vendored
+18
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp.intelliSenseEngine": "default",
|
||||||
|
"idf.extensionActivationMode": "always",
|
||||||
|
"idf.openOcdConfigs": [
|
||||||
|
"board/esp32s3-builtin.cfg"
|
||||||
|
],
|
||||||
|
"idf.port": "detect",
|
||||||
|
"idf.currentSetup": "/opt/esp/idf",
|
||||||
|
"idf.customExtraVars": {
|
||||||
|
"IDF_TARGET": "esp32s3"
|
||||||
|
},
|
||||||
|
"clangd.path": "/Users/yulinling/.espressif/tools/esp-clang/esp-19.1.2_20250312/esp-clang/bin/clangd",
|
||||||
|
"clangd.arguments": [
|
||||||
|
"--background-index",
|
||||||
|
"--query-driver=**",
|
||||||
|
"--compile-commands-dir=/Users/yulinling/work/work-hardware/HeavenlyHeroStar/build"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# The following five lines of boilerplate have to be in your project's
|
||||||
|
# CMakeLists in this exact order for cmake to work correctly
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||||
|
# "Trim" the build. Include the minimal set of components, main, and anything it depends on.
|
||||||
|
idf_build_set_property(MINIMAL_BUILD ON)
|
||||||
|
project(HeavenlyHeroStar)
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-P4 | ESP32-H2 |
|
||||||
|
| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | -------- |
|
||||||
|
|
||||||
|
# Wi-Fi Station Example
|
||||||
|
|
||||||
|
(See the README.md file in the upper level 'examples' directory for more information about examples.)
|
||||||
|
|
||||||
|
This example shows how to use the Wi-Fi Station functionality of the Wi-Fi driver of ESP for connecting to an Access Point.
|
||||||
|
|
||||||
|
## How to use example
|
||||||
|
|
||||||
|
### Configure the project
|
||||||
|
|
||||||
|
Open the project configuration menu (`idf.py menuconfig`).
|
||||||
|
|
||||||
|
In the `Example Configuration` menu:
|
||||||
|
|
||||||
|
* Set the Wi-Fi configuration.
|
||||||
|
* Set `WiFi SSID`.
|
||||||
|
* Set `WiFi Password`.
|
||||||
|
|
||||||
|
Optional: If you need, change the other options according to your requirements.
|
||||||
|
|
||||||
|
### Build and Flash
|
||||||
|
|
||||||
|
Build the project and flash it to the board, then run the monitor tool to view the serial output:
|
||||||
|
|
||||||
|
Run `idf.py -p PORT flash monitor` to build, flash and monitor the project.
|
||||||
|
|
||||||
|
(To exit the serial monitor, type ``Ctrl-]``.)
|
||||||
|
|
||||||
|
See the Getting Started Guide for all the steps to configure and use the ESP-IDF to build projects.
|
||||||
|
|
||||||
|
* [ESP-IDF Getting Started Guide on ESP32](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html)
|
||||||
|
* [ESP-IDF Getting Started Guide on ESP32-S2](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html)
|
||||||
|
* [ESP-IDF Getting Started Guide on ESP32-C3](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/index.html)
|
||||||
|
|
||||||
|
## Example Output
|
||||||
|
Note that the output, in particular the order of the output, may vary depending on the environment.
|
||||||
|
|
||||||
|
Console output if station connects to AP successfully:
|
||||||
|
```
|
||||||
|
I (589) wifi station: ESP_WIFI_MODE_STA
|
||||||
|
I (599) wifi: wifi driver task: 3ffc08b4, prio:23, stack:3584, core=0
|
||||||
|
I (599) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
|
||||||
|
I (599) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
|
||||||
|
I (629) wifi: wifi firmware version: 2d94f02
|
||||||
|
I (629) wifi: config NVS flash: enabled
|
||||||
|
I (629) wifi: config nano formatting: disabled
|
||||||
|
I (629) wifi: Init dynamic tx buffer num: 32
|
||||||
|
I (629) wifi: Init data frame dynamic rx buffer num: 32
|
||||||
|
I (639) wifi: Init management frame dynamic rx buffer num: 32
|
||||||
|
I (639) wifi: Init management short buffer num: 32
|
||||||
|
I (649) wifi: Init static rx buffer size: 1600
|
||||||
|
I (649) wifi: Init static rx buffer num: 10
|
||||||
|
I (659) wifi: Init dynamic rx buffer num: 32
|
||||||
|
I (759) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0
|
||||||
|
I (769) wifi: mode : sta (30:ae:a4:d9:bc:c4)
|
||||||
|
I (769) wifi station: wifi_init_sta finished.
|
||||||
|
I (889) wifi: new:<6,0>, old:<1,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (889) wifi: state: init -> auth (b0)
|
||||||
|
I (899) wifi: state: auth -> assoc (0)
|
||||||
|
I (909) wifi: state: assoc -> run (10)
|
||||||
|
I (939) wifi: connected with #!/bin/test, aid = 1, channel 6, BW20, bssid = ac:9e:17:7e:31:40
|
||||||
|
I (939) wifi: security type: 3, phy: bgn, rssi: -68
|
||||||
|
I (949) wifi: pm start, type: 1
|
||||||
|
|
||||||
|
I (1029) wifi: AP's beacon interval = 102400 us, DTIM period = 3
|
||||||
|
I (2089) esp_netif_handlers: sta ip: 192.168.77.89, mask: 255.255.255.0, gw: 192.168.77.1
|
||||||
|
I (2089) wifi station: got ip:192.168.77.89
|
||||||
|
I (2089) wifi station: connected to ap SSID:myssid password:mypassword
|
||||||
|
```
|
||||||
|
|
||||||
|
Console output if the station failed to connect to AP:
|
||||||
|
```
|
||||||
|
I (589) wifi station: ESP_WIFI_MODE_STA
|
||||||
|
I (599) wifi: wifi driver task: 3ffc08b4, prio:23, stack:3584, core=0
|
||||||
|
I (599) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
|
||||||
|
I (599) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
|
||||||
|
I (629) wifi: wifi firmware version: 2d94f02
|
||||||
|
I (629) wifi: config NVS flash: enabled
|
||||||
|
I (629) wifi: config nano formatting: disabled
|
||||||
|
I (629) wifi: Init dynamic tx buffer num: 32
|
||||||
|
I (629) wifi: Init data frame dynamic rx buffer num: 32
|
||||||
|
I (639) wifi: Init management frame dynamic rx buffer num: 32
|
||||||
|
I (639) wifi: Init management short buffer num: 32
|
||||||
|
I (649) wifi: Init static rx buffer size: 1600
|
||||||
|
I (649) wifi: Init static rx buffer num: 10
|
||||||
|
I (659) wifi: Init dynamic rx buffer num: 32
|
||||||
|
I (759) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0
|
||||||
|
I (759) wifi: mode : sta (30:ae:a4:d9:bc:c4)
|
||||||
|
I (769) wifi station: wifi_init_sta finished.
|
||||||
|
I (889) wifi: new:<6,0>, old:<1,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (889) wifi: state: init -> auth (b0)
|
||||||
|
I (1889) wifi: state: auth -> init (200)
|
||||||
|
I (1889) wifi: new:<6,0>, old:<6,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (1889) wifi station: retry to connect to the AP
|
||||||
|
I (1899) wifi station: connect to the AP fail
|
||||||
|
I (3949) wifi station: retry to connect to the AP
|
||||||
|
I (3949) wifi station: connect to the AP fail
|
||||||
|
I (4069) wifi: new:<6,0>, old:<6,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (4069) wifi: state: init -> auth (b0)
|
||||||
|
I (5069) wifi: state: auth -> init (200)
|
||||||
|
I (5069) wifi: new:<6,0>, old:<6,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (5069) wifi station: retry to connect to the AP
|
||||||
|
I (5069) wifi station: connect to the AP fail
|
||||||
|
I (7129) wifi station: retry to connect to the AP
|
||||||
|
I (7129) wifi station: connect to the AP fail
|
||||||
|
I (7249) wifi: new:<6,0>, old:<6,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (7249) wifi: state: init -> auth (b0)
|
||||||
|
I (8249) wifi: state: auth -> init (200)
|
||||||
|
I (8249) wifi: new:<6,0>, old:<6,0>, ap:<255,255>, sta:<6,0>, prof:1
|
||||||
|
I (8249) wifi station: retry to connect to the AP
|
||||||
|
I (8249) wifi station: connect to the AP fail
|
||||||
|
I (10299) wifi station: connect to the AP fail
|
||||||
|
I (10299) wifi station: Failed to connect to SSID:myssid, password:mypassword
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running the example on ESP Chips without Wi-Fi
|
||||||
|
|
||||||
|
This example can run on ESP Chips without Wi-Fi using ESP-Hosted. See the [Two-Chip Solution](../../README.md#wi-fi-examples-with-two-chip-solution) section in the upper level `README.md` for information.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
dependencies:
|
||||||
|
idf:
|
||||||
|
source:
|
||||||
|
type: idf
|
||||||
|
version: 6.2.0
|
||||||
|
manifest_hash: 0938fe5fc43e8ea0c6dda60b9f593e186303cb1b17412f4d696784db8099a7e9
|
||||||
|
target: esp32s3
|
||||||
|
version: 3.0.0
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
idf_component_register(SRCS "station_example_main.c"
|
||||||
|
PRIV_REQUIRES esp_wifi nvs_flash
|
||||||
|
INCLUDE_DIRS ".")
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
menu "Example Configuration"
|
||||||
|
|
||||||
|
config ESP_WIFI_SSID
|
||||||
|
string "WiFi SSID"
|
||||||
|
default "myssid"
|
||||||
|
help
|
||||||
|
SSID (network name) for the example to connect to.
|
||||||
|
|
||||||
|
config ESP_WIFI_PASSWORD
|
||||||
|
string "WiFi Password"
|
||||||
|
default "mypassword"
|
||||||
|
help
|
||||||
|
WiFi password (WPA or WPA2) for the example to use.
|
||||||
|
|
||||||
|
choice ESP_WIFI_SAE_MODE
|
||||||
|
prompt "WPA3 SAE mode selection"
|
||||||
|
default ESP_STATION_EXAMPLE_WPA3_SAE_PWE_BOTH
|
||||||
|
help
|
||||||
|
Select mode for SAE as Hunt and Peck, H2E or both.
|
||||||
|
config ESP_STATION_EXAMPLE_WPA3_SAE_PWE_HUNT_AND_PECK
|
||||||
|
bool "HUNT AND PECK"
|
||||||
|
config ESP_STATION_EXAMPLE_WPA3_SAE_PWE_HASH_TO_ELEMENT
|
||||||
|
bool "H2E"
|
||||||
|
depends on ESP_WIFI_ENABLE_SAE_H2E
|
||||||
|
config ESP_STATION_EXAMPLE_WPA3_SAE_PWE_BOTH
|
||||||
|
bool "BOTH"
|
||||||
|
depends on ESP_WIFI_ENABLE_SAE_H2E
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config ESP_WIFI_PW_ID
|
||||||
|
string "PASSWORD IDENTIFIER"
|
||||||
|
depends on ESP_STATION_EXAMPLE_WPA3_SAE_PWE_HASH_TO_ELEMENT|| ESP_STATION_EXAMPLE_WPA3_SAE_PWE_BOTH
|
||||||
|
default ""
|
||||||
|
help
|
||||||
|
password identifier for SAE H2E
|
||||||
|
|
||||||
|
config ESP_MAXIMUM_RETRY
|
||||||
|
int "Maximum retry"
|
||||||
|
default 5
|
||||||
|
help
|
||||||
|
Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent.
|
||||||
|
|
||||||
|
choice ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD
|
||||||
|
prompt "WiFi Scan auth mode threshold"
|
||||||
|
default ESP_WIFI_AUTH_WPA2_PSK
|
||||||
|
help
|
||||||
|
The weakest authmode to accept in the scan mode.
|
||||||
|
This value defaults to ESP_WIFI_AUTH_WPA2_PSK in case password is present and ESP_WIFI_AUTH_OPEN is used.
|
||||||
|
Please select ESP_WIFI_AUTH_WEP/ESP_WIFI_AUTH_WPA_PSK in case AP is operating in WEP/WPA mode.
|
||||||
|
|
||||||
|
config ESP_WIFI_AUTH_OPEN
|
||||||
|
bool "OPEN"
|
||||||
|
config ESP_WIFI_AUTH_WEP
|
||||||
|
bool "WEP"
|
||||||
|
config ESP_WIFI_AUTH_WPA_PSK
|
||||||
|
bool "WPA PSK"
|
||||||
|
config ESP_WIFI_AUTH_WPA2_PSK
|
||||||
|
bool "WPA2 PSK"
|
||||||
|
config ESP_WIFI_AUTH_WPA_WPA2_PSK
|
||||||
|
bool "WPA/WPA2 PSK"
|
||||||
|
config ESP_WIFI_AUTH_WPA3_PSK
|
||||||
|
bool "WPA3 PSK"
|
||||||
|
config ESP_WIFI_AUTH_WPA2_WPA3_PSK
|
||||||
|
bool "WPA2/WPA3 PSK"
|
||||||
|
config ESP_WIFI_AUTH_WAPI_PSK
|
||||||
|
bool "WAPI PSK"
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
endmenu
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
dependencies:
|
||||||
|
espressif/esp_wifi_remote:
|
||||||
|
version: ">=0.10,<2.0"
|
||||||
|
rules:
|
||||||
|
- if: "target in [esp32p4, esp32h2]"
|
||||||
|
espressif/esp_hosted:
|
||||||
|
version: "~2"
|
||||||
|
rules:
|
||||||
|
- if: "target in [esp32p4, esp32h2]"
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
/* WiFi station Example
|
||||||
|
|
||||||
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, this
|
||||||
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||||
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "freertos/event_groups.h"
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "esp_wifi.h"
|
||||||
|
#include "esp_event.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "nvs_flash.h"
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
|
||||||
|
/* The examples use WiFi configuration that you can set via project configuration menu
|
||||||
|
|
||||||
|
If you'd rather not, just change the below entries to strings with
|
||||||
|
the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
|
||||||
|
*/
|
||||||
|
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID
|
||||||
|
#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
|
||||||
|
#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY
|
||||||
|
|
||||||
|
#if CONFIG_ESP_STATION_EXAMPLE_WPA3_SAE_PWE_HUNT_AND_PECK
|
||||||
|
#define ESP_WIFI_SAE_MODE WPA3_SAE_PWE_HUNT_AND_PECK
|
||||||
|
#define EXAMPLE_H2E_IDENTIFIER ""
|
||||||
|
#elif CONFIG_ESP_STATION_EXAMPLE_WPA3_SAE_PWE_HASH_TO_ELEMENT
|
||||||
|
#define ESP_WIFI_SAE_MODE WPA3_SAE_PWE_HASH_TO_ELEMENT
|
||||||
|
#define EXAMPLE_H2E_IDENTIFIER CONFIG_ESP_WIFI_PW_ID
|
||||||
|
#elif CONFIG_ESP_STATION_EXAMPLE_WPA3_SAE_PWE_BOTH
|
||||||
|
#define ESP_WIFI_SAE_MODE WPA3_SAE_PWE_BOTH
|
||||||
|
#define EXAMPLE_H2E_IDENTIFIER CONFIG_ESP_WIFI_PW_ID
|
||||||
|
#endif
|
||||||
|
#if CONFIG_ESP_WIFI_AUTH_OPEN
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WEP
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WPA_PSK
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WPA2_PSK
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WPA3_PSK
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK
|
||||||
|
#elif CONFIG_ESP_WIFI_AUTH_WAPI_PSK
|
||||||
|
#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FreeRTOS event group to signal when we are connected*/
|
||||||
|
static EventGroupHandle_t s_wifi_event_group;
|
||||||
|
|
||||||
|
/* The event group allows multiple bits for each event, but we only care about two events:
|
||||||
|
* - we are connected to the AP with an IP
|
||||||
|
* - we failed to connect after the maximum amount of retries */
|
||||||
|
#define WIFI_CONNECTED_BIT BIT0
|
||||||
|
#define WIFI_FAIL_BIT BIT1
|
||||||
|
|
||||||
|
static const char *TAG = "wifi station";
|
||||||
|
|
||||||
|
static int s_retry_num = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static void event_handler(void* arg, esp_event_base_t event_base,
|
||||||
|
int32_t event_id, void* event_data)
|
||||||
|
{
|
||||||
|
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
|
||||||
|
esp_wifi_connect();
|
||||||
|
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
|
||||||
|
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {
|
||||||
|
esp_wifi_connect();
|
||||||
|
s_retry_num++;
|
||||||
|
ESP_LOGI(TAG, "retry to connect to the AP");
|
||||||
|
} else {
|
||||||
|
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
||||||
|
}
|
||||||
|
ESP_LOGI(TAG,"connect to the AP fail");
|
||||||
|
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
||||||
|
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
|
||||||
|
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
|
||||||
|
s_retry_num = 0;
|
||||||
|
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wifi_init_sta(void)
|
||||||
|
{
|
||||||
|
s_wifi_event_group = xEventGroupCreate();
|
||||||
|
|
||||||
|
ESP_ERROR_CHECK(esp_netif_init());
|
||||||
|
|
||||||
|
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||||
|
esp_netif_create_default_wifi_sta();
|
||||||
|
|
||||||
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||||
|
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||||
|
|
||||||
|
esp_event_handler_instance_t instance_any_id;
|
||||||
|
esp_event_handler_instance_t instance_got_ip;
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
|
||||||
|
ESP_EVENT_ANY_ID,
|
||||||
|
&event_handler,
|
||||||
|
NULL,
|
||||||
|
&instance_any_id));
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
|
||||||
|
IP_EVENT_STA_GOT_IP,
|
||||||
|
&event_handler,
|
||||||
|
NULL,
|
||||||
|
&instance_got_ip));
|
||||||
|
|
||||||
|
wifi_config_t wifi_config = {
|
||||||
|
.sta = {
|
||||||
|
.ssid = EXAMPLE_ESP_WIFI_SSID,
|
||||||
|
.password = EXAMPLE_ESP_WIFI_PASS,
|
||||||
|
/* Authmode threshold resets to WPA2 as default if password matches WPA2 standards (password len => 8).
|
||||||
|
* If you want to connect the device to deprecated WEP/WPA networks, Please set the threshold value
|
||||||
|
* to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with length and format matching to
|
||||||
|
* WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK standards.
|
||||||
|
*/
|
||||||
|
.threshold.authmode = ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD,
|
||||||
|
.sae_pwe_h2e = ESP_WIFI_SAE_MODE,
|
||||||
|
.sae_h2e_identifier = EXAMPLE_H2E_IDENTIFIER,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
|
||||||
|
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
|
||||||
|
ESP_ERROR_CHECK(esp_wifi_start() );
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "wifi_init_sta finished.");
|
||||||
|
|
||||||
|
/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
|
||||||
|
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
|
||||||
|
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
||||||
|
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
|
||||||
|
pdFALSE,
|
||||||
|
pdFALSE,
|
||||||
|
portMAX_DELAY);
|
||||||
|
|
||||||
|
/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
|
||||||
|
* happened. */
|
||||||
|
if (bits & WIFI_CONNECTED_BIT) {
|
||||||
|
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
|
||||||
|
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
|
||||||
|
} else if (bits & WIFI_FAIL_BIT) {
|
||||||
|
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
|
||||||
|
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(TAG, "UNEXPECTED EVENT");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
//Initialize NVS
|
||||||
|
esp_err_t ret = nvs_flash_init();
|
||||||
|
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||||
|
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||||
|
ret = nvs_flash_init();
|
||||||
|
}
|
||||||
|
ESP_ERROR_CHECK(ret);
|
||||||
|
|
||||||
|
if (CONFIG_LOG_MAXIMUM_LEVEL > CONFIG_LOG_DEFAULT_LEVEL) {
|
||||||
|
/* If you only want to open more logs in the wifi module, you need to make the max level greater than the default level,
|
||||||
|
* and call esp_log_level_set() before esp_wifi_init() to improve the log level of the wifi module. */
|
||||||
|
esp_log_level_set("wifi", CONFIG_LOG_MAXIMUM_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
|
||||||
|
wifi_init_sta();
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
|
||||||
|
# SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
import os
|
||||||
|
from typing import Callable
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from pytest_embedded import Dut
|
||||||
|
from pytest_embedded_idf.utils import idf_parametrize
|
||||||
|
|
||||||
|
# diff of esp32s2/esp32s3 ~45K, others ~50K
|
||||||
|
|
||||||
|
DIFF_THRESHOLD = {
|
||||||
|
'esp32s2': 40 * 1000,
|
||||||
|
'esp32s3': 40 * 1000,
|
||||||
|
'default': 45 * 1000,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.two_duts
|
||||||
|
@pytest.mark.parametrize('count, config, skip_autoflash', [(2, 'default|enable_softap', 'y')], indirect=True)
|
||||||
|
@idf_parametrize(
|
||||||
|
'target',
|
||||||
|
['esp32', 'esp32c2', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32c5', 'esp32c6', 'esp32c61'],
|
||||||
|
indirect=['target'],
|
||||||
|
)
|
||||||
|
def test_wifi_sdkconfig_disable_softap_save_binary_size(
|
||||||
|
dut: Tuple[Dut, Dut],
|
||||||
|
log_performance: Callable[[str, object], None],
|
||||||
|
) -> None:
|
||||||
|
# dut logs are not needed
|
||||||
|
dut[0].serial.close()
|
||||||
|
dut[1].serial.close()
|
||||||
|
|
||||||
|
app_without_softap = dut[0].app
|
||||||
|
app_with_softap = dut[1].app
|
||||||
|
assert app_without_softap.sdkconfig['ESP_WIFI_SOFTAP_SUPPORT'] is False
|
||||||
|
assert app_with_softap.sdkconfig['ESP_WIFI_SOFTAP_SUPPORT'] is True
|
||||||
|
|
||||||
|
diff = os.path.getsize(app_with_softap.bin_file) - os.path.getsize(app_without_softap.bin_file)
|
||||||
|
log_performance('wifi_disable_softap_save_bin_size', f'{diff} bytes')
|
||||||
|
|
||||||
|
diff_threshold = DIFF_THRESHOLD.get(dut[0].target) or DIFF_THRESHOLD['default']
|
||||||
|
assert diff > diff_threshold
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# build xxx_default
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_IDF_TARGET="esp32c3"
|
||||||
|
CONFIG_ESP32C3_REV_MIN_101=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_IDF_TARGET="esp32c2"
|
||||||
|
CONFIG_XTAL_FREQ_26=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
CONFIG_IDF_TARGET="esp32c2"
|
||||||
|
CONFIG_XTAL_FREQ_26=y
|
||||||
|
CONFIG_ESP32C2_REV_MIN_200=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
CONFIG_ESP_WIFI_11R_SUPPORT=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_ESP_WIFI_11KV_SUPPORT=y
|
||||||
|
CONFIG_ESP_WIFI_RRM_SUPPORT=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_ESP_WIFI_11KV_SUPPORT=y
|
||||||
|
CONFIG_ESP_WIFI_WNM_SUPPORT=y
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=n
|
||||||
|
CONFIG_ESP_WIFI_SSID="ssid_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
|
CONFIG_ESP_WIFI_PASSWORD="password_${IDF_TARGET}_${CI_PIPELINE_ID}"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
|
||||||
Reference in New Issue
Block a user