From c0bdea0941bb40ec112cbbf1cfa1cbc09cea81fa Mon Sep 17 00:00:00 2001 From: Peter Kretz Date: Wed, 29 Apr 2020 12:21:20 +0200 Subject: [PATCH] - UDP / ESPEasyP2P now works for ETHERNET - Hostname Handling refactored for better overview: - String NetworkGetHostNameFromSettings() returns Settings.getHostname() - String NetworkCreateRFCCompliantHostname() creates a RFCcompliant Hostname from Settings.cpp - String NetworkGetHostname() returns the Hostname prevoiusly set in ETH or Wifi dependong on Mode - MacAddress Handling refactored - String NetworkMacAddress() returns the Mac addres of ETH or Wifi depending on Mode - String WifiSoftAPmacAddress() returns WiFi.softAPmacAddress(mac) as String --- src/ESPEasy.ino | 7 ++++- src/ESPEasyEth.cpp | 16 +++++++++-- src/ESPEasyNetwork.cpp | 53 +++++++++++++++++++++-------------- src/ESPEasyNetwork.h | 4 ++- src/ESPEasyWiFiEvent.cpp | 8 ------ src/ESPEasyWifi.cpp | 2 +- src/Networking.ino | 11 ++++---- src/StringProvider.ino | 10 ++----- src/WebServer_SysInfoPage.ino | 41 ++++++--------------------- src/_C014.ino | 2 +- src/src/Commands/Settings.cpp | 2 +- 11 files changed, 76 insertions(+), 80 deletions(-) diff --git a/src/ESPEasy.ino b/src/ESPEasy.ino index 8691172a5..28fcb2938 100644 --- a/src/ESPEasy.ino +++ b/src/ESPEasy.ino @@ -995,7 +995,12 @@ void backgroundtasks() if (webserverRunning) { web_server.handleClient(); } - if (WiFi.getMode() != WIFI_OFF) { + if (WiFi.getMode() != WIFI_OFF + // This makes UDP working for ETHERNET + #ifdef HAS_ETHERNET + || eth_connected + #endif + ) { checkUDP(); } } diff --git a/src/ESPEasyEth.cpp b/src/ESPEasyEth.cpp index e6b340911..feacd6c1a 100644 --- a/src/ESPEasyEth.cpp +++ b/src/ESPEasyEth.cpp @@ -1,9 +1,10 @@ -#include "ESPEasyEth.h" - #ifdef HAS_ETHERNET +#include "ESPEasyEth.h" +#include "ESPEasyNetwork.h" #include "ETH.h" #include "ESPEasy-Globals.h" +#include "eth_phy/phy.h" bool ethUseStaticIP() { return Settings.ETH_IP[0] != 0 && Settings.ETH_IP[3] != 255; @@ -53,6 +54,9 @@ bool ethPrepare() { addLog(LOG_LEVEL_ERROR, F("ETH: Settings not correct!!!")); return false; } + char hostname[40]; + safe_strncpy(hostname, NetworkCreateRFCCompliantHostname().c_str(), sizeof(hostname)); + ETH.setHostname(hostname); ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); ethSetupStaticIPconfig(); return true; @@ -98,6 +102,14 @@ void ethPrintSettings() { addLog(LOG_LEVEL_INFO, settingsDebugLog); } +String ETHMacAddress() { + uint8_t mac[6]; + char macStr[18] = { 0 }; + esp_eth_get_mac(mac); + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return String(macStr); +} + void ETHConnectRelaxed() { ethPrintSettings(); ETH.begin(Settings.ETH_Phy_Addr, diff --git a/src/ESPEasyNetwork.cpp b/src/ESPEasyNetwork.cpp index d91921cad..9b6b2b861 100644 --- a/src/ESPEasyNetwork.cpp +++ b/src/ESPEasyNetwork.cpp @@ -105,29 +105,13 @@ IPAddress NetworkDnsIP (uint8_t dns_no) { #endif } -uint8_t * NetworkMacAddressAsBytes(uint8_t* mac) { - #ifdef HAS_ETHERNET - if(eth_wifi_mode == ETHERNET) { - if(eth_connected) { - return WiFi.macAddress(mac); - } else { - addLog(LOG_LEVEL_ERROR, F("Call NetworkMacAddressAsBytes(uint8_t* mac) only on connected Ethernet!")); - return mac; - } - } else { - return WiFi.macAddress(mac); - } - #else - return WiFi.macAddress(mac); - #endif - return WiFi.macAddress(mac); -} - String NetworkMacAddress() { #ifdef HAS_ETHERNET if(eth_wifi_mode == ETHERNET) { if(!eth_connected) { addLog(LOG_LEVEL_ERROR, F("Call NetworkMacAddress() only on connected Ethernet!")); + } else { + return ETH.macAddress(); } } #endif @@ -140,16 +124,35 @@ String NetworkMacAddress() { return String(macaddress); } +uint8_t * NetworkMacAddressAsBytes(uint8_t* mac) { + return WiFi.macAddress(mac); +} + +String NetworkGetHostname() { + #ifdef ESP32 + #ifdef HAS_ETHERNET + if(Settings.ETH_Wifi_Mode == ETHERNET) { + return String(ETH.getHostname()); + } + return String(WiFi.getHostname()); + #else + return String(WiFi.getHostname()); + #endif + #else + return String(WiFi.hostname()); + #endif +} + // ******************************************************************************** // Determine Wifi AP name to set. (also used for mDNS) // ******************************************************************************** -String NetworkGetAPssid() +String NetworkGetHostNameFromSettings() { return Settings.getHostname(); } -String NetworkGetHostname() { - return createRFCCompliantHostname(NetworkGetAPssid()); +String NetworkCreateRFCCompliantHostname() { + return createRFCCompliantHostname(NetworkGetHostNameFromSettings()); } // Create hostname with - instead of spaces @@ -159,4 +162,12 @@ String createRFCCompliantHostname(String oldString) { result.replace(" ", "-"); result.replace("_", "-"); // See RFC952 return result; +} + +String WifiSoftAPmacAddress() { + uint8_t mac[] = { 0, 0, 0, 0, 0, 0 }; + uint8_t *macread = WiFi.softAPmacAddress(mac); + char macaddress[20]; + formatMAC(macread, macaddress); + return String(macaddress); } \ No newline at end of file diff --git a/src/ESPEasyNetwork.h b/src/ESPEasyNetwork.h index c9d14ad14..cdb774e85 100644 --- a/src/ESPEasyNetwork.h +++ b/src/ESPEasyNetwork.h @@ -11,9 +11,11 @@ IPAddress NetworkGatewayIP(); IPAddress NetworkDnsIP (uint8_t dns_no); uint8_t * NetworkMacAddressAsBytes(uint8_t* mac); String NetworkMacAddress(); -String NetworkGetAPssid(); +String NetworkGetHostNameFromSettings(); String NetworkGetHostname(); +String NetworkCreateRFCCompliantHostname(); String createRFCCompliantHostname(String oldString); +String WifiSoftAPmacAddress(); #endif // NETWORK_H \ No newline at end of file diff --git a/src/ESPEasyWiFiEvent.cpp b/src/ESPEasyWiFiEvent.cpp index 67c8f5b57..2b9c17e86 100644 --- a/src/ESPEasyWiFiEvent.cpp +++ b/src/ESPEasyWiFiEvent.cpp @@ -112,14 +112,6 @@ void WiFiEvent(system_event_id_t event, system_event_info_t info) { #ifdef HAS_ETHERNET case SYSTEM_EVENT_ETH_START: addLog(LOG_LEVEL_INFO, F("ETH Started")); - char hostname[40]; - safe_strncpy(hostname, NetworkGetHostname()).c_str(), sizeof(hostname)); - ETH.setHostname(hostname); - { - String log = F("ETH Hostname: "); - log += String(hostname); - addLog(LOG_LEVEL_INFO, log); - } break; case SYSTEM_EVENT_ETH_CONNECTED: addLog(LOG_LEVEL_INFO, F("ETH Connected")); diff --git a/src/ESPEasyWifi.cpp b/src/ESPEasyWifi.cpp index 279fc6068..05dff9d98 100644 --- a/src/ESPEasyWifi.cpp +++ b/src/ESPEasyWifi.cpp @@ -384,7 +384,7 @@ void setAPinternal(bool enable) if (enable) { // create and store unique AP SSID/PW to prevent ESP from starting AP mode with default SSID and No password! // setup ssid for AP Mode when needed - String softAPSSID = NetworkGetAPssid(); + String softAPSSID = NetworkCreateRFCCompliantHostname(); String pwd = SecuritySettings.WifiAPKey; IPAddress subnet(DEFAULT_AP_SUBNET); diff --git a/src/Networking.ino b/src/Networking.ino index d6fcd992f..eeb0f83c6 100644 --- a/src/Networking.ino +++ b/src/Networking.ino @@ -346,7 +346,8 @@ void sendSysInfoUDP(byte repeats) for (byte counter = 0; counter < repeats; counter++) { uint8_t mac[] = { 0, 0, 0, 0, 0, 0 }; - uint8_t *macread = WiFi.macAddress(mac); + uint8_t *macread = NetworkMacAddressAsBytes(mac); + byte data[80]; data[0] = 255; data[1] = 1; @@ -406,7 +407,7 @@ void SSDP_schema(WiFiClient& client) { return; } - const IPAddress ip = WiFi.localIP(); + const IPAddress ip = NetworkLocalIP(); const uint32_t chipId = ESP.getChipId(); char uuid[64]; sprintf_P(uuid, PSTR("38323636-4558-4dda-9188-cda0e6%02x%02x%02x"), @@ -498,7 +499,7 @@ bool SSDP_begin() { _server->ref(); ip_addr_t ifaddr; - ifaddr.addr = WiFi.localIP(); + ifaddr.addr = NetworkLocalIP(); ip_addr_t multicast_addr; multicast_addr.addr = (uint32_t)SSDP_MULTICAST_ADDR; @@ -544,7 +545,7 @@ bool SSDP_begin() { Send SSDP messages (notify & responses) \*********************************************************************************************/ void SSDP_send(byte method) { - uint32_t ip = WiFi.localIP(); + uint32_t ip = NetworkLocalIP(); // FIXME TD-er: Why create String objects of these flashstrings? String _ssdp_response_template = F( @@ -563,7 +564,7 @@ void SSDP_send(byte method) { "CACHE-CONTROL: max-age=%u\r\n" // SSDP_INTERVAL "SERVER: Arduino/1.0 UPNP/1.1 ESPEasy/%u\r\n" // _modelNumber "USN: uuid:%s\r\n" // _uuid - "LOCATION: http://%u.%u.%u.%u:80/ssdp.xml\r\n" // WiFi.localIP(), + "LOCATION: http://%u.%u.%u.%u:80/ssdp.xml\r\n" // NetworkLocalIP(), "\r\n"); { char uuid[64] = { 0 }; diff --git a/src/StringProvider.ino b/src/StringProvider.ino index a4d0d8319..618e92824 100644 --- a/src/StringProvider.ino +++ b/src/StringProvider.ino @@ -127,12 +127,8 @@ String getValue(LabelType::Enum label) { { case LabelType::UNIT_NR: return String(Settings.Unit); case LabelType::UNIT_NAME: return String(Settings.Name); // Only return the set name, no appended unit. - case LabelType::HOST_NAME: - #ifdef ESP32 - return WiFi.getHostname(); - #else - return WiFi.hostname(); - #endif + case LabelType::HOST_NAME: return NetworkGetHostname(); + case LabelType::LOCAL_TIME: return node_time.getDateTimeString('-',':',' '); case LabelType::UPTIME: return String(wdcounter / 2); @@ -172,7 +168,7 @@ String getValue(LabelType::Enum label) { case LabelType::DNS_2: return NetworkDnsIP(1).toString(); case LabelType::ALLOWED_IP_RANGE: return describeAllowedIPrange(); case LabelType::STA_MAC: return NetworkMacAddress(); - case LabelType::AP_MAC: break; + case LabelType::AP_MAC: return WifiSoftAPmacAddress(); case LabelType::SSID: return WiFi.SSID(); case LabelType::BSSID: return WiFi.BSSIDstr(); case LabelType::CHANNEL: return String(WiFi.channel()); diff --git a/src/WebServer_SysInfoPage.ino b/src/WebServer_SysInfoPage.ino index ebc5b6a29..0e49534f6 100644 --- a/src/WebServer_SysInfoPage.ino +++ b/src/WebServer_SysInfoPage.ino @@ -66,24 +66,13 @@ void handle_sysinfo_json() { json_prop(F("dns1"), formatIP(NetworkDnsIP(0))); json_prop(F("dns2"), formatIP(NetworkDnsIP(1))); json_prop(F("allowed_range"), describeAllowedIPrange()); - - - uint8_t mac[] = { 0, 0, 0, 0, 0, 0 }; - uint8_t *macread = WiFi.macAddress(mac); - char macaddress[20]; - formatMAC(macread, macaddress); - - json_prop(F("sta_mac"), macaddress); - - macread = WiFi.softAPmacAddress(mac); - formatMAC(macread, macaddress); - - json_prop(F("ap_mac"), macaddress); - json_prop(F("ssid"), WiFi.SSID()); - json_prop(F("bssid"), WiFi.BSSIDstr()); - json_number(F("channel"), String(WiFi.channel())); - json_prop(F("connected"), format_msec_duration(timeDiff(lastConnectMoment, millis()))); - json_prop(F("ldr"), getLastDisconnectReason()); + json_prop(F("sta_mac"), NetworkMacAddress()); + json_prop(F("ap_mac"), WifiSoftAPmacAddress()); + json_prop(F("ssid"), WiFi.SSID()); + json_prop(F("bssid"), WiFi.BSSIDstr()); + json_number(F("channel"), String(WiFi.channel())); + json_prop(F("connected"), format_msec_duration(timeDiff(lastConnectMoment, millis()))); + json_prop(F("ldr"), getLastDisconnectReason()); json_number(F("reconnects"), String(wifi_reconnects)); json_close(); @@ -391,20 +380,8 @@ void handle_sysinfo_Network() { addRowLabelValue(LabelType::CLIENT_IP); addRowLabelValue(LabelType::DNS); addRowLabelValue(LabelType::ALLOWED_IP_RANGE); - addRowLabel(getLabel(LabelType::STA_MAC)); - - { - uint8_t mac[] = { 0, 0, 0, 0, 0, 0 }; - uint8_t *macread = WiFi.macAddress(mac); - char macaddress[20]; - formatMAC(macread, macaddress); - addHtml(macaddress); - - addRowLabel(getLabel(LabelType::AP_MAC)); - macread = WiFi.softAPmacAddress(mac); - formatMAC(macread, macaddress); - addHtml(macaddress); - } + addRowLabelValue(LabelType::STA_MAC); + addRowLabelValue(LabelType::AP_MAC); addRowLabel(getLabel(LabelType::SSID)); { diff --git a/src/_C014.ino b/src/_C014.ino index 1e668d252..d8588d232 100644 --- a/src/_C014.ino +++ b/src/_C014.ino @@ -246,7 +246,7 @@ bool CPlugin_014(CPlugin::Function function, struct EventStruct *event, String& CPlugin_014_sendMQTTdevice(pubname,"$localip",formatIP(NetworkLocalIP()).c_str(),errorCounter); // $mac Device → Controller Mac address of the device network interface. The format MUST be of the type A1:B2:C3:D4:E5:F6 Yes Yes - CPlugin_014_sendMQTTdevice(pubname,"$mac",WiFi.macAddress().c_str(),errorCounter); + CPlugin_014_sendMQTTdevice(pubname,"$mac",NetworkMacAddress().c_str(),errorCounter); // $implementation Device → Controller An identifier for the Homie implementation (example esp8266) Yes Yes #if defined(ESP8266) diff --git a/src/src/Commands/Settings.cpp b/src/src/Commands/Settings.cpp index 00637baab..23022d996 100644 --- a/src/src/Commands/Settings.cpp +++ b/src/src/Commands/Settings.cpp @@ -71,7 +71,7 @@ String Command_Settings_Print(struct EventStruct *event, const char* Line) serialPrintln(); serialPrintln(F("System Info")); - serialPrint(F(" IP Address : ")); serialPrintln(WiFi.localIP().toString()); + serialPrint(F(" IP Address : ")); serialPrintln(NetworkLocalIP().toString()); serialPrint(F(" Build : ")); serialPrintln(String((int)BUILD)); serialPrint(F(" Name : ")); serialPrintln(Settings.Name); serialPrint(F(" Unit : ")); serialPrintln(String((int)Settings.Unit));