diff --git a/examples/wifi/README.md b/examples/wifi/README.md index b0dc68350..21578e9d4 100644 --- a/examples/wifi/README.md +++ b/examples/wifi/README.md @@ -1,3 +1,25 @@ # Wi-Fi Examples +Including some examples about wifi. + +## wpa2_enterprise + +Show how ESP32 connects to AP with wpa2 enterprise encryption. + +See the [README.md](./wpa2_enterprise/README.md) file in the project [wpa2_enterprise](./wpa2_enterprise/). + +## power_save + +Show how to use power save mode of wifi. + +See the [README.md](./power_save/README.md) file in the project [power_save](./power_save/). + +## wps(Wifi Protected Setup) + +shows how to use wps(Wifi Protected Setup). + +See the [README.md](./wps/README.md) file in the project [wps](./wps/). + +# More + See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples. diff --git a/examples/wifi/power_save/Makefile b/examples/wifi/power_save/Makefile new file mode 100644 index 000000000..6f2f55434 --- /dev/null +++ b/examples/wifi/power_save/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := power_save + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/wifi/power_save/README.md b/examples/wifi/power_save/README.md new file mode 100644 index 000000000..0f722584a --- /dev/null +++ b/examples/wifi/power_save/README.md @@ -0,0 +1,11 @@ +# Wifi Power Save Example + +This example shows how to use power save mode of wifi. + +Power save mode only works in sta mode. + +* No power save: This is default mode. And the esp32 will work with full power. + +* modem sleep: If you set power save mode as modem sleep, 10s later after connecting to AP, esp32 will wake up and sleep(turn off RF and PHY) periodically. + +* others: not supported yet. diff --git a/examples/wifi/power_save/main/Kconfig.projbuild b/examples/wifi/power_save/main/Kconfig.projbuild new file mode 100644 index 000000000..96e28d0b9 --- /dev/null +++ b/examples/wifi/power_save/main/Kconfig.projbuild @@ -0,0 +1,27 @@ +menu "Example Configuration" + +config WIFI_SSID + string "WiFi SSID" + default "myssid" + help + SSID (network name) for the example to connect to. + +config WIFI_PASSWORD + string "WiFi Password" + default "mypassword" + help + WiFi password (WPA or WPA2) for the example to use. + +choice POWER_SAVE_MODE + prompt "power save mode" + default POWER_SAVE_NONE + help + Power save mode for the esp32 to use. + +config POWER_SAVE_NONE + bool "none" +config POWER_SAVE_MODEM + bool "modem" +endchoice + +endmenu diff --git a/examples/wifi/power_save/main/component.mk b/examples/wifi/power_save/main/component.mk new file mode 100644 index 000000000..7d7b29bfd --- /dev/null +++ b/examples/wifi/power_save/main/component.mk @@ -0,0 +1,7 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + + + diff --git a/examples/wifi/power_save/main/power_save.c b/examples/wifi/power_save/main/power_save.c new file mode 100644 index 000000000..8f6139d89 --- /dev/null +++ b/examples/wifi/power_save/main/power_save.c @@ -0,0 +1,74 @@ +/* Power save Example + * this example shows how to use power save mode + * + * set a router or a AP using the same SSID&PASSWORD as configuration of this example. + * start esp32 and when it connected to AP it will enter power save mode + */ +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event_loop.h" + +/*set the ssid and password via "make menuconfig"*/ +#define DEFAULT_SSID CONFIG_WIFI_SSID +#define DEFAULT_PWD CONFIG_WIFI_PASSWORD + +#if CONFIG_POWER_SAVE_MODEM +#define DEFAULT_PS_MODE WIFI_PS_MODEM +//#elif CONFIG_POWER_SAVE_NONE +//#define DEFAULT_PS_MODE WIFI_PS_NONE +#else +#define DEFAULT_PS_MODE WIFI_PS_NONE +#endif + +static const char *TAG = "power_save"; + + +static esp_err_t event_handler(void *ctx, system_event_t *event) +{ + switch(event->event_id) { + case SYSTEM_EVENT_STA_START: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + break; + case SYSTEM_EVENT_STA_GOT_IP: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_GOT_IP"); + ESP_LOGI(TAG, "got ip:%s\n", + ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED"); + ESP_ERROR_CHECK(esp_wifi_connect()); + break; + default: + break; + } + return ESP_OK; +} + +/*init wifi as sta and set power save mode*/ +static void wifi_power_save(void) +{ + tcpip_adapter_init(); + ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL)); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + wifi_config_t wifi_config = { + .sta = { + .ssid = DEFAULT_SSID, + .password = DEFAULT_PWD + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + + ESP_LOGI(TAG, "esp_wifi_set_ps()."); + esp_wifi_set_ps(DEFAULT_PS_MODE); +} + +void app_main() +{ + wifi_power_save(); +} diff --git a/examples/wifi/wps/Makefile b/examples/wifi/wps/Makefile new file mode 100644 index 000000000..0fbaf2214 --- /dev/null +++ b/examples/wifi/wps/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := wps_example + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/wifi/wps/README.md b/examples/wifi/wps/README.md new file mode 100644 index 000000000..dc62dcbc8 --- /dev/null +++ b/examples/wifi/wps/README.md @@ -0,0 +1,11 @@ +# Wifi WPS Example + +This example shows how to use wps in esp32. + +The wps only works in station mode now. + +* PBC_MODE: Start esp32 and press the wps button on router, Then esp32 will get the ssid&password by wps PBC mode. + +* PIN_MODE: Start esp32, It will enter wps mode and you'll see a pin code showing by COM. Enter this pin code in router and the esp32 can get ssid&password by wps PIN mode. + +More info in the code [wps.c](./main/wps.c). diff --git a/examples/wifi/wps/main/Kconfig.projbuild b/examples/wifi/wps/main/Kconfig.projbuild new file mode 100644 index 000000000..c978d8984 --- /dev/null +++ b/examples/wifi/wps/main/Kconfig.projbuild @@ -0,0 +1,17 @@ +menu "Example Configuration" + +choice EXAMPLE_WPS_TYPE + prompt "WPS mode" + default EXAMPLE_WPS_TYPE_PBC + help + WPS type for the esp32 to use. + +config EXAMPLE_WPS_TYPE_PBC + bool "PBC" +config EXAMPLE_WPS_TYPE_PIN + bool "PIN" +config EXAMPLE_WPS_TYPE_DISABLE + bool "disable" +endchoice + +endmenu diff --git a/examples/wifi/wps/main/component.mk b/examples/wifi/wps/main/component.mk new file mode 100644 index 000000000..7d7b29bfd --- /dev/null +++ b/examples/wifi/wps/main/component.mk @@ -0,0 +1,7 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + + + diff --git a/examples/wifi/wps/main/wps.c b/examples/wifi/wps/main/wps.c new file mode 100644 index 000000000..e68ac0455 --- /dev/null +++ b/examples/wifi/wps/main/wps.c @@ -0,0 +1,100 @@ +/* WiFi Connection Example using WPS + * + * WPS_TYPE_PBC: Start esp32 and it will enter wps PBC mode. Then push the button of wps on router down. The esp32 will connected to the router. + * + * WPS_TYPE_PIN: Start esp32, You'll see PIN code which is a eight-digit number showing on COM. Enter the PIN code in router and then the esp32 will connected to router. + */ +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_wps.h" +#include "esp_event_loop.h" + + +/*set wps mode via "make menuconfig"*/ +#if CONFIG_EXAMPLE_WPS_TYPE_PBC +#define WPS_TEST_MODE WPS_TYPE_PBC +#elif CONFIG_EXAMPLE_WPS_TYPE_PIN +#define WPS_TEST_MODE WPS_TYPE_PIN +#else +#define WPS_TEST_MODE WPS_TYPE_DISABLE +#endif + +#ifndef PIN2STR +#define PIN2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5], (a)[6], (a)[7] +#define PINSTR "%c%c%c%c%c%c%c%c" +#endif + + +static const char *TAG = "example_wps"; + + +static esp_err_t event_handler(void *ctx, system_event_t *event) +{ + switch(event->event_id) { + case SYSTEM_EVENT_STA_START: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_START"); + break; + case SYSTEM_EVENT_STA_GOT_IP: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_GOT_IP"); + ESP_LOGI(TAG, "got ip:%s\n", + ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED"); + ESP_ERROR_CHECK(esp_wifi_connect()); + break; + case SYSTEM_EVENT_STA_WPS_ER_SUCCESS: + /*point: the function esp_wifi_wps_start() only get ssid & password + * and we suggest you call the function esp_wifi_connect() here + * */ + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_SUCCESS"); + ESP_ERROR_CHECK(esp_wifi_wps_disable()); + ESP_ERROR_CHECK(esp_wifi_connect()); + break; + case SYSTEM_EVENT_STA_WPS_ER_FAILED: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_FAILED"); + ESP_ERROR_CHECK(esp_wifi_wps_disable()); + ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TEST_MODE)); + ESP_ERROR_CHECK(esp_wifi_wps_start(0)); + break; + case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_TIMEOUT"); + ESP_ERROR_CHECK(esp_wifi_wps_disable()); + ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TEST_MODE)); + ESP_ERROR_CHECK(esp_wifi_wps_start(0)); + break; + case SYSTEM_EVENT_STA_WPS_ER_PIN: + ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_PIN"); + /*show the PIN code here*/ + ESP_LOGI(TAG, "WPS_PIN = "PINSTR, PIN2STR(event->event_info.sta_er_pin.pin_code)); + break; + default: + break; + } + return ESP_OK; +} + +/*init wifi as sta and start wps*/ +static void start_wps(void) +{ + tcpip_adapter_init(); + ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL)); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); + + ESP_LOGI(TAG, "start wps..."); + //ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TYPE_PBC)); + ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TEST_MODE)); + ESP_ERROR_CHECK(esp_wifi_wps_start(0)); +} + +void app_main() +{ + start_wps(); +}