From 99925764e64713ad69af0cf6c94e489f8c087b9a Mon Sep 17 00:00:00 2001 From: rechrtb Date: Fri, 14 Oct 2022 16:01:29 +0800 Subject: [PATCH] Create proof-of-concept class for outgoing connections --- src/Networking/ESP8266WiFi/WiFiInterface.cpp | 6 +- src/Networking/HelloHiResponder.cpp | 79 ++++++++++++++++++++ src/Networking/HelloHiResponder.h | 26 +++++++ src/Networking/Network.cpp | 7 ++ src/Networking/Network.h | 2 + src/Networking/NetworkDefs.h | 11 ++- 6 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/Networking/HelloHiResponder.cpp create mode 100644 src/Networking/HelloHiResponder.h diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.cpp b/src/Networking/ESP8266WiFi/WiFiInterface.cpp index 70fd0fbb44..6d4ff32e61 100644 --- a/src/Networking/ESP8266WiFi/WiFiInterface.cpp +++ b/src/Networking/ESP8266WiFi/WiFiInterface.cpp @@ -300,7 +300,7 @@ WiFiInterface::WiFiInterface(Platform& p) noexcept for (size_t i = 0; i < NumProtocols; ++i) { portNumbers[i] = DefaultPortNumbers[i]; - protocolEnabled[i] = (i == HttpProtocol); + protocolEnabled[i] = (i == HttpProtocol) || (i == HelloHiProtocol); } strcpy(actualSsid, "(unknown)"); @@ -431,6 +431,10 @@ void WiFiInterface::StartProtocol(NetworkProtocol protocol) noexcept SendListenCommand(portNumbers[protocol], protocol, 1); break; + case HelloHiProtocol: + SendConnectCommand(portNumbers[protocol], protocol, 4094339264); + break; + default: break; } diff --git a/src/Networking/HelloHiResponder.cpp b/src/Networking/HelloHiResponder.cpp new file mode 100644 index 0000000000..fc52b5d05f --- /dev/null +++ b/src/Networking/HelloHiResponder.cpp @@ -0,0 +1,79 @@ +/* + * HelloHiResponder.cpp + */ + +#include "HelloHiResponder.h" +#include "Socket.h" + +HelloHiResponder::HelloHiResponder(NetworkResponder *n) noexcept : NetworkResponder(n), lastSend(0), lenRead(0) +{ + +} + +bool HelloHiResponder::Spin() noexcept +{ + switch (responderState) + { + case ResponderState::sending: + if (skt->CanSend() && (millis() - lastSend) > 500) + { + const char *greeting = "Hello!"; + skt->Send((const uint8_t*)greeting, strlen(greeting)); + responderState = ResponderState::reading; + return true; + } + break; + + case ResponderState::reading: + if (skt->CanRead()) + { + const char reply[] = "Hi!"; + + const uint8_t *buf; + size_t len = 0; + skt->ReadBuffer(buf, len); + skt->Taken(len); + + lenRead += len; + + if (lenRead == strlen(reply)) + { + responderState = ResponderState::sending; + lastSend = millis(); + lenRead = 0; + } + return true; + } + break; + + default: + break; + } + return false; +} + +bool HelloHiResponder::Accept(Socket *s, NetworkProtocol protocol) noexcept +{ + if (responderState == ResponderState::free && protocol == HelloHiProtocol) + { + skt = s; + responderState = ResponderState::sending; + lastSend = millis(); + lenRead = 0; + return true; + } + return false; +} + +void HelloHiResponder::Terminate(NetworkProtocol protocol, NetworkInterface *interface) noexcept +{ + if (responderState != ResponderState::free && (protocol == HelloHiProtocol || protocol == AnyProtocol) && skt != nullptr && skt->GetInterface() == interface) + { + lastSend = 0; + ConnectionLost(); + } +} + +void HelloHiResponder::Diagnostics(MessageType mt) const noexcept +{ +} diff --git a/src/Networking/HelloHiResponder.h b/src/Networking/HelloHiResponder.h new file mode 100644 index 0000000000..9294f4947e --- /dev/null +++ b/src/Networking/HelloHiResponder.h @@ -0,0 +1,26 @@ +/* + * HelloHiResponder.h + * + */ + +#ifndef SRC_NETWORKING_HELLOHIRESPONDER_H_ +#define SRC_NETWORKING_HELLOHIRESPONDER_H_ + +#include "NetworkResponder.h" + +class HelloHiResponder : public NetworkResponder +{ +public: + HelloHiResponder(NetworkResponder *n) noexcept; + + bool Spin() noexcept override; // do some work, returning true if we did anything significant + bool Accept(Socket *s, NetworkProtocol protocol) noexcept override; // ask the responder to accept this connection, returns true if it did + void Terminate(NetworkProtocol protocol, NetworkInterface *interface) noexcept override; // terminate the responder if it is serving the specified protocol on the specified interface + void Diagnostics(MessageType mtype) const noexcept override; + +private: + uint32_t lastSend; + uint8_t lenRead; +}; + +#endif /* SRC_NETWORKING_HELLOHIRESPONDER_H_ */ diff --git a/src/Networking/Network.cpp b/src/Networking/Network.cpp index 516f91d91c..cc8e1dbb2f 100644 --- a/src/Networking/Network.cpp +++ b/src/Networking/Network.cpp @@ -36,6 +36,8 @@ # include "RTOSPlusTCPEthernet/RTOSPlusTCPEthernetInterface.h" #endif +#include "HelloHiResponder.h" + #if SUPPORT_HTTP # include "HttpResponder.h" #endif @@ -461,6 +463,11 @@ void Network::Activate() noexcept MulticastResponder::Init(); #endif + for (size_t i = 0; i < NumHelloHiResponders; ++i) + { + responders = new HelloHiResponder(responders); + } + // Finally, create the network task networkTask.Create(NetworkLoop, "NETWORK", nullptr, TaskPriority::SpinPriority); #endif diff --git a/src/Networking/Network.h b/src/Networking/Network.h index 8548f2f7b6..c78babcd54 100644 --- a/src/Networking/Network.h +++ b/src/Networking/Network.h @@ -22,6 +22,8 @@ const size_t MaxNetworkInterfaces = 1; # error Wrong Network.h file included #endif +const size_t NumHelloHiResponders = 1; + #if defined(__LPC17xx__) // Only 2 http responders as we are tight on memory. const size_t NumHttpResponders = 2; // the number of concurrent HTTP requests we can process diff --git a/src/Networking/NetworkDefs.h b/src/Networking/NetworkDefs.h index d1f17b9eb9..99615dc584 100644 --- a/src/Networking/NetworkDefs.h +++ b/src/Networking/NetworkDefs.h @@ -36,7 +36,7 @@ constexpr IPAddress DefaultIpAddress; // will be initialised to 0 by construc constexpr IPAddress DefaultNetMask(0x00FFFFFF); // equivalent to 255.255.255.0. Use constexpr constructor to avoid it being allocated in RAM. constexpr IPAddress DefaultGateway; // will be initialised to 0 by constructor -constexpr size_t NumTcpProtocols = 3; +constexpr size_t NumTcpProtocols = 4; #if SUPPORT_MULTICAST_DISCOVERY constexpr size_t NumProtocols = NumTcpProtocols + 1; // number of network protocols we support, not counting FtpDataProtocol, MdnsProtocol or AnyProtocol @@ -44,11 +44,12 @@ constexpr size_t NumProtocols = NumTcpProtocols + 1; // number of network protoc constexpr size_t NumProtocols = NumTcpProtocols; // number of network protocols we support, not counting FtpDataProtocol, MdnsProtocol or AnyProtocol #endif -constexpr NetworkProtocol HttpProtocol = 0, FtpProtocol = 1, TelnetProtocol = 2, MulticastDiscoveryProtocol = 3, FtpDataProtocol = 3, MdnsProtocol = 4, AnyProtocol = 255; +constexpr NetworkProtocol HttpProtocol = 0, FtpProtocol = 1, TelnetProtocol = 2, MulticastDiscoveryProtocol = 3, FtpDataProtocol = 3, HelloHiProtocol = 3, MdnsProtocol = 4, AnyProtocol = 255; constexpr TcpPort DefaultHttpPort = 80; constexpr TcpPort DefaultFtpPort = 21; constexpr TcpPort DefaultTelnetPort = 23; +constexpr TcpPort DefaultHelloHiPort = 1883; #if SUPPORT_MULTICAST_DISCOVERY constexpr TcpPort DefaultMulticastDiscoveryPort = 10002; // this is actually a UDP port #endif @@ -57,15 +58,17 @@ constexpr TcpPort DefaultPortNumbers[NumProtocols] = { DefaultHttpPort, DefaultFtpPort, DefaultTelnetPort, #if SUPPORT_MULTICAST_DISCOVERY - DefaultMulticastDiscoveryPort + DefaultMulticastDiscoveryPort, #endif + DefaultHelloHiPort, }; constexpr const char *_ecv_array ProtocolNames[NumProtocols] = { "HTTP", "FTP", "TELNET", #if SUPPORT_MULTICAST_DISCOVERY - "Multicast Discovery" + "Multicast Discovery", #endif + "HiHello" }; constexpr uint8_t MdnsMacAddress[6] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0xFB };