mirror of https://github.com/arendst/Tasmota.git
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:
parent
8a8888a273
commit
2128dfbade
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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": "*"
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue