Refactored Wifi for ESP32 to allow for Core3 (#21106)

* Refactored Wifi for ESP32 to allow for Core3

* Fix case in include

* Grrr

* Fix compilation

* Fix Ethernet IPv6

* Fix wrong hostname due to mac address unknown at start
This commit is contained in:
s-hadinger 2024-04-05 23:44:21 +02:00 committed by GitHub
parent 8a8888a273
commit 2128dfbade
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 308 additions and 158 deletions

View File

@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file.
### Breaking Changed
### Changed
- Refactored Wifi for ESP32 to allow for Core3
### Fixed
- NeoPool hydrolysis unit for Hidrolife, Bionet and Generic device (#21098)

View File

@ -0,0 +1,19 @@
Wifi Helper for Tasmota bridging differences between ESP8266 and ESP32
This Class is for compatibility with esp8266 code
== License ==
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

View File

@ -0,0 +1,8 @@
{
"name": "WiFiHelper",
"keywords": "esp32, esp8266",
"description": "Bridges differences in Arduino WiFi between ESP32 and ESP8266",
"version": "1.0.0",
"frameworks": "arduino",
"platforms": "*"
}

View File

@ -0,0 +1,86 @@
/*
WiFiHelper.h - provide a wrapper for differences between ESP8266 and ESP32 WiFi
Copyright (C) 2024 Theo Arends / Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef WIFIHELPER_H
#define WIFIHELPER_H
// ======================================================
// ESP8266 specific section
// ======================================================
#ifdef ESP8266
#include "ESP8266WiFi.h"
#endif
// ======================================================
// ESP32 specific section
// ======================================================
#ifdef ESP32
#include <WiFi.h>
#define ENC_TYPE_NONE WIFI_AUTH_OPEN
#define ENC_TYPE_WEP WIFI_AUTH_WEP
#define ENC_TYPE_CCMP WIFI_AUTH_WPA2_PSK
#define ENC_TYPE_TKIP WIFI_AUTH_WPA_WPA2_PSK
#define ENC_TYPE_AUTO WIFI_AUTH_MAX + 1
#define WIFI_NONE_SLEEP 0
#define WIFI_LIGHT_SLEEP 1
#define WIFI_MODEM_SLEEP 2
// ESP8266
typedef enum WiFiPhyMode
{
TAS_WIFI_PHY_MODE_LR = 0, TAS_WIFI_PHY_MODE_11B = 1, TAS_WIFI_PHY_MODE_11G = 2, TAS_WIFI_PHY_MODE_11N = 3
#if ESP_IDF_VERSION_MAJOR >= 5
, TAS_WIFI_PHY_MODE_11AX = 4
#endif
} WiFiPhyMode_t;
#endif // ESP32
// This is an abstract class containing wrappers to call WiFi
class WiFiHelper {
public:
#ifdef ESP32
static wl_status_t begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity=NULL, const char* wpa2_username=NULL, const char *wpa2_password=NULL, const char* ca_pem=NULL, const char* client_crt=NULL, const char* client_key=NULL, int32_t channel=0, const uint8_t* bssid=0, bool connect=true);
#endif
static wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
static wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
static wl_status_t begin();
static void hostname(const char* aHostname);
static void setSleepMode(int iSleepMode);
static int getPhyMode();
static bool setPhyMode(WiFiPhyMode_t mode);
static void setOutputPower(int n);
static void forceSleepBegin();
static void forceSleepWake();
static bool getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &hidden_scan);
static int hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms);
static int hostByName(const char* aHostname, IPAddress& aResult);
static void scrubDNS(void);
};
#endif // WIFIHELPER_H

View File

@ -16,48 +16,48 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//
#ifdef ESP32
#include "Arduino.h"
#include <ESP8266WiFi.h>
#include "WiFiHelper.h"
#include <esp_wifi.h>
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
//
// Wifi
//
#ifdef WiFi
#undef WiFi
#endif
#ifdef USE_IPV6
ip_addr_t dns_save4[DNS_MAX_SERVERS] = {}; // IPv4 DNS servers
ip_addr_t dns_save6[DNS_MAX_SERVERS] = {}; // IPv6 DNS servers
#endif // USE_IPV6
#include "tasmota_options.h"
#include "lwip/dns.h"
wl_status_t WiFiClass32::begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity, const char* wpa2_username, const char *wpa2_password, const char* ca_pem, const char* client_crt, const char* client_key, int32_t channel, const uint8_t* bssid, bool connect) {
scrubDNS();
wl_status_t ret = WiFiClass::begin(wpa2_ssid, method, wpa2_identity, wpa2_username, wpa2_password, ca_pem, client_crt, client_key, channel, bssid, connect);
scrubDNS();
wl_status_t WiFiHelper::begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity, const char* wpa2_username, const char *wpa2_password, const char* ca_pem, const char* client_crt, const char* client_key, int32_t channel, const uint8_t* bssid, bool connect) {
WiFiHelper::scrubDNS();
wl_status_t ret = WiFi.begin(wpa2_ssid, method, wpa2_identity, wpa2_username, wpa2_password, ca_pem, client_crt, client_key, channel, bssid, connect);
WiFiHelper::scrubDNS();
return ret;
}
wl_status_t WiFiClass32::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
scrubDNS();
wl_status_t ret = WiFiClass::begin(ssid, passphrase, channel, bssid, connect);
scrubDNS();
wl_status_t WiFiHelper::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
WiFiHelper::scrubDNS();
wl_status_t ret = WiFi.begin(ssid, passphrase, channel, bssid, connect);
WiFiHelper::scrubDNS();
return ret;
}
wl_status_t WiFiClass32::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
scrubDNS();
wl_status_t ret = WiFiClass::begin(ssid, passphrase, channel, bssid, connect);
scrubDNS();
wl_status_t WiFiHelper::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
WiFiHelper::scrubDNS();
wl_status_t ret = WiFi.begin(ssid, passphrase, channel, bssid, connect);
WiFiHelper::scrubDNS();
return ret;
}
wl_status_t WiFiClass32::begin() {
scrubDNS();
wl_status_t ret = WiFiClass::begin();
scrubDNS();
wl_status_t WiFiHelper::begin() {
WiFiHelper::scrubDNS();
wl_status_t ret = WiFi.begin();
WiFiHelper::scrubDNS();
return ret;
}
@ -73,7 +73,7 @@ extern bool EthernetHasIPv4(void);
extern bool WifiHasIPv6(void);
extern bool EthernetHasIPv6(void);
void WiFiClass32::scrubDNS(void) {
void WiFiHelper::scrubDNS(void) {
// String dns_entry0 = IPAddress(dns_getserver(0)).toString();
// String dns_entry1 = IPAddress(dns_getserver(1)).toString();
// scan DNS entries
@ -118,12 +118,17 @@ void WiFiClass32::scrubDNS(void) {
// AddLog(LOG_LEVEL_DEBUG, "IP>: DNS: from(%s %s) to (%s %s) has4/6:%i-%i", dns_entry0.c_str(), dns_entry1.c_str(), IPAddress(dns_getserver(0)).toString().c_str(), IPAddress(dns_getserver(1)).toString().c_str(), has_v4, has_v6);
}
void WiFiClass32::setSleepMode(int iSleepMode) {
void WiFiHelper::hostname(const char* aHostname) {
WiFi.setHostname(aHostname);
}
void WiFiHelper::setSleepMode(int iSleepMode) {
// WIFI_LIGHT_SLEEP and WIFI_MODEM_SLEEP
WiFi.setSleep(iSleepMode != WIFI_NONE_SLEEP);
}
int WiFiClass32::getPhyMode() {
int WiFiHelper::getPhyMode() {
/*
typedef enum
{
@ -146,7 +151,7 @@ int WiFiClass32::getPhyMode() {
return phy_mode;
}
bool WiFiClass32::setPhyMode(WiFiPhyMode_t mode) {
bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) {
uint8_t protocol_bitmap = WIFI_PROTOCOL_11B; // 1
switch (mode) {
#if ESP_IDF_VERSION_MAJOR >= 5
@ -158,10 +163,7 @@ bool WiFiClass32::setPhyMode(WiFiPhyMode_t mode) {
return (ESP_OK == esp_wifi_set_protocol(WIFI_IF_STA, protocol_bitmap));
}
void WiFiClass32::wps_disable() {
}
void WiFiClass32::setOutputPower(int n) {
void WiFiHelper::setOutputPower(int n) {
wifi_power_t p = WIFI_POWER_2dBm;
if (n > 19)
p = WIFI_POWER_19_5dBm;
@ -184,13 +186,13 @@ void WiFiClass32::setOutputPower(int n) {
WiFi.setTxPower(p);
}
void WiFiClass32::forceSleepBegin() {
void WiFiHelper::forceSleepBegin() {
}
void WiFiClass32::forceSleepWake() {
void WiFiHelper::forceSleepWake() {
}
bool WiFiClass32::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t *&bssid, int32_t &channel, bool &hidden_scan) {
bool WiFiHelper::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t *&bssid, int32_t &channel, bool &hidden_scan) {
hidden_scan = false;
return WiFi.getNetworkInfo(i, ssid, encType, rssi, bssid, channel);
}
@ -213,6 +215,16 @@ static volatile uint32_t ip_addr_counter = 0; // counter for requests
extern int32_t WifiDNSGetTimeout(void);
extern bool WifiDNSGetIPv6Priority(void);
static volatile bool dns_found = false;
bool DNS_TimeReached(uint32_t timer)
{
// Check if a certain timeout has been reached.
int32_t passed = ((int32_t) (millis() - timer));
return (passed >= 0);
}
static void wifi32_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
{
// Serial.printf("DNS: cb name=%s ipaddr=%s arg=%i counter=%i\n", name ? name : "<null>", IPAddress(ipaddr).toString().c_str(), (int) callback_arg, ip_addr_counter);
@ -224,13 +236,9 @@ static void wifi32_dns_found_callback(const char *name, const ip_addr_t *ipaddr,
} else {
dns_ipaddr = *IP4_ADDR_ANY; // set to IPv4 0.0.0.0
}
WiFiClass32::dnsDone();
dns_found = true;
// AddLog(LOG_LEVEL_DEBUG, "WIF: dns_found=%s", ipaddr ? IPAddress(*ipaddr).toString().c_str() : "<null>");
}
// We need this helper method to access protected methods from WiFiGeneric
void WiFiClass32::dnsDone(void) {
setStatusBits(NET_DNS_DONE_BIT);
}
/**
* Resolve the given hostname to an IP address.
@ -239,19 +247,22 @@ void WiFiClass32::dnsDone(void) {
* @return 1 if aIPAddrString was successfully converted to an IP address,
* else error code
*/
int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms)
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms)
{
// return WiFi.hostByName(aHostname, aResult);
// #if 0
ip_addr_t addr;
aResult = (uint32_t) 0; // by default set to IPv4 0.0.0.0
dns_ipaddr = *IP4_ADDR_ANY; // by default set to IPv4 0.0.0.0
scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
WiFiHelper::scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
ip_addr_counter++; // increase counter, from now ignore previous responses
clearStatusBits(NET_DNS_IDLE_BIT | NET_DNS_DONE_BIT);
// clearStatusBits(NET_DNS_IDLE_BIT | NET_DNS_DONE_BIT);
uint8_t v4v6priority = LWIP_DNS_ADDRTYPE_IPV4;
#ifdef USE_IPV6
v4v6priority = WifiDNSGetIPv6Priority() ? LWIP_DNS_ADDRTYPE_IPV6_IPV4 : LWIP_DNS_ADDRTYPE_IPV4_IPV6;
#endif // USE_IPV6
dns_found = false;
err_t err = dns_gethostbyname_addrtype(aHostname, &dns_ipaddr, &wifi32_dns_found_callback, (void*) ip_addr_counter, v4v6priority);
// Serial.printf("DNS: dns_gethostbyname_addrtype errg=%i counter=%i\n", err, ip_addr_counter);
if(err == ERR_OK && !ip_addr_isany_val(dns_ipaddr)) {
@ -261,8 +272,10 @@ int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult, int32_t t
aResult = ip_addr_get_ip4_u32(&dns_ipaddr);
#endif // USE_IPV6
} else if(err == ERR_INPROGRESS) {
waitStatusBits(NET_DNS_DONE_BIT, timer_ms); //real internal timeout in lwip library is 14[s]
clearStatusBits(NET_DNS_DONE_BIT);
uint32_t deadline = millis() + timer_ms;
while ((!DNS_TimeReached(deadline)) && !dns_found) {
delay(1);
}
}
if (!ip_addr_isany_val(dns_ipaddr)) {
@ -274,19 +287,12 @@ int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult, int32_t t
return true;
}
return false;
// #endif
}
int WiFiClass32::hostByName(const char* aHostname, IPAddress& aResult)
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult)
{
return hostByName(aHostname, aResult, WifiDNSGetTimeout());
return WiFiHelper::hostByName(aHostname, aResult, WifiDNSGetTimeout());
}
void wifi_station_disconnect() {
// erase ap: empty ssid, ...
WiFi.disconnect(true, true);
}
void wifi_station_dhcpc_start() {
}
WiFiClass32 WiFi32;
#endif // ESP32

