diff --git a/MyConfig.h b/MyConfig.h index c519f2745..f8c0f1707 100755 --- a/MyConfig.h +++ b/MyConfig.h @@ -1441,6 +1441,7 @@ //#define MY_GATEWAY_W5100 //#define MY_GATEWAY_ENC28J60 //#define MY_GATEWAY_ESP8266 +//#define MY_GATEWAY_BRIDGE //#define MY_GATEWAY_ESP32 //#define MY_GATEWAY_LINUX //#define MY_GATEWAY_TINYGSM @@ -2217,7 +2218,7 @@ * MY_IS_GATEWAY is true when @ref MY_GATEWAY_FEATURE is set. * MY_NODE_TYPE contain a string describing the class of sketch/node (gateway/repeater/node). */ -#if defined(MY_GATEWAY_SERIAL) || defined(MY_GATEWAY_W5100) || defined(MY_GATEWAY_ENC28J60) || defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32)|| defined(MY_GATEWAY_LINUX) || defined(MY_GATEWAY_MQTT_CLIENT) || defined(MY_GATEWAY_TINYGSM) +#if defined(MY_GATEWAY_SERIAL) || defined(MY_GATEWAY_W5100) || defined(MY_GATEWAY_ENC28J60) || defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_BRIDGE) || defined(MY_GATEWAY_ESP32)|| defined(MY_GATEWAY_LINUX) || defined(MY_GATEWAY_MQTT_CLIENT) || defined(MY_GATEWAY_TINYGSM) #define MY_GATEWAY_FEATURE #define MY_IS_GATEWAY (true) #define MY_NODE_TYPE "GW" @@ -2391,6 +2392,7 @@ #define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP #define MY_INCLUSION_LED_PIN #define MY_GATEWAY_W5100 +#define MY_GATEWAY_BRIDGE #define MY_GATEWAY_ENC28J60 #define MY_GATEWAY_ESP8266 #define MY_GATEWAY_ESP32 diff --git a/MySensors.h b/MySensors.h index f7d109a72..1dd81a117 100644 --- a/MySensors.h +++ b/MySensors.h @@ -230,7 +230,7 @@ MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs #define MY_REPEATER_FEATURE #endif -#if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32) +#if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32) || defined(MY_GATEWAY_BRIDGE) // GATEWAY - ESP8266 / ESP32 #include "core/MyGatewayTransportEthernet.cpp" #elif defined(MY_GATEWAY_LINUX) diff --git a/core/MyGatewayTransportEthernet.cpp b/core/MyGatewayTransportEthernet.cpp index fb148687d..37de90fbd 100644 --- a/core/MyGatewayTransportEthernet.cpp +++ b/core/MyGatewayTransportEthernet.cpp @@ -58,7 +58,11 @@ extern MyMessage _msgTmp; #endif #if defined(MY_IP_ADDRESS) +#if defined(MY_GATEWAY_BRIDGE) +#warning MY_IP_ADDRESS not used when Brigde gateway is configured, define IP Address in OpenWrt settings instead! +#else #define _ethernetGatewayIP IPAddress(MY_IP_ADDRESS) +#endif #if defined(MY_IP_GATEWAY_ADDRESS) #define _gatewayIp IPAddress(MY_IP_GATEWAY_ADDRESS) #elif defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32) @@ -95,12 +99,23 @@ typedef struct { #define EthernetUDP WiFiUDP #endif +#if defined(MY_GATEWAY_BRIDGE) +#define EthernetServer BridgeServer +#define EthernetClient BridgeClient +#define EthernetUDP BridgeUDP +#endif + #if defined(MY_GATEWAY_CLIENT_MODE) +#if defined (MY_GATEWAY_BRIDGE) +#error Client mode is not supported when MY_GATEWAY_BRIDGE is used! +#endif #if defined(MY_USE_UDP) EthernetUDP _ethernetServer; #endif /* End of MY_USE_UDP */ #elif defined(MY_GATEWAY_LINUX) /* Elif part of MY_GATEWAY_CLIENT_MODE */ EthernetServer _ethernetServer(_ethernetGatewayPort, MY_GATEWAY_MAX_CLIENTS); +#elif defined(MY_GATEWAY_BRIDGE) /* Elif part of MY_GATEWAY_BRIDGE */ +EthernetServer _ethernetServer = EthernetServer(_ethernetGatewayPort); #else /* Else part of MY_GATEWAY_CLIENT_MODE */ EthernetServer _ethernetServer(_ethernetGatewayPort); #endif /* End of MY_GATEWAY_CLIENT_MODE */ @@ -116,6 +131,9 @@ static EthernetClient client = EthernetClient(); static EthernetClient clients[MY_GATEWAY_MAX_CLIENTS]; static bool clientsConnected[MY_GATEWAY_MAX_CLIENTS]; static inputBuffer inputString[MY_GATEWAY_MAX_CLIENTS]; +#elif defined (MY_GATEWAY_BRIDGE) +static EthernetClient client = EthernetClient(); +static inputBuffer inputString; #else /* Else part of MY_GATEWAY_CLIENT_MODE */ static EthernetClient client = EthernetClient(); static inputBuffer inputString; @@ -179,6 +197,9 @@ bool gatewayTransportInit(void) GATEWAY_DEBUG(PSTR("GWT:TIN:IP: %s\n"), WiFi.localIP().toString().c_str()); #elif defined(MY_GATEWAY_LINUX) // Nothing to do here +#elif defined(MY_GATEWAY_BRIDGE) + GATEWAY_DEBUG(PSTR("GWT:TIN:BRIDGE BEGIN...\n")); + Bridge.begin(); #else #if defined(MY_IP_GATEWAY_ADDRESS) && defined(MY_IP_SUBNET_ADDRESS) // DNS server set to gateway ip @@ -200,7 +221,7 @@ bool gatewayTransportInit(void) delay(1000); #endif /* MY_GATEWAY_ESP8266 / MY_GATEWAY_ESP32 */ -#if defined(MY_GATEWAY_CLIENT_MODE) +#if defined(MY_GATEWAY_CLIENT_MODE) // LF# for Bridge? #if defined(MY_USE_UDP) _ethernetServer.begin(_ethernetGatewayPort); #else /* Else part of MY_USE_UDP */ @@ -227,6 +248,9 @@ bool gatewayTransportInit(void) _ethernetServer.begin(_ethernetGatewayIP); #else // we have to use pointers due to the constructor of EthernetServer +#if defined (MY_GATEWAY_BRIDGE) + _ethernetServer.noListenOnLocalhost(); +#endif _ethernetServer.begin(); #endif /* End of MY_GATEWAY_LINUX && MY_IP_ADDRESS */ #endif /* End of MY_GATEWAY_CLIENT_MODE */ @@ -236,11 +260,12 @@ bool gatewayTransportInit(void) } // cppcheck-suppress constParameter -bool gatewayTransportSend(MyMessage &message) +bool gatewayTransportSend(MyMessage& message) { int nbytes = 0; - char *_ethernetMessage = protocolMyMessage2Serial(message); - + char* _ethernetMessage = protocolMyMessage2Serial(message); + Serial.print(_ethernetMessage); + Serial.print("\n"); setIndication(INDICATION_GW_TX); _w5100_spi_en(true); @@ -251,7 +276,7 @@ bool gatewayTransportSend(MyMessage &message) #else _ethernetServer.beginPacket(_ethernetControllerIP, MY_PORT); #endif /* End of MY_CONTROLLER_URL_ADDRESS */ - _ethernetServer.write((uint8_t *)_ethernetMessage, strlen(_ethernetMessage)); + _ethernetServer.write((uint8_t*)_ethernetMessage, strlen(_ethernetMessage)); // returns 1 if the packet was sent successfully nbytes = _ethernetServer.endPacket(); #else /* Else part of MY_USE_UDP */ @@ -268,22 +293,27 @@ bool gatewayTransportSend(MyMessage &message) _w5100_spi_en(true); presentNode(); } else { - // connecting to the server failed! - GATEWAY_DEBUG(PSTR("!GWT:TPS:ETH FAIL\n")); - _w5100_spi_en(false); - return false; + // connecting to the server failed! + GATEWAY_DEBUG(PSTR("!GWT:TPS:ETH FAIL\n")); + _w5100_spi_en(false); + return false; + } } - } - nbytes = client.write((const uint8_t *)_ethernetMessage, strlen(_ethernetMessage)); + nbytes = client.write((const uint8_t*)_ethernetMessage, strlen(_ethernetMessage)); #endif /* End of MY_USE_UDP */ #else /* Else part of MY_GATEWAY_CLIENT_MODE */ // Send message to connected clients #if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32) for (uint8_t i = 0; i < ARRAY_SIZE(clients); i++) { if (clients[i] && clients[i].connected()) { - nbytes += clients[i].write((uint8_t *)_ethernetMessage, strlen(_ethernetMessage)); + nbytes += clients[i].write((uint8_t*)_ethernetMessage, strlen(_ethernetMessage)); } } +#elif defined(MY_GATEWAY_BRIDGE) + if (client && client.connected()) + { + nbytes += client.write((uint8_t*)_ethernetMessage, strlen(_ethernetMessage)); + } #else /* Else part of MY_GATEWAY_ESPxx*/ nbytes = _ethernetServer.write(_ethernetMessage); #endif /* End of MY_GATEWAY_ESPxx */ @@ -444,9 +474,14 @@ bool gatewayTransportAvailable(void) return true; } } -#else /* Else part of MY_GATEWAY_ESP8266 || MY_GATEWAY_LINUX */ +#else /* Else part of MY_GATEWAY_ESP8266 || MY_GATEWAY_LINUX || MY_GATEWAY_BRIDGE */ // W5100/ENC module does not have hasClient-method. We can only serve one client at the time. +#if defined (MY_GATEWAY_BRIDGE) + //Serial.print("gatewayTransportAvailable MY_GATEWAY_BRIDGE accept\n"); + EthernetClient newclient = _ethernetServer.accept(); +#else EthernetClient newclient = _ethernetServer.available(); +#endif // if a new client connects make sure to dispose any previous existing sockets if (newclient) { if (client != newclient) { @@ -459,6 +494,7 @@ bool gatewayTransportAvailable(void) presentNode(); } } + if (client) { if (!client.connected()) { GATEWAY_DEBUG(PSTR("!GWT:TSA:ETH FAIL\n")); diff --git a/keywords.txt b/keywords.txt index 70f5885e2..bf84e964a 100755 --- a/keywords.txt +++ b/keywords.txt @@ -250,6 +250,7 @@ MY_GATEWAY_CLIENT_MODE LITERAL1 MY_GATEWAY_ENC28J60 LITERAL1 MY_GATEWAY_ESP32 LITERAL1 MY_GATEWAY_ESP8266 LITERAL1 +MY_GATEWAY_BRIDGE LITERAL1 MY_GATEWAY_MQTT_CLIENT LITERAL1 MY_GATEWAY_SERIAL LITERAL1 MY_GATEWAY_W5100 LITERAL1