1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-17 04:52:59 +01:00

cpu/esp: implement ESP SoftAP mode

This is an implementation of the ESP32 SoftAP mode using the
`esp_wifi_ap` pseudomodule.

Signed-off-by: Jean Pierre Dudey <jeandudey@hotmail.com>
Co-authored-by: Gunar Schorcht <gunar@schorcht.net>
This commit is contained in:
Jean Pierre Dudey 2020-05-22 08:13:14 -05:00 committed by Jean Pierre Dudey
parent ad45506924
commit 295a3665d2
9 changed files with 279 additions and 28 deletions

View File

@ -49,8 +49,9 @@
8. [Network Interfaces](#esp32_network_interfaces)
1. [Ethernet MAC Network Interface](#esp32_ethernet_network_interface)
2. [WiFi Network Interface](#esp32_wifi_network_interface)
3. [ESP-NOW Network Interface](#esp32_esp_now_network_interface)
4. [Other Network Devices](#esp32_other_network_devices)
3. [WiFi SoftAP Network Interface](#esp32_wifi_ap_network_interface)
4. [ESP-NOW Network Interface](#esp32_esp_now_network_interface)
5. [Other Network Devices](#esp32_other_network_devices)
10. [Application-Specific Configurations](#esp32_application_specific_configurations)
1. [Make Variable ```CONFIGS```](#esp32_config_make_variable)
2. [Application-Specific Board Configuration](#esp32_application_specific_board_configuration)
@ -124,6 +125,7 @@ Module | Default | Short description
[esp_spi_ram](#esp32_spi_ram) | not used | enable SPI RAM
[esp_spiffs](#esp32_spiffs_device) | not used | enable SPIFFS for on-board flash memory
[esp_wifi](#esp32_wifi_network_interface) | not used | enable the Wifi network device in WPA2 personal mode
[esp_wifi_ap](#esp32_wifi_ap_network_interface) | not used | enable the WiFi SoftAP network device
[esp_wifi_enterprise](#esp32_wifi_network_interface) | not used | enable the Wifi network device in WPA2 enterprise mode
</center>
@ -425,6 +427,7 @@ esp_rtc_timer_32k | Enable RTC hardware timer with external 32.768 kHz crystal.
esp_spiffs | Enable the optional SPIFFS drive in on-board flash memory, see section [SPIFFS Device](#esp32_spiffs_device).
esp_spi_ram | Enable the optional SPI RAM, see section [SPI RAM Modules](#esp32_spi_ram).
esp_wifi | Enable the built-in WiFi module as `netdev` network device in WPA2 personal mode, see section [WiFi Network Interface](#esp32_wifi_network_interface).
esp_wifi_ap | Enable the built-in WiFi SoftAP module as `netdev` network device, see section [WiFi SoftAP Network Interface](#esp32_wifi_ap_network_interface).
esp_wifi_enterprise | Enable the built-in WiFi module as `netdev` network device in WPA2 enterprise mode, see section [WiFi Network Interface](#esp32_wifi_network_interface).
</center>
@ -1256,6 +1259,53 @@ In this case the ESP-NOW interface must use the same channel as the AP of the
infrastructure WiFi network. All ESP-NOW nodes must therefore be compiled with
the channel of the AP as value for the parameter 'ESP_NOW_CHANNEL'.
\anchor esp32_wifi_ap_network_interface
## <a name="esp32_wifi_ap_network_interface"> WiFi SoftAP Network Interface </a> &nbsp;[[TOC](#esp32_toc)]
The RIOT port for the ESP32 supports a `netdev` interface for the ESP32 WiFi
SoftAP mode. Module `esp_wifi_ap` has to be enabled to use it.
The following parameters can be configured:
<center>
Parameter | Default | Description
:-------------------------|:--------------------------|:-------------
#ESP_WIFI_SSID | "RIOT_AP" | Static SSID definition for the SoftAP
#ESP_WIFI_AP_PREFIX | "RIOT_AP_" | Optional prefix for dynamic SSID, if used, the node will create the SSID based on the prefix + mac address (e.g.: "RIOT_AP_aabbccddeeff"). This is disabled by default and `ESP_WIFI_SSID` is used, define this to enable the usage of the SSID prefix.
#ESP_WIFI_PASS | none | The password for the WiFi SoftAP network interface. If no password is provided, the interface will be "open", otherwise it uses WPA2-PSK authentication mode.
#ESP_WIFI_SSID_HIDDEN | 0 | Whether the SoftAP SSID should be hidden.
#ESP_WIFI_MAX_CONN | 4 | The maximum number of connections for the SoftAP.
#ESP_WIFI_BEACON_INTERVAL | 100 | The beacon interval time in milliseconds for the SoftAP.
#ESP_WIFI_STACKSIZE | #THREAD_STACKSIZE_DEFAULT | Stack size used for the WiFi netdev driver thread.
</center>
These configuration parameter definitions, as well as enabling the `esp_wifi_ap`
module, can be done either in the makefile of the project or at make command
line, for example:
```
USEMODULE=esp_wifi_ap \
CFLAGS='-DESP_WIFI_SSID=\"MySSID\" -DESP_WIFI_PASS=\"MyPassphrase\" -DESP_WIFI_MAX_CONN=1 \
make -C examples/gnrc_networking BOARD=...
```
@note
- The `esp_wifi_ap` module is not used by default when `netdev_default` is used.
- Supports open and WPA2-PSK authentication modes.
- The ESP-NOW network interface and the WiFi SoftAP network interface can not
be used simultaneously.
@warning
The SoftAP may or may not be at all reliable sometimes, this is a known
problem with the Wi-Fi network interface, even on the official ESP-IDF.
The problem is that the AP doesn't cache multicast data for connected
stations, and if stations connected to the AP are power save enabled,
they may experience multicast packet loss. This affects RIOT, because
NDP relies on multicast packets to work correctly.
Refer to the SDK documentation from Espressif on [AP Sleep](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#ap-sleep) for more information.
\anchor esp32_esp_now_network_interface
## <a name="esp32_esp_now_network_interface"> ESP-NOW Network Interface </a> &nbsp;[[TOC](#esp32_toc)]

View File

@ -29,7 +29,8 @@
8. [Other Peripherals](#esp8266_other_peripherals)
7. [Network Interfaces](#esp8266_network_interfaces)
1. [WiFi Network Interface](#esp8266_wifi_network_interface)
2. [ESP-NOW Network Interface](#esp8266_esp_now_network_interface)
2. [WiFi SoftAP Network Interface](#esp8266_wifi_ap_network_interface)
3. [ESP-NOW Network Interface](#esp8266_esp_now_network_interface)
8. [Preconfigured Devices](#esp8266_preconfigured_devices)
1. [Network Devices](#esp8266_network_devices)
2. [SD-Card Device](#esp8266_sd_card_device)
@ -112,6 +113,7 @@ Module | Default | Short description
[esp_qemu](#esp8266_qemu_mode_and_gdb) | not used | generate image for `QEMU` and `GDB` debugging
[esp_spiffs](#esp8266_spiffs_device) | not used | enable SPIFFS for on-board flash memory
[esp_wifi](#esp8266_wifi_network_interface) | not used | enable the Wifi network device
[esp_wifi_ap](#esp8266_wifi_ap_network_interface) | not used | enable the Wifi SoftAP network device
</center>
@ -418,6 +420,7 @@ Module | Description
[esp_spiffs](#esp8266_spiffs_device) | Enable the SPIFFS drive in on-board flash memory
[esp_sw_timer](#esp8266_timers) | Enable software timer implementation
[esp_wifi](#esp8266_wifi_network_interface) | Enable the built-in WiFi module in infrastructure mode as `netdev` network device
[esp_wifi_ap](#esp8266_wifi_ap_network_interface) | Enable the built-in WiFi SoftAP module as `netdev` network device
</center><br>
@ -714,6 +717,53 @@ In this case the ESP-NOW interface must use the same channel as the AP of the
infrastructure WiFi network. All ESP-NOW nodes must therefore be compiled with
the channel of the AP asvalue for the parameter 'ESP_NOW_CHANNEL'.
\anchor esp8266_wifi_ap_network_interface
## <a name="esp8266_wifi_ap_network_interface"> WiFi SoftAP Network Interface </a> &nbsp;[[TOC](#esp8266_toc)]
The RIOT port for the ESP8266 supports a `netdev` interface for the ESP32 WiFi
SoftAP mode. Module `esp_wifi_ap` has to be enabled to use it.
The following parameters can be configured:
<center>
Parameter | Default | Description
:-------------------------|:--------------------------|:-------------
#ESP_WIFI_SSID | "RIOT_AP" | Static SSID definition for the SoftAP
#ESP_WIFI_AP_PREFIX | "RIOT_AP_" | Optional prefix for dynamic SSID, if used, the node will create the SSID based on the prefix + mac address (e.g.: "RIOT_AP_aabbccddeeff"). This is disabled by default and `ESP_WIFI_SSID` is used, define this to enable the usage of the SSID prefix.
#ESP_WIFI_PASS | none | The password for the WiFi SoftAP network interface. If no password is provided, the interface will be "open", otherwise it uses WPA2-PSK authentication mode.
#ESP_WIFI_SSID_HIDDEN | 0 | Whether the SoftAP SSID should be hidden.
#ESP_WIFI_MAX_CONN | 4 | The maximum number of connections for the SoftAP.
#ESP_WIFI_BEACON_INTERVAL | 100 | The beacon interval time in milliseconds for the SoftAP.
#ESP_WIFI_STACKSIZE | #THREAD_STACKSIZE_DEFAULT | Stack size used for the WiFi netdev driver thread.
</center>
These configuration parameter definitions, as well as enabling the `esp_wifi_ap`
module, can be done either in the makefile of the project or at make command
line, for example:
```
USEMODULE=esp_wifi_ap \
CFLAGS='-DESP_WIFI_SSID=\"MySSID\" -DESP_WIFI_PASS=\"MyPassphrase\" -DESP_WIFI_MAX_CONN=1 \
make -C examples/gnrc_networking BOARD=...
```
@note
- The `esp_wifi_ap` module is not used by default when `netdev_default` is used.
- Supports open and WPA2-PSK authentication modes.
- The ESP-NOW network interface and the WiFi SoftAP network interface can not
be used simultaneously.
@warning
The SoftAP may or may not be at all reliable sometimes, this is a known
problem with the Wi-Fi network interface, even on the official ESP-IDF.
The problem is that the AP doesn't cache multicast data for connected
stations, and if stations connected to the AP are power save enabled,
they may experience multicast packet loss. This affects RIOT, because
NDP relies on multicast packets to work correctly.
Refer to the SDK documentation from Espressif on [AP Sleep](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#ap-sleep) for more information.
\anchor esp8266_esp_now_network_interface
## <a name="esp8266_esp_now_network_interface"> ESP-NOW Network Interface </a> &nbsp;[[TOC](#esp8266_toc)]

View File

@ -15,6 +15,7 @@ config CPU_COMMON_ESP
select HAS_ESP_NOW
select HAS_ESP_SPIFFS
select HAS_ESP_WIFI
select HAS_ESP_WIFI_AP
select HAS_LIBSTDCPP
select HAS_PERIPH_CPUID
select HAS_PERIPH_HWRNG
@ -34,6 +35,11 @@ config HAS_ESP_WIFI
help
Indicates that an ESP WiFi radio is present.
config HAS_ESP_WIFI_AP
bool
help
Indicates that ESP WiFi SoftAP support is present.
config HAS_ESP_NOW
bool
help

View File

@ -24,6 +24,11 @@ USEMODULE += xtensa
FEATURES_REQUIRED += cpp # Vendor code uses C++
ifneq (,$(filter esp_wifi_ap,$(USEMODULE)))
FEATURES_REQUIRED += esp_wifi_ap
USEMODULE += esp_wifi
endif
ifneq (,$(filter esp_wifi_enterprise,$(USEMODULE)))
FEATURES_REQUIRED += esp_wifi_enterprise
USEMODULE += esp_wifi

View File

@ -7,6 +7,7 @@ FEATURES_PROVIDED += arch_esp
FEATURES_PROVIDED += cpp
FEATURES_PROVIDED += esp_now
FEATURES_PROVIDED += esp_spiffs
FEATURES_PROVIDED += esp_wifi_ap
FEATURES_PROVIDED += esp_wifi
FEATURES_PROVIDED += libstdcpp
FEATURES_PROVIDED += periph_cpuid
@ -14,3 +15,6 @@ FEATURES_PROVIDED += periph_hwrng
FEATURES_PROVIDED += periph_pm
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += ssp
FEATURES_CONFLICT += esp_wifi_ap:esp_now
FEATURES_CONFLICT_MSG += "ESP_NOW and ESP_WIFI_AP can not be used at the same time."

View File

@ -14,6 +14,7 @@ PSEUDOMODULES += esp_log_startup
PSEUDOMODULES += esp_qemu
PSEUDOMODULES += esp_spiffs
PSEUDOMODULES += esp_wifi_any
PSEUDOMODULES += esp_wifi_ap
# Common includes

View File

@ -30,7 +30,9 @@
#include "esp_common.h"
#include "esp_attr.h"
#include "esp_event_loop.h"
#ifndef MODULE_ESP_WIFI_AP
#include "esp_now.h"
#endif
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_wifi_internal.h"
@ -60,6 +62,9 @@
#define ESP_WIFI_LOG_ERROR(f, ...) \
LOG_TAG_ERROR("esp_wifi", f "\n", ## __VA_ARGS__)
#define ESP_WIFI_LOG_DEBUG(f, ...) \
LOG_TAG_DEBUG("esp_wifi", f "\n", ## __VA_ARGS__)
#define MAC_STR "%02x:%02x:%02x:%02x:%02x:%02x"
#define MAC_STR_ARG(m) m[0], m[1], m[2], m[3], m[4], m[5]
@ -194,6 +199,7 @@ static int _esp_wifi_tx_cb(esp_aio_t* aio)
*/
int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buf, uint16_t len)
{
(void)wifi_if;
ESP_WIFI_DEBUG("buf=%p len=%u", buf, len);
struct pbuf *pb = _esp_wifi_pbuf_alloc(len);
@ -205,7 +211,7 @@ int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buf, uint16_t len)
}
esp_aio_t aio;
aio.fd = wifi_if;
aio.fd = _esp_wifi_socket;
aio.pbuf = pb->payload;
aio.len = pb->len;
aio.cb = _esp_wifi_tx_cb;
@ -244,7 +250,7 @@ typedef int (*wifi_rxcb_t)(struct esp_aio *aio);
*/
esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn)
{
assert(ifx == ESP_IF_WIFI_STA);
assert(ifx == ESP_IF_WIFI_STA || ifx == ESP_IF_WIFI_AP);
ESP_WIFI_DEBUG("%d %p", ifx, fn);
@ -267,13 +273,16 @@ esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn)
/* now, we have to allocate a new socket and register the function */
_esp_wifi_socket = esp_socket(AF_PACKET, SOCK_RAW, ETH_P_ALL);
const char *ifx_name = "sta0";
if (ifx == ESP_IF_WIFI_AP) {
ifx_name = "ap0";
}
if (_esp_wifi_socket < 0) {
ESP_WIFI_LOG_ERROR("create socket of (AF_PACKET, SOCK_RAW, ETH_P_ALL) error");
return ESP_FAIL;
}
if (esp_ioctl(_esp_wifi_socket, SIOCGIFINDEX, "sta0") < 0) {
ESP_WIFI_LOG_ERROR("bind socket %d to netcard %s error", _esp_wifi_socket, "sta0");
if (esp_ioctl(_esp_wifi_socket, SIOCGIFINDEX, ifx_name) < 0) {
ESP_WIFI_LOG_ERROR("bind socket %d to netcard %s error", _esp_wifi_socket, ifx_name);
esp_close(_esp_wifi_socket);
return ESP_FAIL;
}
@ -366,6 +375,7 @@ esp_err_t _esp_wifi_rx_cb(void *buffer, uint16_t len, void *eb)
return ESP_OK;
}
#ifndef MODULE_ESP_WIFI_AP
#define REASON_BEACON_TIMEOUT (200)
#define REASON_HANDSHAKE_TIMEOUT (204)
#define INDEX_BEACON_TIMEOUT (REASON_BEACON_TIMEOUT - 24)
@ -401,6 +411,7 @@ static const char *_esp_wifi_disc_reasons [] = {
"ASSOC_FAIL", /* 203 */
"HANDSHAKE_TIMEOUT" /* 204 */
};
#endif /* MODULE_ESP_WIFI_AP */
/* indicator whether the WiFi interface is started */
static unsigned _esp_wifi_started = 0;
@ -415,12 +426,47 @@ static esp_err_t IRAM_ATTR _esp_system_event_handler(void *ctx, system_event_t *
{
assert(event != NULL);
#ifndef MODULE_ESP_WIFI_AP
esp_err_t result;
uint8_t reason;
const char* reason_str = "UNKNOWN";
#endif /* MODULE_ESP_WIFI_AP */
switch(event->event_id) {
switch (event->event_id) {
#ifdef MODULE_ESP_WIFI_AP
case SYSTEM_EVENT_AP_START:
_esp_wifi_started = 1;
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, _esp_wifi_rx_cb);
ESP_WIFI_DEBUG("WiFi started");
break;
case SYSTEM_EVENT_AP_STOP:
_esp_wifi_started = 0;
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, NULL);
ESP_WIFI_DEBUG("WiFi stopped");
break;
case SYSTEM_EVENT_AP_STACONNECTED:
_esp_wifi_dev.sta_connected += 1;
ESP_WIFI_LOG_INFO("Station "MAC_STR" join (AID=%d)",
MAC_STR_ARG(event->event_info.sta_connected.mac),
event->event_info.sta_connected.aid);
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
_esp_wifi_dev.sta_connected -= 1;
ESP_WIFI_LOG_INFO("Station "MAC_STR" leave (AID=%d)",
MAC_STR_ARG(event->event_info.sta_disconnected.mac),
event->event_info.sta_disconnected.aid);
break;
case SYSTEM_EVENT_AP_PROBEREQRECVED:
ESP_WIFI_LOG_DEBUG("Station "MAC_STR" probed (rssi=%d)",
MAC_STR_ARG(event->event_info.ap_probereqrecved.mac),
event->event_info.ap_probereqrecved.rssi);
break;
#else /* MODULE_ESP_WIFI_AP */
case SYSTEM_EVENT_STA_START:
_esp_wifi_started = 1;
ESP_WIFI_DEBUG("WiFi started");
@ -494,6 +540,7 @@ static esp_err_t IRAM_ATTR _esp_system_event_handler(void *ctx, system_event_t *
}
break;
#endif /* MODULE_ESP_WIFI_AP */
default:
ESP_WIFI_DEBUG("event %d", event->event_id);
@ -516,11 +563,19 @@ static int _esp_wifi_send(netdev_t *netdev, const iolist_t *iolist)
esp_wifi_netdev_t* dev = (esp_wifi_netdev_t*)netdev;
#ifdef MODULE_ESP_WIFI_AP
if (_esp_wifi_dev.sta_connected == 0) {
ESP_WIFI_DEBUG("No STAs are connected to SoftAP, cannot send");
_esp_wifi_send_is_in = false;
return -ENODEV;
}
#else /* MODULE_ESP_WIFI_AP */
if (!_esp_wifi_dev.connected) {
ESP_WIFI_DEBUG("WiFi is still not connected to AP, cannot send");
_esp_wifi_send_is_in = false;
return -ENODEV;
}
#endif /* MODULE_ESP_WIFI_AP */
critical_enter();
dev->tx_len = 0;
@ -546,8 +601,12 @@ static int _esp_wifi_send(netdev_t *netdev, const iolist_t *iolist)
#endif
critical_exit();
#ifdef MODULE_ESP_WIFI_AP
if (esp_wifi_internal_tx(ESP_IF_WIFI_AP, dev->tx_buf, dev->tx_len) == ESP_OK) {
#else /* MODULE_ESP_WIFI_AP */
/* send the the packet to the peer(s) mac address */
if (esp_wifi_internal_tx(ESP_IF_WIFI_STA, dev->tx_buf, dev->tx_len) == ESP_OK) {
#endif
#ifdef MCU_ESP32
/* for ESP8266 it is done in _esp_wifi_tx_cb */
_esp_wifi_send_is_in = false;
@ -626,7 +685,9 @@ static int _esp_wifi_get(netdev_t *netdev, netopt_t opt, void *val, size_t max_l
assert(netdev != NULL);
assert(val != NULL);
#ifndef MODULE_ESP_WIFI_AP
esp_wifi_netdev_t* dev = (esp_wifi_netdev_t*)netdev;
#endif /* MODULE_ESP_WIFI_AP */
switch (opt) {
case NETOPT_IS_WIRED:
@ -637,12 +698,21 @@ static int _esp_wifi_get(netdev_t *netdev, netopt_t opt, void *val, size_t max_l
return sizeof(uint16_t);
case NETOPT_ADDRESS:
assert(max_len >= ETHERNET_ADDR_LEN);
esp_wifi_get_mac(ESP_MAC_WIFI_STA,(uint8_t *)val);
#ifdef MODULE_ESP_WIFI_AP
esp_wifi_get_mac(ESP_MAC_WIFI_SOFTAP, (uint8_t *)val);
#else /* MODULE_ESP_WIFI_AP */
esp_wifi_get_mac(ESP_MAC_WIFI_STA, (uint8_t *)val);
#endif /* MODULE_ESP_WIFI_AP */
return ETHERNET_ADDR_LEN;
case NETOPT_LINK:
assert(max_len == sizeof(netopt_enable_t));
#ifdef MODULE_ESP_WIFI_AP
*((netopt_enable_t *)val) = (_esp_wifi_started) ? NETOPT_ENABLE
: NETOPT_DISABLE;
#else /* MOUDLE_ESP_WIFI_AP */
*((netopt_enable_t *)val) = (dev->connected) ? NETOPT_ENABLE
: NETOPT_DISABLE;
#endif /* MODULE_ESP_WIFI_AP */
return sizeof(netopt_enable_t);
default:
return netdev_eth_get(netdev, opt, val, max_len);
@ -659,7 +729,11 @@ static int _esp_wifi_set(netdev_t *netdev, netopt_t opt, const void *val, size_t
switch (opt) {
case NETOPT_ADDRESS:
assert(max_len == ETHERNET_ADDR_LEN);
#ifdef MODULE_ESP_WIFI_AP
esp_wifi_set_mac(ESP_MAC_WIFI_SOFTAP, (uint8_t *)val);
#else /* MODULE_ESP_WIFI_AP */
esp_wifi_set_mac(ESP_MAC_WIFI_STA, (uint8_t *)val);
#endif /* MODULE_ESP_WIFI_AP */
return ETHERNET_ADDR_LEN;
default:
return netdev_eth_set(netdev, opt, val, max_len);
@ -678,6 +752,7 @@ static void _esp_wifi_isr(netdev_t *netdev)
dev->event_recv--;
dev->netdev.event_callback(netdev, NETDEV_EVENT_RX_COMPLETE);
}
#ifndef MODULE_ESP_WIFI_AP
if (dev->event_conn) {
dev->event_conn--;
dev->netdev.event_callback(netdev, NETDEV_EVENT_LINK_UP);
@ -686,6 +761,7 @@ static void _esp_wifi_isr(netdev_t *netdev)
dev->event_disc--;
dev->netdev.event_callback(netdev, NETDEV_EVENT_LINK_DOWN);
}
#endif
return;
}
@ -707,6 +783,7 @@ static const netdev_driver_t _esp_wifi_driver =
.set = _esp_wifi_set,
};
#ifndef MODULE_ESP_WIFI_AP
/*
* Static configuration for the Station interface
*/
@ -729,8 +806,9 @@ static wifi_config_t wifi_config_sta = {
#endif
}
};
#endif /* MODULE_ESP_WIFI_AP */
#if defined(MCU_ESP8266) && !defined(MODULE_ESP_NOW)
#if (defined(MCU_ESP8266) && !defined(MODULE_ESP_NOW)) || defined(MODULE_ESP_WIFI_AP)
/**
* Static configuration for the SoftAP interface if ESP-NOW is not enabled.
*
@ -750,20 +828,28 @@ static wifi_config_t wifi_config_sta = {
*/
static wifi_config_t wifi_config_ap = {
.ap = {
#ifdef ESP_WIFI_SSID
.ssid = ESP_WIFI_SSID,
.ssid_len = ARRAY_SIZE(ESP_WIFI_SSID),
.ssid_hidden = 1, /* don't make the AP visible */
.ssid_len = ARRAY_SIZE(ESP_WIFI_SSID) - 1,
#endif
#ifdef ESP_WIFI_PASS
.password = ESP_WIFI_PASS,
.authmode = WIFI_AUTH_WPA2_PSK,
#else
.authmode = WIFI_AUTH_OPEN,
#endif
.max_connection = 0, /* don't allow connections */
.beacon_interval = 60000, /* send beacon only every 60 s */
#ifdef MODULE_ESP_WIFI_AP
.ssid_hidden = ESP_WIFI_SSID_HIDDEN, /* don't make the AP visible */
.max_connection = ESP_WIFI_MAX_CONN, /* maximum number of connections */
.beacon_interval = ESP_WIFI_BEACON_INTERVAL,
#else
.ssid_hidden = 1,
.max_connection = 0, /* don't allow connections */
.beacon_interval = 60000, /* send beacon only every 60 s */
#endif
}
};
#endif /* defined(MCU_ESP8266) && !defined(MODULE_ESP_NOW) */
#endif /* (defined(MCU_ESP8266) && !defined(MODULE_ESP_NOW)) || defined(MODULE_ESP_WIFI_AP) */
void esp_wifi_setup (esp_wifi_netdev_t* dev)
{
@ -808,7 +894,10 @@ void esp_wifi_setup (esp_wifi_netdev_t* dev)
/* TODO */
#endif
#ifdef MCU_ESP8266
#ifdef MODULE_ESP_WIFI_AP
/* Activate the SoftAP interface */
result = esp_wifi_set_mode(WIFI_MODE_AP);
#elif defined(MCU_ESP8266)
/*
* Although only the Station interface is needed, the SoftAP interface must
* also be enabled on ESP8266 for stability reasons to prevent the Station
@ -818,34 +907,43 @@ void esp_wifi_setup (esp_wifi_netdev_t* dev)
*/
/* activate the Station and the SoftAP interface */
result = esp_wifi_set_mode(WIFI_MODE_APSTA);
#else /* MCU_ESP8266 */
#else /* defined(MCU_ESP8266) */
/* activate only the Station interface */
result = esp_wifi_set_mode(WIFI_MODE_STA);
#endif /* MCU_ESP8266 */
#endif /* defined(MCU_ESP8266) */
if (result != ESP_OK) {
ESP_WIFI_LOG_ERROR("esp_wifi_set_mode failed with return value %d", result);
return;
}
#ifdef MCU_ESP8266
#if defined(MCU_ESP8266) || defined(MODULE_ESP_WIFI_AP)
#ifdef ESP_WIFI_AP_PREFIX
uint8_t mac[ETHERNET_ADDR_LEN];
esp_wifi_get_mac(ESP_MAC_WIFI_SOFTAP, mac);
sprintf((char*)wifi_config_ap.ap.ssid, "%s%02x%02x%02x%02x%02x%02x",
ESP_WIFI_AP_PREFIX, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
wifi_config_ap.ap.ssid_len = strlen((char*)wifi_config_ap.ap.ssid);
#endif /* ESP_WIFI_AP_PREFIX */
/* set the SoftAP configuration */
result = esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config_ap);
if (result != ESP_OK) {
ESP_WIFI_LOG_ERROR("esp_wifi_set_config softap failed with return value %d", result);
return;
}
#endif /* MCU_ESP8266 */
#endif /* defined(MCU_ESP8266) || defined(MODULE_ESP_WIFI_AP) */
#endif /* MODULE_ESP_NOW */
#ifndef MODULE_ESP_WIFI_AP
/* set the Station configuration */
result = esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config_sta);
if (result != ESP_OK) {
ESP_WIFI_LOG_ERROR("esp_wifi_set_config station failed with return value %d", result);
return;
}
#endif /* MODULE_ESP_WIFI_AP */
#ifdef MODULE_ESP_WIFI_ENTERPRISE
#if defined(MODULE_ESP_WIFI_ENTERPRISE) && !defined(MODULE_ESP_WIFI_AP)
esp_wpa2_config_t wifi_config_wpa2 = WPA2_CONFIG_INIT_DEFAULT();
#ifdef ESP_WIFI_EAP_ID
@ -864,7 +962,7 @@ void esp_wifi_setup (esp_wifi_netdev_t* dev)
and the password for EAP phase 2 authentication in esp_wifi_enterprise
#endif /* defined(ESP_WIFI_EAP_USER) && defined(ESP_WIFI_EAP_PASS) */
esp_wifi_sta_wpa2_ent_enable(&wifi_config_wpa2);
#endif /* MODULE_ESP_WIFI_ENTERPRISE */
#endif /* defined(MODULE_ESP_WIFI_ENTERPRISE) && !defined(MODULE_ESP_WIFI_AP) */
/* start the WiFi driver */
result = esp_wifi_start();
@ -873,17 +971,18 @@ void esp_wifi_setup (esp_wifi_netdev_t* dev)
return;
}
/* register RX callback function */
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, _esp_wifi_rx_cb);
/* set the netdev driver */
dev->netdev.driver = &_esp_wifi_driver;
/* initialize netdev data structure */
dev->connected = false;
dev->event_recv = 0;
#ifdef MODULE_ESP_WIFI_AP
dev->sta_connected = 0;
#else /* MODULE_ESP_WIFI_AP */
dev->event_conn = 0;
dev->event_disc = 0;
dev->connected = false;
#endif /* MODULE_ESP_WIFI_AP */
}
#endif /* MODULE_ESP_WIFI */

View File

@ -56,10 +56,14 @@ typedef struct
uint8_t tx_buf[ETHERNET_MAX_LEN]; /**< transmit buffer */
uint8_t event_recv; /**< number of frame received events */
#ifdef MODULE_ESP_WIFI_AP
uint8_t sta_connected; /**< number of connected stations */
#else /* MODULE_ESP_WIFI_AP */
uint8_t event_conn; /**< number of pending connect events */
uint8_t event_disc; /**< number of pending disc events */
bool connected; /**< indicates whether connected to AP */
#endif /* MODULE_ESP_WIFI_AP */
mutex_t dev_lock; /**< device is already in use */

View File

@ -44,10 +44,17 @@
/**
* @brief SSID of the AP to be used.
*/
#ifndef ESP_WIFI_SSID
#if !defined(ESP_WIFI_SSID) && !defined(ESP_WIFI_AP_PREFIX)
#define ESP_WIFI_SSID "RIOT_AP"
#endif
/**
* @brief Prefix to be used as part of the SSID (e.g.: RIOT_AP_aabbccddeeff)
*/
#if !defined(ESP_WIFI_SSID) && !defined(ESP_WIFI_AP_PREFIX) || defined(DOXYGEN)
#define ESP_WIFI_AP_PREFIX "RIOT_AP_"
#endif
/**
* @brief Passphrase used for the AP as clear text (max. 64 chars).
*/
@ -55,6 +62,31 @@
#define ESP_WIFI_PASS "ThisistheRIOTporttoESP"
#endif
#if defined(MODULE_ESP_WIFI_AP) || defined(DOXYGEN)
/**
* @brief Whether SoftAP SSID should be hidden.
*/
#ifndef ESP_WIFI_SSID_HIDDEN
#define ESP_WIFI_SSID_HIDDEN (0)
#endif
/**
* @brief WiFi SoftAP maximum connections (max. 4).
*/
#ifndef ESP_WIFI_MAX_CONN
#define ESP_WIFI_MAX_CONN (4)
#endif
/**
* @brief WiFi SoftAP beacon interval, in milliseconds.
*/
#ifndef ESP_WIFI_BEACON_INTERVAL
#define ESP_WIFI_BEACON_INTERVAL (100)
#endif
#endif /* defined(ESP_WIFI_AP) || defined(DOXYGEN) */
/**@}*/
#ifdef __cplusplus