View File

@ -0,0 +1,76 @@
/*
WiFi compat with ESP32
Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//
#ifdef ESP8266
#include "Arduino.h"
#include "WiFiHelper.h"
wl_status_t WiFiHelper::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
return WiFi.begin(ssid, passphrase, channel, bssid, connect);
}
wl_status_t WiFiHelper::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
return WiFi.begin(ssid, passphrase, channel, bssid, connect);
}
wl_status_t WiFiHelper::begin() {
return WiFi.begin();
}
void WiFiHelper::scrubDNS(void) {
}
void WiFiHelper::hostname(const char* aHostname) {
WiFi.hostname(aHostname);
}
void WiFiHelper::setSleepMode(int iSleepMode) {
WiFi.setSleepMode((WiFiSleepType_t)iSleepMode);
}
int WiFiHelper::getPhyMode() {
return WiFi.getPhyMode();
}
bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) {
return WiFi.setPhyMode(mode);
}
void WiFiHelper::setOutputPower(int n) {
WiFi.setOutputPower(n);
}
void WiFiHelper::forceSleepBegin() {
WiFi.forceSleepBegin();
}
void WiFiHelper::forceSleepWake() {
WiFi.forceSleepWake();
}
bool WiFiHelper::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &hidden_scan) {
return WiFi.getNetworkInfo(i, ssid, encType, rssi, bssid, channel, hidden_scan);
}
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms) {
return WiFi.hostByName(aHostname, aResult, timer_ms);
}
int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult) {
return WiFi.hostByName(aHostname, aResult);
}
#endif // ESP8266

View File

@ -34,6 +34,7 @@
#include "WiFiClientSecureLightBearSSL.h" // needs to be before "ESP8266WiFi.h" to avoid conflict with Arduino headers
#include "ESP8266WiFi.h"
#include "WiFiHelper.h"
#include "WiFiClient.h"
#include "StackThunk_light.h"
#include "lwip/opt.h"
@ -318,7 +319,7 @@ int WiFiClientSecure_light::connect(const char* name, uint16_t port, int32_t tim
DEBUG_BSSL("connect(%s,%d)\n", name, port);
IPAddress remote_addr;
clearLastError();
if (!WiFi.hostByName(name, remote_addr)) {
if (!WiFiHelper::hostByName(name, remote_addr)) {
DEBUG_BSSL("connect: Name loopup failure\n");
setLastError(ERR_CANT_RESOLVE_IP);
return 0;
@ -337,7 +338,7 @@ int WiFiClientSecure_light::connect(const char* name, uint16_t port) {
DEBUG_BSSL("connect(%s,%d)\n", name, port);
IPAddress remote_addr;
clearLastError();
if (!WiFi.hostByName(name, remote_addr)) {
if (!WiFiHelper::hostByName(name, remote_addr)) {
DEBUG_BSSL("connect: Name loopup failure\n");
setLastError(ERR_CANT_RESOLVE_IP);
return 0;

View File

@ -46,6 +46,7 @@
#if defined(ESP32)
#include "ESP8266WiFi.h"
#if defined(ESP_MAIL_WIFI_IS_AVAILABLE)
#define WIFI_HAS_HOST_BY_NAME
#endif
@ -456,7 +457,7 @@ public:
int hostByName(const char *name, IPAddress &ip)
{
#if defined(ESP_MAIL_WIFI_IS_AVAILABLE)
return WiFi.hostByName(name, ip);
return WiFiHelper::hostByName(name, ip);
#else
return 1;
#endif

View File

@ -16,76 +16,4 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <WiFi.h>
#define ENC_TYPE_NONE WIFI_AUTH_OPEN
#define ENC_TYPE_WEP WIFI_AUTH_WEP
#define ENC_TYPE_CCMP WIFI_AUTH_WPA2_PSK
#define ENC_TYPE_TKIP WIFI_AUTH_WPA_WPA2_PSK
#define ENC_TYPE_AUTO WIFI_AUTH_MAX + 1
#define WIFI_NONE_SLEEP 0
#define WIFI_LIGHT_SLEEP 1
#define WIFI_MODEM_SLEEP 2
// ESP8266
typedef enum WiFiPhyMode
{
TAS_WIFI_PHY_MODE_LR = 0, TAS_WIFI_PHY_MODE_11B = 1, TAS_WIFI_PHY_MODE_11G = 2, TAS_WIFI_PHY_MODE_11N = 3
#if ESP_IDF_VERSION_MAJOR >= 5
, TAS_WIFI_PHY_MODE_11AX = 4
#endif
} WiFiPhyMode_t;
/*
// ESP32 was never defined until IDF 4.4
typedef enum
{
WIFI_PHY_MODE_LR, // PHY mode for Low Rate
WIFI_PHY_MODE_11B, // PHY mode for 11b
WIFI_PHY_MODE_11G, // PHY mode for 11g
WIFI_PHY_MODE_HT20, // PHY mode for 11n Bandwidth HT20
WIFI_PHY_MODE_HT40, // PHY mode for 11n Bandwidth HT40
WIFI_PHY_MODE_HE20, // PHY mode for 11n Bandwidth HE20
} wifi_phy_mode_t;
*/
class WiFiClass32 : public WiFiClass
{
public:
wl_status_t begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity=NULL, const char* wpa2_username=NULL, const char *wpa2_password=NULL, const char* ca_pem=NULL, const char* client_crt=NULL, const char* client_key=NULL, int32_t channel=0, const uint8_t* bssid=0, bool connect=true);
wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
wl_status_t begin();
static void hostname(const char* aHostname)
{
WiFi.setHostname(aHostname);
}
static void setSleepMode(int iSleepMode);
static int getPhyMode();
static bool setPhyMode(WiFiPhyMode_t mode);
static void wps_disable();
static void setOutputPower(int n);
static void forceSleepBegin();
static void forceSleepWake();
static bool getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &hidden_scan);
static void dnsDone(void); // used by the callback to stop the dns timer
int hostByName(const char* aHostname, IPAddress& aResult, int32_t timer_ms);
int hostByName(const char* aHostname, IPAddress& aResult);
void scrubDNS(void);
protected:
#ifdef USE_IPV6
ip_addr_t dns_save4[DNS_MAX_SERVERS] = {}; // IPv4 DNS servers
ip_addr_t dns_save6[DNS_MAX_SERVERS] = {}; // IPv6 DNS servers
#endif // USE_IPV6
};
void wifi_station_disconnect();
void wifi_station_dhcpc_start();
extern WiFiClass32 WiFi32;
#define WiFi WiFi32
#include <WiFiHelper.h>

