4#ifdef USE_ESP32_FRAMEWORK_ARDUINO
11#ifdef USE_WIFI_WPA2_EAP
12#include <esp_eap_client.h>
16#include "dhcpserver/dhcpserver.h"
19#include "lwip/apps/sntp.h"
32static const char *
const TAG =
"wifi_esp32";
34static esp_netif_t *s_sta_netif =
nullptr;
36static esp_netif_t *s_ap_netif =
nullptr;
39static bool s_sta_connecting =
false;
49 WiFi.persistent(
false);
55 wifi_mode_t current_mode = WiFiClass::getMode();
56 bool current_sta = current_mode == WIFI_MODE_STA || current_mode == WIFI_MODE_APSTA;
57 bool current_ap = current_mode == WIFI_MODE_AP || current_mode == WIFI_MODE_APSTA;
64 set_mode = WIFI_MODE_APSTA;
66 set_mode = WIFI_MODE_STA;
68 set_mode = WIFI_MODE_AP;
70 set_mode = WIFI_MODE_NULL;
73 if (current_mode == set_mode)
77 ESP_LOGV(TAG,
"Enabling STA");
78 }
else if (!
set_sta && current_sta) {
79 ESP_LOGV(TAG,
"Disabling STA");
81 if (
set_ap && !current_ap) {
82 ESP_LOGV(TAG,
"Enabling AP");
83 }
else if (!
set_ap && current_ap) {
84 ESP_LOGV(TAG,
"Disabling AP");
87 bool ret = WiFiClass::mode(set_mode);
90 ESP_LOGW(TAG,
"Setting mode failed");
100 s_ap_netif = esp_netif_get_handle_from_ifkey(
"WIFI_AP_DEF");
110 WiFi.setAutoReconnect(
false);
116 int8_t
val =
static_cast<int8_t
>(output_power * 4);
117 return esp_wifi_set_max_tx_power(
val) == ESP_OK;
121 wifi_ps_type_t power_save;
124 power_save = WIFI_PS_MIN_MODEM;
127 power_save = WIFI_PS_MAX_MODEM;
131 power_save = WIFI_PS_NONE;
134 return esp_wifi_set_ps(power_save) == ESP_OK;
144 memset(&conf, 0,
sizeof(conf));
145 if (ap.
get_ssid().size() >
sizeof(conf.sta.ssid)) {
146 ESP_LOGE(TAG,
"SSID too long");
149 if (ap.
get_password().size() >
sizeof(conf.sta.password)) {
150 ESP_LOGE(TAG,
"Password too long");
153 memcpy(
reinterpret_cast<char *
>(conf.sta.ssid), ap.
get_ssid().c_str(), ap.
get_ssid().size());
158 conf.sta.threshold.authmode = WIFI_AUTH_OPEN;
160 conf.sta.threshold.authmode = WIFI_AUTH_WPA_WPA2_PSK;
163#ifdef USE_WIFI_WPA2_EAP
164 if (ap.
get_eap().has_value()) {
165 conf.sta.threshold.authmode = WIFI_AUTH_WPA2_ENTERPRISE;
170 conf.sta.bssid_set =
true;
171 memcpy(conf.sta.bssid, ap.
get_bssid()->data(), 6);
173 conf.sta.bssid_set =
false;
177 conf.sta.scan_method = WIFI_FAST_SCAN;
179 conf.sta.scan_method = WIFI_ALL_CHANNEL_SCAN;
183 conf.sta.listen_interval = 0;
187 conf.sta.pmf_cfg.capable =
true;
188 conf.sta.pmf_cfg.required =
false;
192 conf.sta.threshold.rssi = -127;
194 conf.sta.threshold.authmode = WIFI_AUTH_OPEN;
196 wifi_config_t current_conf;
198 err = esp_wifi_get_config(WIFI_IF_STA, ¤t_conf);
200 ESP_LOGW(TAG,
"esp_wifi_get_config failed: %s", esp_err_to_name(err));
204 if (memcmp(¤t_conf, &conf,
sizeof(wifi_config_t)) != 0) {
205 err = esp_wifi_disconnect();
207 ESP_LOGV(TAG,
"esp_wifi_disconnect failed: %s", esp_err_to_name(err));
212 err = esp_wifi_set_config(WIFI_IF_STA, &conf);
214 ESP_LOGV(TAG,
"esp_wifi_set_config failed: %s", esp_err_to_name(err));
223#ifdef USE_WIFI_WPA2_EAP
224 if (ap.
get_eap().has_value()) {
227 err = esp_eap_client_set_identity((uint8_t *) eap.
identity.c_str(), eap.
identity.length());
229 ESP_LOGV(TAG,
"esp_eap_client_set_identity failed: %d", err);
231 int ca_cert_len = strlen(eap.
ca_cert);
235 err = esp_eap_client_set_ca_cert((uint8_t *) eap.
ca_cert, ca_cert_len + 1);
237 ESP_LOGV(TAG,
"esp_eap_client_set_ca_cert failed: %d", err);
242 if (client_cert_len && client_key_len) {
244 err = esp_eap_client_set_certificate_and_key((uint8_t *) eap.
client_cert, client_cert_len + 1,
245 (uint8_t *) eap.
client_key, client_key_len + 1,
248 ESP_LOGV(TAG,
"esp_eap_client_set_certificate_and_key failed: %d", err);
252 err = esp_eap_client_set_username((uint8_t *) eap.
username.c_str(), eap.
username.length());
254 ESP_LOGV(TAG,
"esp_eap_client_set_username failed: %d", err);
256 err = esp_eap_client_set_password((uint8_t *) eap.
password.c_str(), eap.
password.length());
258 ESP_LOGV(TAG,
"esp_eap_client_set_password failed: %d", err);
261 err = esp_wifi_sta_enterprise_enable();
263 ESP_LOGV(TAG,
"esp_wifi_sta_enterprise_enable failed: %d", err);
270 s_sta_connecting =
true;
272 err = esp_wifi_connect();
274 ESP_LOGW(TAG,
"esp_wifi_connect failed: %s", esp_err_to_name(err));
287 if (s_sta_netif ==
nullptr) {
288 ESP_LOGW(TAG,
"STA interface not initialized");
292 esp_netif_dhcp_status_t dhcp_status;
293 esp_err_t err = esp_netif_dhcpc_get_status(s_sta_netif, &dhcp_status);
295 ESP_LOGV(TAG,
"esp_netif_dhcpc_get_status failed: %s", esp_err_to_name(err));
308 sntp_servermode_dhcp(
false);
312 if (dhcp_status != ESP_NETIF_DHCP_STARTED) {
313 err = esp_netif_dhcpc_start(s_sta_netif);
315 ESP_LOGV(TAG,
"Starting DHCP client failed: %d", err);
317 return err == ESP_OK;
322 esp_netif_ip_info_t info;
323 info.ip = manual_ip->static_ip;
324 info.gw = manual_ip->gateway;
325 info.netmask = manual_ip->subnet;
326 err = esp_netif_dhcpc_stop(s_sta_netif);
327 if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) {
328 ESP_LOGV(TAG,
"Stopping DHCP client failed: %s", esp_err_to_name(err));
331 err = esp_netif_set_ip_info(s_sta_netif, &info);
333 ESP_LOGV(TAG,
"Setting manual IP info failed: %s", esp_err_to_name(err));
336 esp_netif_dns_info_t dns;
337 if (manual_ip->dns1.is_set()) {
338 dns.ip = manual_ip->dns1;
339 esp_netif_set_dns_info(s_sta_netif, ESP_NETIF_DNS_MAIN, &dns);
341 if (manual_ip->dns2.is_set()) {
342 dns.ip = manual_ip->dns2;
343 esp_netif_set_dns_info(s_sta_netif, ESP_NETIF_DNS_BACKUP, &dns);
353 esp_netif_ip_info_t ip;
354 esp_err_t err = esp_netif_get_ip_info(s_sta_netif, &ip);
356 ESP_LOGV(TAG,
"esp_netif_get_ip_info failed: %s", esp_err_to_name(err));
363 struct esp_ip6_addr if_ip6s[CONFIG_LWIP_IPV6_NUM_ADDRESSES];
365 count = esp_netif_get_all_ip6(s_sta_netif, if_ip6s);
366 assert(count <= CONFIG_LWIP_IPV6_NUM_ADDRESSES);
367 for (
int i = 0; i < count; i++) {
384 case WIFI_AUTH_WPA_PSK:
386 case WIFI_AUTH_WPA2_PSK:
388 case WIFI_AUTH_WPA_WPA2_PSK:
389 return "WPA/WPA2 PSK";
390 case WIFI_AUTH_WPA2_ENTERPRISE:
391 return "WPA2 Enterprise";
392 case WIFI_AUTH_WPA3_PSK:
394 case WIFI_AUTH_WPA2_WPA3_PSK:
395 return "WPA2/WPA3 PSK";
396 case WIFI_AUTH_WAPI_PSK:
407 sprintf(buf,
"%u.%u.%u.%u", uint8_t(ip.addr >> 0), uint8_t(ip.addr >> 8), uint8_t(ip.addr >> 16),
408 uint8_t(ip.addr >> 24));
427 case WIFI_REASON_AUTH_EXPIRE:
428 return "Auth Expired";
429 case WIFI_REASON_AUTH_LEAVE:
431 case WIFI_REASON_ASSOC_EXPIRE:
432 return "Association Expired";
433 case WIFI_REASON_ASSOC_TOOMANY:
434 return "Too Many Associations";
435 case WIFI_REASON_NOT_AUTHED:
436 return "Not Authenticated";
437 case WIFI_REASON_NOT_ASSOCED:
438 return "Not Associated";
439 case WIFI_REASON_ASSOC_LEAVE:
440 return "Association Leave";
441 case WIFI_REASON_ASSOC_NOT_AUTHED:
442 return "Association not Authenticated";
443 case WIFI_REASON_DISASSOC_PWRCAP_BAD:
444 return "Disassociate Power Cap Bad";
445 case WIFI_REASON_DISASSOC_SUPCHAN_BAD:
446 return "Disassociate Supported Channel Bad";
447 case WIFI_REASON_IE_INVALID:
449 case WIFI_REASON_MIC_FAILURE:
450 return "Mic Failure";
451 case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT:
452 return "4-Way Handshake Timeout";
453 case WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT:
454 return "Group Key Update Timeout";
455 case WIFI_REASON_IE_IN_4WAY_DIFFERS:
456 return "IE In 4-Way Handshake Differs";
457 case WIFI_REASON_GROUP_CIPHER_INVALID:
458 return "Group Cipher Invalid";
459 case WIFI_REASON_PAIRWISE_CIPHER_INVALID:
460 return "Pairwise Cipher Invalid";
461 case WIFI_REASON_AKMP_INVALID:
462 return "AKMP Invalid";
463 case WIFI_REASON_UNSUPP_RSN_IE_VERSION:
464 return "Unsupported RSN IE version";
465 case WIFI_REASON_INVALID_RSN_IE_CAP:
466 return "Invalid RSN IE Cap";
467 case WIFI_REASON_802_1X_AUTH_FAILED:
468 return "802.1x Authentication Failed";
469 case WIFI_REASON_CIPHER_SUITE_REJECTED:
470 return "Cipher Suite Rejected";
471 case WIFI_REASON_BEACON_TIMEOUT:
472 return "Beacon Timeout";
473 case WIFI_REASON_NO_AP_FOUND:
474 return "AP Not Found";
475 case WIFI_REASON_AUTH_FAIL:
476 return "Authentication Failed";
477 case WIFI_REASON_ASSOC_FAIL:
478 return "Association Failed";
479 case WIFI_REASON_HANDSHAKE_TIMEOUT:
480 return "Handshake Failed";
481 case WIFI_REASON_CONNECTION_FAIL:
482 return "Connection Failed";
483 case WIFI_REASON_AP_TSF_RESET:
484 return "AP TSF reset";
485 case WIFI_REASON_ROAMING:
486 return "Station Roaming";
487 case WIFI_REASON_ASSOC_COMEBACK_TIME_TOO_LONG:
488 return "Association comeback time too long";
489 case WIFI_REASON_SA_QUERY_TIMEOUT:
490 return "SA query timeout";
491 case WIFI_REASON_NO_AP_FOUND_W_COMPATIBLE_SECURITY:
492 return "No AP found with compatible security";
493 case WIFI_REASON_NO_AP_FOUND_IN_AUTHMODE_THRESHOLD:
494 return "No AP found in auth mode threshold";
495 case WIFI_REASON_NO_AP_FOUND_IN_RSSI_THRESHOLD:
496 return "No AP found in RSSI threshold";
497 case WIFI_REASON_UNSPECIFIED:
499 return "Unspecified";
505#define ESPHOME_EVENT_ID_WIFI_READY ARDUINO_EVENT_WIFI_READY
506#define ESPHOME_EVENT_ID_WIFI_SCAN_DONE ARDUINO_EVENT_WIFI_SCAN_DONE
507#define ESPHOME_EVENT_ID_WIFI_STA_START ARDUINO_EVENT_WIFI_STA_START
508#define ESPHOME_EVENT_ID_WIFI_STA_STOP ARDUINO_EVENT_WIFI_STA_STOP
509#define ESPHOME_EVENT_ID_WIFI_STA_CONNECTED ARDUINO_EVENT_WIFI_STA_CONNECTED
510#define ESPHOME_EVENT_ID_WIFI_STA_DISCONNECTED ARDUINO_EVENT_WIFI_STA_DISCONNECTED
511#define ESPHOME_EVENT_ID_WIFI_STA_AUTHMODE_CHANGE ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE
512#define ESPHOME_EVENT_ID_WIFI_STA_GOT_IP ARDUINO_EVENT_WIFI_STA_GOT_IP
513#define ESPHOME_EVENT_ID_WIFI_STA_GOT_IP6 ARDUINO_EVENT_WIFI_STA_GOT_IP6
514#define ESPHOME_EVENT_ID_WIFI_STA_LOST_IP ARDUINO_EVENT_WIFI_STA_LOST_IP
515#define ESPHOME_EVENT_ID_WIFI_AP_START ARDUINO_EVENT_WIFI_AP_START
516#define ESPHOME_EVENT_ID_WIFI_AP_STOP ARDUINO_EVENT_WIFI_AP_STOP
517#define ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED ARDUINO_EVENT_WIFI_AP_STACONNECTED
518#define ESPHOME_EVENT_ID_WIFI_AP_STADISCONNECTED ARDUINO_EVENT_WIFI_AP_STADISCONNECTED
519#define ESPHOME_EVENT_ID_WIFI_AP_STAIPASSIGNED ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED
520#define ESPHOME_EVENT_ID_WIFI_AP_PROBEREQRECVED ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED
521#define ESPHOME_EVENT_ID_WIFI_AP_GOT_IP6 ARDUINO_EVENT_WIFI_AP_GOT_IP6
527 case ESPHOME_EVENT_ID_WIFI_READY: {
528 ESP_LOGV(TAG,
"Ready");
531 case ESPHOME_EVENT_ID_WIFI_SCAN_DONE: {
532 auto it = info.wifi_scan_done;
533 ESP_LOGV(TAG,
"Scan done: status=%u number=%u scan_id=%u", it.status, it.number, it.scan_id);
538 case ESPHOME_EVENT_ID_WIFI_STA_START: {
539 ESP_LOGV(TAG,
"STA start");
541 s_sta_netif = esp_netif_get_handle_from_ifkey(
"WIFI_STA_DEF");
542 esp_err_t err = esp_netif_set_hostname(s_sta_netif,
App.
get_name().c_str());
544 ESP_LOGW(TAG,
"esp_netif_set_hostname failed: %s", esp_err_to_name(err));
548 case ESPHOME_EVENT_ID_WIFI_STA_STOP: {
549 ESP_LOGV(TAG,
"STA stop");
551 s_sta_netif =
nullptr;
554 case ESPHOME_EVENT_ID_WIFI_STA_CONNECTED: {
555 auto it = info.wifi_sta_connected;
557 memcpy(buf, it.ssid, it.ssid_len);
558 buf[it.ssid_len] =
'\0';
559 ESP_LOGV(TAG,
"Connected ssid='%s' bssid=" LOG_SECRET(
"%s")
" channel=%u, authmode=%s", buf,
567 case ESPHOME_EVENT_ID_WIFI_STA_DISCONNECTED: {
568 auto it = info.wifi_sta_disconnected;
570 memcpy(buf, it.ssid, it.ssid_len);
571 buf[it.ssid_len] =
'\0';
572 if (it.reason == WIFI_REASON_NO_AP_FOUND) {
573 ESP_LOGW(TAG,
"Disconnected ssid='%s' reason='Probe Request Unsuccessful'", buf);
575 ESP_LOGW(TAG,
"Disconnected ssid='%s' bssid=" LOG_SECRET(
"%s")
" reason='%s'", buf,
579 uint8_t reason = it.reason;
580 if (reason == WIFI_REASON_AUTH_EXPIRE || reason == WIFI_REASON_BEACON_TIMEOUT ||
581 reason == WIFI_REASON_NO_AP_FOUND || reason == WIFI_REASON_ASSOC_FAIL ||
582 reason == WIFI_REASON_HANDSHAKE_TIMEOUT) {
583 err_t err = esp_wifi_disconnect();
585 ESP_LOGV(TAG,
"Disconnect failed: %s", esp_err_to_name(err));
590 s_sta_connecting =
false;
593 case ESPHOME_EVENT_ID_WIFI_STA_AUTHMODE_CHANGE: {
594 auto it = info.wifi_sta_authmode_change;
598 if (it.old_mode != WIFI_AUTH_OPEN && it.new_mode == WIFI_AUTH_OPEN) {
599 ESP_LOGW(TAG,
"Potential Authmode downgrade detected, disconnecting");
602 err_t err = esp_wifi_disconnect();
604 ESP_LOGW(TAG,
"Disconnect failed: %s", esp_err_to_name(err));
610 case ESPHOME_EVENT_ID_WIFI_STA_GOT_IP: {
611 auto it = info.got_ip.ip_info;
617 s_sta_connecting =
false;
622 case ESPHOME_EVENT_ID_WIFI_STA_GOT_IP6: {
623 auto it = info.got_ip6.ip6_info;
624 ESP_LOGV(TAG,
"IPv6 address=" IPV6STR, IPV62STR(it.ip));
630 case ESPHOME_EVENT_ID_WIFI_STA_LOST_IP: {
631 ESP_LOGV(TAG,
"Lost IP");
635 case ESPHOME_EVENT_ID_WIFI_AP_START: {
636 ESP_LOGV(TAG,
"AP start");
639 case ESPHOME_EVENT_ID_WIFI_AP_STOP: {
640 ESP_LOGV(TAG,
"AP stop");
643 s_ap_netif =
nullptr;
647 case ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED: {
648 auto it = info.wifi_sta_connected;
649 auto &mac = it.bssid;
653 case ESPHOME_EVENT_ID_WIFI_AP_STADISCONNECTED: {
654 auto it = info.wifi_sta_disconnected;
655 auto &mac = it.bssid;
659 case ESPHOME_EVENT_ID_WIFI_AP_STAIPASSIGNED: {
660 ESP_LOGV(TAG,
"AP client assigned IP");
663 case ESPHOME_EVENT_ID_WIFI_AP_PROBEREQRECVED: {
664 auto it = info.wifi_ap_probereqrecved;
674 const auto status = WiFi.status();
675 if (
status == WL_CONNECT_FAILED ||
status == WL_CONNECTION_LOST) {
678 if (
status == WL_NO_SSID_AVAIL) {
681 if (s_sta_connecting) {
684 if (
status == WL_CONNECTED) {
695 int16_t err = WiFi.scanNetworks(
true,
true, passive, 200);
696 if (err != WIFI_SCAN_RUNNING) {
697 ESP_LOGV(TAG,
"WiFi.scanNetworks failed: %d", err);
706 int16_t num = WiFi.scanComplete();
710 this->
scan_result_.reserve(
static_cast<unsigned int>(num));
711 for (
int i = 0; i < num; i++) {
712 String ssid = WiFi.SSID(i);
713 wifi_auth_mode_t authmode = WiFi.encryptionType(i);
714 int32_t rssi = WiFi.RSSI(i);
715 uint8_t *bssid = WiFi.BSSID(i);
716 int32_t channel = WiFi.channel(i);
718 WiFiScanResult scan({bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]}, std::string(ssid.c_str()),
719 channel, rssi, authmode != WIFI_AUTH_OPEN, ssid.length() == 0);
735 if (s_ap_netif ==
nullptr) {
736 ESP_LOGW(TAG,
"AP interface not initialized");
740 esp_netif_ip_info_t info;
742 info.ip = manual_ip->static_ip;
743 info.gw = manual_ip->gateway;
744 info.netmask = manual_ip->subnet;
751 err = esp_netif_dhcps_stop(s_ap_netif);
752 if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) {
753 ESP_LOGE(TAG,
"esp_netif_dhcps_stop failed: %s", esp_err_to_name(err));
757 err = esp_netif_set_ip_info(s_ap_netif, &info);
759 ESP_LOGE(TAG,
"esp_netif_set_ip_info failed: %d", err);
767 lease.start_ip = start_address;
768 ESP_LOGV(TAG,
"DHCP server IP lease start: %s", start_address.
str().c_str());
770 lease.end_ip = start_address;
771 ESP_LOGV(TAG,
"DHCP server IP lease end: %s", start_address.
str().c_str());
772 err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease,
sizeof(lease));
775 ESP_LOGE(TAG,
"esp_netif_dhcps_option failed: %d", err);
779 err = esp_netif_dhcps_start(s_ap_netif);
782 ESP_LOGE(TAG,
"esp_netif_dhcps_start failed: %d", err);
795 memset(&conf, 0,
sizeof(conf));
796 if (ap.
get_ssid().size() >
sizeof(conf.ap.ssid)) {
797 ESP_LOGE(TAG,
"AP SSID too long");
800 memcpy(
reinterpret_cast<char *
>(conf.ap.ssid), ap.
get_ssid().c_str(), ap.
get_ssid().size());
802 conf.ap.ssid_hidden = ap.
get_ssid().size();
803 conf.ap.max_connection = 5;
804 conf.ap.beacon_interval = 100;
807 conf.ap.authmode = WIFI_AUTH_OPEN;
808 *conf.ap.password = 0;
810 conf.ap.authmode = WIFI_AUTH_WPA2_PSK;
811 if (ap.
get_password().size() >
sizeof(conf.ap.password)) {
812 ESP_LOGE(TAG,
"AP password too long");
819 conf.ap.pairwise_cipher = WIFI_CIPHER_TYPE_CCMP;
821 esp_err_t err = esp_wifi_set_config(WIFI_IF_AP, &conf);
823 ESP_LOGV(TAG,
"esp_wifi_set_config failed: %d", err);
830 ESP_LOGV(TAG,
"wifi_ap_ip_config_ failed");
838 esp_netif_ip_info_t ip;
839 esp_netif_get_ip_info(s_ap_netif, &ip);
848 uint8_t *raw_bssid = WiFi.BSSID();
849 if (raw_bssid !=
nullptr) {
850 for (
size_t i = 0; i < bssid.size(); i++)
851 bssid[i] = raw_bssid[i];
BedjetMode mode
BedJet operating mode.
const std::string & get_name() const
Get the name of this Application set by pre_setup().
void set_timeout(const std::string &name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
Helper class to lock the lwIP TCPIP core when making lwIP API calls from non-TCPIP threads.
value_type value_or(U const &v) const
const optional< bssid_t > & get_bssid() const
const std::string & get_ssid() const
const optional< uint8_t > & get_channel() const
const optional< EAPAuth > & get_eap() const
const std::string & get_password() const
const optional< ManualIP > & get_manual_ip() const
bool error_from_callback_
bool wifi_apply_power_save_()
void set_ap(const WiFiAP &ap)
Setup an Access Point that should be created if no connection to a station can be made.
void set_sta(const WiFiAP &ap)
WiFiPowerSaveMode power_save_
bool wifi_sta_ip_config_(optional< ManualIP > manual_ip)
std::vector< WiFiScanResult > scan_result_
bool wifi_ap_ip_config_(optional< ManualIP > manual_ip)
bool wifi_start_ap_(const WiFiAP &ap)
int32_t get_wifi_channel()
network::IPAddress wifi_subnet_mask_()
network::IPAddress wifi_soft_ap_ip()
void wifi_event_callback_(arduino_event_id_t event, arduino_event_info_t info)
network::IPAddress wifi_gateway_ip_()
network::IPAddress wifi_dns_ip_(int num)
bool wifi_apply_hostname_()
bool wifi_sta_pre_setup_()
bool wifi_apply_output_power_(float output_power)
WiFiSTAConnectStatus wifi_sta_connect_status_()
bool wifi_sta_connect_(const WiFiAP &ap)
bool wifi_mode_(optional< bool > sta, optional< bool > ap)
network::IPAddresses wifi_sta_ip_addresses()
uint8_t num_ipv6_addresses_
bool wifi_scan_start_(bool passive)
void wifi_scan_done_callback_()
std::array< IPAddress, 5 > IPAddresses
arduino_event_info_t esphome_wifi_event_info_t
std::array< uint8_t, 6 > bssid_t
const char * get_auth_mode_str(uint8_t mode)
arduino_event_id_t esphome_wifi_event_id_t
const char * get_disconnect_reason_str(uint8_t reason)
@ ERROR_NETWORK_NOT_FOUND
std::string format_ip4_addr(const esphome_ip4_addr_t &ip)
esp_ip4_addr_t esphome_ip4_addr_t
const char * get_op_mode_str(uint8_t mode)
Providing packet encoding functions for exchanging data with a remote host.
bool has_custom_mac_address()
Check if a custom MAC address is set (ESP32 & variants)
void IRAM_ATTR HOT yield()
void set_mac_address(uint8_t *mac)
Set the MAC address to use from the provided byte array (6 bytes).
std::string format_mac_address_pretty(const uint8_t *mac)
void get_mac_address_raw(uint8_t *mac)
Get the device MAC address as raw bytes, written into the provided byte array (6 bytes).
void IRAM_ATTR HOT delay(uint32_t ms)
Application App
Global storage of Application pointer - only one Application can exist.