From b0dd5d9157f538114ac5dc96dee7ec166ec9c4dd Mon Sep 17 00:00:00 2001 From: chenyudong Date: Mon, 27 Mar 2017 17:52:46 +0800 Subject: [PATCH 1/2] example: adding wifi example wps and power save. --- examples/wifi/README.md | 22 ++++ examples/wifi/power_save/Makefile | 9 ++ examples/wifi/power_save/README.md | 11 ++ .../wifi/power_save/main/Kconfig.projbuild | 13 +++ examples/wifi/power_save/main/component.mk | 7 ++ examples/wifi/power_save/main/power_save.c | 69 ++++++++++++ examples/wifi/wps/Makefile | 9 ++ examples/wifi/wps/README.md | 11 ++ examples/wifi/wps/main/component.mk | 7 ++ examples/wifi/wps/main/wps.c | 100 ++++++++++++++++++ 10 files changed, 258 insertions(+) create mode 100644 examples/wifi/power_save/Makefile create mode 100644 examples/wifi/power_save/README.md create mode 100644 examples/wifi/power_save/main/Kconfig.projbuild create mode 100644 examples/wifi/power_save/main/component.mk create mode 100644 examples/wifi/power_save/main/power_save.c create mode 100644 examples/wifi/wps/Makefile create mode 100644 examples/wifi/wps/README.md create mode 100644 examples/wifi/wps/main/component.mk create mode 100644 examples/wifi/wps/main/wps.c diff --git a/examples/wifi/README.md b/examples/wifi/README.md index b0dc683508..21578e9d4e 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 0000000000..6f2f554343 --- /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 0000000000..8ff190c846 --- /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 at full speed. + +* modem sleep: If you set power save mode as modem sleep, after connected to AP about 10s, esp32 will wake up and sleep periodically. When it sleeps, the current will be much lower than it works. + +* 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 0000000000..134f28d7a2 --- /dev/null +++ b/examples/wifi/power_save/main/Kconfig.projbuild @@ -0,0 +1,13 @@ +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. + +endmenu diff --git a/examples/wifi/power_save/main/component.mk b/examples/wifi/power_save/main/component.mk new file mode 100644 index 0000000000..7d7b29bfd4 --- /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 0000000000..837fce3b98 --- /dev/null +++ b/examples/wifi/power_save/main/power_save.c @@ -0,0 +1,69 @@ +/* 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 inter 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 +/* FreeRTOS event group to signal when we are connected & ready to make a request */ +static EventGroupHandle_t wifi_event_group; + +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 pawer save mode*/ +static void wifi_power_save(void) +{ + tcpip_adapter_init(); + wifi_event_group = xEventGroupCreate(); + 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(WIFI_PS_MODEM)."); + esp_wifi_set_ps(WIFI_PS_MODEM); +} + +void app_main() +{ + wifi_power_save(); +} diff --git a/examples/wifi/wps/Makefile b/examples/wifi/wps/Makefile new file mode 100644 index 0000000000..0fbaf22140 --- /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 0000000000..d2f9e2b64f --- /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 push the buttom of wps on router, Then esp32 will get the ssid&password by wps PBC mode. + +* PIN_MODE: Start esp32, It will inter 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/component.mk b/examples/wifi/wps/main/component.mk new file mode 100644 index 0000000000..7d7b29bfd4 --- /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 0000000000..e2a26c523c --- /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 inter wps PBC mode. Then push the buttom 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 here*/ +#define WPS_TEST_MODE WPS_TYPE_PBC +//#define WPS_TEST_MODE WPS_TYPE_PIN +//#define WPS_TEST_MODE WPS_TYPE_MAX + + +#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 + +/* FreeRTOS event group to signal when we are connected & ready to make a request */ +static EventGroupHandle_t wifi_event_group; + +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(); + wifi_event_group = xEventGroupCreate(); + 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(); +} From 38068e6df0342f8726ad2ab1db1b06ac70505908 Mon Sep 17 00:00:00 2001 From: chenyudong Date: Wed, 29 Mar 2017 15:33:05 +0800 Subject: [PATCH 2/2] wps_ps: Add new options to menuconfig, modify README and some explainations. --- examples/wifi/power_save/README.md | 4 +-- .../wifi/power_save/main/Kconfig.projbuild | 16 +++++++++++- examples/wifi/power_save/main/power_save.c | 25 +++++++++++-------- examples/wifi/wps/README.md | 4 +-- examples/wifi/wps/main/Kconfig.projbuild | 17 +++++++++++++ examples/wifi/wps/main/wps.c | 16 ++++++------ 6 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 examples/wifi/wps/main/Kconfig.projbuild diff --git a/examples/wifi/power_save/README.md b/examples/wifi/power_save/README.md index 8ff190c846..0f722584a3 100644 --- a/examples/wifi/power_save/README.md +++ b/examples/wifi/power_save/README.md @@ -4,8 +4,8 @@ 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 at full speed. +* 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, after connected to AP about 10s, esp32 will wake up and sleep periodically. When it sleeps, the current will be much lower than it works. +* 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 index 134f28d7a2..96e28d0b99 100644 --- a/examples/wifi/power_save/main/Kconfig.projbuild +++ b/examples/wifi/power_save/main/Kconfig.projbuild @@ -1,13 +1,27 @@ menu "Example Configuration" - config WIFI_SSID + +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/power_save.c b/examples/wifi/power_save/main/power_save.c index 837fce3b98..8f6139d89c 100644 --- a/examples/wifi/power_save/main/power_save.c +++ b/examples/wifi/power_save/main/power_save.c @@ -2,7 +2,7 @@ * 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 inter power save mode + * start esp32 and when it connected to AP it will enter power save mode */ #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" @@ -13,8 +13,14 @@ /*set the ssid and password via "make menuconfig"*/ #define DEFAULT_SSID CONFIG_WIFI_SSID #define DEFAULT_PWD CONFIG_WIFI_PASSWORD -/* FreeRTOS event group to signal when we are connected & ready to make a request */ -static EventGroupHandle_t wifi_event_group; + +#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"; @@ -25,7 +31,7 @@ static esp_err_t event_handler(void *ctx, system_event_t *event) case SYSTEM_EVENT_STA_START: ESP_LOGI(TAG, "SYSTEM_EVENT_STA_START"); ESP_ERROR_CHECK(esp_wifi_connect()); - break; + break; case SYSTEM_EVENT_STA_GOT_IP: ESP_LOGI(TAG, "SYSTEM_EVENT_STA_GOT_IP"); ESP_LOGI(TAG, "got ip:%s\n", @@ -34,18 +40,17 @@ static esp_err_t event_handler(void *ctx, system_event_t *event) case SYSTEM_EVENT_STA_DISCONNECTED: ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED"); ESP_ERROR_CHECK(esp_wifi_connect()); - break; + break; default: break; } return ESP_OK; } -/*init wifi as sta and set pawer save mode*/ +/*init wifi as sta and set power save mode*/ static void wifi_power_save(void) { tcpip_adapter_init(); - wifi_event_group = xEventGroupCreate(); 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)); @@ -58,9 +63,9 @@ static void wifi_power_save(void) 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(WIFI_PS_MODEM)."); - esp_wifi_set_ps(WIFI_PS_MODEM); + + ESP_LOGI(TAG, "esp_wifi_set_ps()."); + esp_wifi_set_ps(DEFAULT_PS_MODE); } void app_main() diff --git a/examples/wifi/wps/README.md b/examples/wifi/wps/README.md index d2f9e2b64f..dc62dcbc8c 100644 --- a/examples/wifi/wps/README.md +++ b/examples/wifi/wps/README.md @@ -4,8 +4,8 @@ This example shows how to use wps in esp32. The wps only works in station mode now. -* PBC_MODE: Start esp32 and push the buttom of wps on router, Then esp32 will get the ssid&password by wps PBC mode. +* 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 inter 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. +* 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 0000000000..c978d89845 --- /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/wps.c b/examples/wifi/wps/main/wps.c index e2a26c523c..e68ac04556 100644 --- a/examples/wifi/wps/main/wps.c +++ b/examples/wifi/wps/main/wps.c @@ -1,6 +1,6 @@ /* WiFi Connection Example using WPS * - * WPS_TYPE_PBC: Start esp32 and it will inter wps PBC mode. Then push the buttom of wps on router down. The esp32 will connected to the router. + * 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. */ @@ -12,19 +12,20 @@ #include "esp_event_loop.h" -/*set wps mode here*/ +/*set wps mode via "make menuconfig"*/ +#if CONFIG_EXAMPLE_WPS_TYPE_PBC #define WPS_TEST_MODE WPS_TYPE_PBC -//#define WPS_TEST_MODE WPS_TYPE_PIN -//#define WPS_TEST_MODE WPS_TYPE_MAX - +#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 -/* FreeRTOS event group to signal when we are connected & ready to make a request */ -static EventGroupHandle_t wifi_event_group; static const char *TAG = "example_wps"; @@ -79,7 +80,6 @@ static esp_err_t event_handler(void *ctx, system_event_t *event) static void start_wps(void) { tcpip_adapter_init(); - wifi_event_group = xEventGroupCreate(); ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL)); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();