View File

@ -1166,7 +1166,7 @@ bool HTTPClientLight::connect(void)
} else {
IPAddress remote_addr;
// Add include "ESP8266WiFi.h" for this to work
if (!WiFi.hostByName(_host.c_str(), remote_addr)) {
if (!WiFiHelper::hostByName(_host.c_str(), remote_addr)) {
return false;
}
if(!_client->connect(remote_addr, _port, _connectTimeout)) {

View File

@ -40,6 +40,7 @@
#endif
// Libraries
#include <WiFiHelper.h>
#include <ESP8266HTTPClient.h> // Ota
#include <ESP8266httpUpdate.h> // Ota
#ifdef ESP32
@ -713,6 +714,10 @@ void setup(void) {
// Github inserts "release" or "commit number" before compiling using sed -i -e 's/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT 85cff52-/g' tasmota_version.h
snprintf_P(TasmotaGlobal.image_name, sizeof(TasmotaGlobal.image_name), PSTR("(" STR(TASMOTA_SHA_SHORT) "%s)"), PSTR(CODE_IMAGE_STR)); // Results in (85cff52-tasmota) or (release-tasmota)
#if defined(ESP32) && (ESP_IDF_VERSION_MAJOR >= 5)
WiFi.begin(); // force wifi start so that the Mac address is known
#endif
Format(TasmotaGlobal.mqtt_client, SettingsText(SET_MQTT_CLIENT), sizeof(TasmotaGlobal.mqtt_client));
Format(TasmotaGlobal.mqtt_topic, SettingsText(SET_MQTT_TOPIC), sizeof(TasmotaGlobal.mqtt_topic));
if (strchr(SettingsText(SET_HOSTNAME), '%') != nullptr) {

View File

@ -2680,7 +2680,7 @@ void CmndWifi(void) {
#ifdef ESP32
Wifi.phy_mode = option;
#endif // ESP32
WiFi.setPhyMode(WiFiPhyMode_t(option)); // 1=B/2=BG/3=BGN/4=BGNAX
WiFiHelper::setPhyMode(WiFiPhyMode_t(option)); // 1=B/2=BG/3=BGN/4=BGNAX
break;
}
}

View File

@ -981,7 +981,7 @@ String ESP_getEfuseMac(void) {
String WifiGetPhyMode(void) {
char stemp[10];
return String(GetTextIndexed(stemp, sizeof(stemp), WiFi.getPhyMode(), kWifiPhyMode));
return String(GetTextIndexed(stemp, sizeof(stemp), WiFiHelper::getPhyMode(), kWifiPhyMode));
}
/*********************************************************************************************\

View File

@ -262,7 +262,7 @@ String ESP_getEfuseMac(void) {
String WifiGetPhyMode(void) {
char stemp[10];
return String(GetTextIndexed(stemp, sizeof(stemp), WiFi.getPhyMode() & 0x3, kWifiPhyMode));
return String(GetTextIndexed(stemp, sizeof(stemp), WiFiHelper::getPhyMode() & 0x3, kWifiPhyMode));
}
/*********************************************************************************************\

View File

@ -146,7 +146,7 @@ void WifiSetMode(WiFiMode_t wifi_mode) {
WiFi.hostname(TasmotaGlobal.hostname); // ESP32 needs this here (before WiFi.mode) for core 2.0.0
// See: https://github.com/esp8266/Arduino/issues/6172#issuecomment-500457407
WiFi.forceSleepWake(); // Make sure WiFi is really active.
WiFiHelper::forceSleepWake(); // Make sure WiFi is really active.
}
uint32_t retry = 2;
@ -157,7 +157,7 @@ void WifiSetMode(WiFiMode_t wifi_mode) {
if (wifi_mode == WIFI_OFF) {
delay(1000);
WiFi.forceSleepBegin();
WiFiHelper::forceSleepBegin();
}
delay(100); // Must allow for some time to init.
}
@ -179,9 +179,9 @@ void WiFiSetSleepMode(void)
// Sleep explanation: https://github.com/esp8266/Arduino/blob/3f0c601cfe81439ce17e9bd5d28994a7ed144482/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp#L255
/*
if (TasmotaGlobal.sleep && Settings->flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep
WiFi.setSleepMode(WIFI_LIGHT_SLEEP); // Allow light sleep during idle times
WiFiHelper::setSleepMode(WIFI_LIGHT_SLEEP); // Allow light sleep during idle times
} else {
WiFi.setSleepMode(WIFI_MODEM_SLEEP); // Disable sleep (Esp8288/Arduino core and sdk default)
WiFiHelper::setSleepMode(WIFI_MODEM_SLEEP); // Disable sleep (Esp8288/Arduino core and sdk default)
}
*/
bool wifi_no_sleep = Settings->flag5.wifi_no_sleep;
@ -190,13 +190,13 @@ void WiFiSetSleepMode(void)
#endif
if (0 == TasmotaGlobal.sleep || wifi_no_sleep) {
if (!TasmotaGlobal.wifi_stay_asleep) {
WiFi.setSleepMode(WIFI_NONE_SLEEP); // Disable sleep
WiFiHelper::setSleepMode(WIFI_NONE_SLEEP); // Disable sleep
}
} else {
if (Settings->flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep
WiFi.setSleepMode(WIFI_LIGHT_SLEEP); // Allow light sleep during idle times
WiFiHelper::setSleepMode(WIFI_LIGHT_SLEEP); // Allow light sleep during idle times
} else {
WiFi.setSleepMode(WIFI_MODEM_SLEEP); // Sleep (Esp8288/Arduino core and sdk default)
WiFiHelper::setSleepMode(WIFI_MODEM_SLEEP); // Sleep (Esp8288/Arduino core and sdk default)
}
}
delay(100);
@ -224,15 +224,14 @@ void WifiBegin(uint8_t flag, uint8_t channel) {
WiFiSetSleepMode();
WifiSetOutputPower();
// if (WiFi.getPhyMode() != WIFI_PHY_MODE_11N) { WiFi.setPhyMode(WIFI_PHY_MODE_11N); } // B/G/N
// if (WiFi.getPhyMode() != WIFI_PHY_MODE_11G) { WiFi.setPhyMode(WIFI_PHY_MODE_11G); } // B/G
// if (WiFiHelper::getPhyMode() != WIFI_PHY_MODE_11N) { WiFiHelper::setPhyMode(WIFI_PHY_MODE_11N); } // B/G/N
// if (WiFiHelper::getPhyMode() != WIFI_PHY_MODE_11G) { WiFiHelper::setPhyMode(WIFI_PHY_MODE_11G); } // B/G
#ifdef ESP32
if (Wifi.phy_mode) {
WiFi.setPhyMode(WiFiPhyMode_t(Wifi.phy_mode)); // 1-B/2-BG/3-BGN/4-BGNAX
WiFiHelper::setPhyMode(WiFiPhyMode_t(Wifi.phy_mode)); // 1-B/2-BG/3-BGN/4-BGNAX
}
#endif
if (!WiFi.getAutoConnect()) { WiFi.setAutoConnect(true); }
// WiFi.setAutoReconnect(true);
WiFi.setAutoReconnect(true);
switch (flag) {
case 0: // AP1
case 1: // AP2
@ -321,7 +320,7 @@ void WifiBeginAfterScan(void)
int32_t chan_scan;
bool hidden_scan;
WiFi.getNetworkInfo(i, ssid_scan, sec_scan, rssi_scan, bssid_scan, chan_scan, hidden_scan);
WiFiHelper::getNetworkInfo(i, ssid_scan, sec_scan, rssi_scan, bssid_scan, chan_scan, hidden_scan);
bool known = false;
uint32_t j;
@ -631,7 +630,7 @@ String EthernetGetIPv6LinkLocalStr(void)
bool DNSGetIP(IPAddress *ip, uint32_t idx)
{
#ifdef ESP32
WiFi.scrubDNS(); // internal calls to reconnect can zero the DNS servers, restore the previous values
WiFiHelper::scrubDNS(); // internal calls to reconnect can zero the DNS servers, restore the previous values
#endif
const ip_addr_t *ip_dns = dns_getserver(idx);
if (!ip_addr_isany(ip_dns)) {
@ -990,7 +989,7 @@ float WifiGetOutputPower(void) {
void WifiSetOutputPower(void) {
if (Settings->wifi_output_power) {
WiFi.setOutputPower((float)(Settings->wifi_output_power) / 10);
WiFiHelper::setOutputPower((float)(Settings->wifi_output_power) / 10);
delay(100);
} else {
AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: Dynamic Tx power enabled")); // WifiPower 0
@ -1008,7 +1007,7 @@ void WiFiSetTXpowerBasedOnRssi(void) {
// Range ESP8266: 0dBm - 20.5dBm
int max_tx_pwr = MAX_TX_PWR_DBM_11b;
int threshold = WIFI_SENSITIVITY_n;
int phy_mode = WiFi.getPhyMode();
int phy_mode = WiFiHelper::getPhyMode();
switch (phy_mode) {
case 1: // 11b (WIFI_PHY_MODE_11B)
threshold = WIFI_SENSITIVITY_11b;
@ -1040,7 +1039,7 @@ void WiFiSetTXpowerBasedOnRssi(void) {
if (min_tx_pwr > max_tx_pwr) {
min_tx_pwr = max_tx_pwr;
}
WiFi.setOutputPower((float)min_tx_pwr / 10);
WiFiHelper::setOutputPower((float)min_tx_pwr / 10);
delay(Wifi.last_tx_pwr < min_tx_pwr); // If increase the TX power, give power supply of the unit some rest
/*
if (Wifi.last_tx_pwr != min_tx_pwr) {
@ -1150,7 +1149,11 @@ void WifiShutdown(bool option) {
// Courtesy of EspEasy
// WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
ETS_UART_INTR_DISABLE();
#ifdef ESP8266
wifi_station_disconnect(); // this will store empty ssid/wpa into sdk storage
#else
WiFi.disconnect(true, true);
#endif
ETS_UART_INTR_ENABLE();
// WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
}
@ -1291,7 +1294,7 @@ bool WifiHostByName(const char* aHostname, IPAddress& aResult) {
#endif // USE_IPV6
uint32_t dns_start = millis();
bool success = WiFi.hostByName(aHostname, aResult, Settings->dns_timeout);
bool success = WiFiHelper::hostByName(aHostname, aResult, Settings->dns_timeout);
uint32_t dns_end = millis();
if (success) {
// Host name resolved
@ -1515,6 +1518,6 @@ void WifiEvents(arduino_event_t *event) {
default:
break;
}
WiFi.scrubDNS(); // internal calls to reconnect can zero the DNS servers, restore the previous values
WiFiHelper::scrubDNS(); // internal calls to reconnect can zero the DNS servers, restore the previous values
}
#endif // ESP32

View File

@ -111,6 +111,15 @@ void EthernetEvent(arduino_event_t *event) {
// workaround for the race condition in LWIP, see https://github.com/espressif/arduino-esp32/pull/9016#discussion_r1451774885
{
uint32_t i = 5; // try 5 times only
#if ESP_IDF_VERSION_MAJOR >= 5
while (esp_netif_create_ip6_linklocal(ETH.netif()) != ESP_OK) {
delay(1);
if (i-- == 0) {
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ETH ">>>> HELP"));
break;
}
}
#else
while (esp_netif_create_ip6_linklocal(get_esp_interface_netif(ESP_IF_ETH)) != ESP_OK) {
delay(1);
if (i-- == 0) {
@ -118,6 +127,7 @@ void EthernetEvent(arduino_event_t *event) {
break;
}
}
#endif
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ETH "ESP_IF_ETH i=%i"), i);
}
#endif // USE_IPV6
@ -145,7 +155,7 @@ void EthernetEvent(arduino_event_t *event) {
event->event_info.got_ip.ip_info.ip.addr,
event->event_info.got_ip.ip_info.netmask.addr,
event->event_info.got_ip.ip_info.gw.addr);
WiFi.scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
WiFiHelper::scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
break;
#ifdef USE_IPV6
@ -161,7 +171,7 @@ void EthernetEvent(arduino_event_t *event) {
TasmotaGlobal.rules_flag.eth_connected = 1;
TasmotaGlobal.global_state.eth_down = 0;
}
WiFi.scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
WiFiHelper::scrubDNS(); // internal calls to reconnect can zero the DNS servers, save DNS for future use
}
break;
#endif // USE_IPV6
@ -233,6 +243,12 @@ void EthernetInit(void) {
int eth_mdio = Pin(GPIO_ETH_PHY_MDIO); // Ethernet SPI IRQ
int eth_power = Pin(GPIO_ETH_PHY_POWER); // Ethernet SPI RST
#if ESP_IDF_VERSION_MAJOR >= 5
#ifdef USE_IPV6
ETH.enableIPv6(); // enable Link-Local
#endif // USE_IPV6
#endif // ESP_IDF_VERSION_MAJOR >= 5
bool init_ok = false;
#if ESP_IDF_VERSION_MAJOR >= 5
if (Settings->eth_type < 7) {
@ -241,7 +257,7 @@ void EthernetInit(void) {
#endif // CONFIG_ETH_USE_ESP32_EMAC
} else {
// ETH_SPI_SUPPORTS_CUSTOM
// SPISettings(ETH_PHY_SPI_FREQ_MHZ * 1000 * 1000, MSBFIRST, SPI_MODE0); // 20MHz
// SPISettings(ETH_PHY_SPI_FREQ_MHZ * 1000 * 1000, MSBFIRST, SPI_MODE0); // 20MHz
SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1);
init_ok = (ETH.begin((eth_phy_type_t)eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, SPI, ETH_PHY_SPI_FREQ_MHZ));
}