diff --git a/examples/Server/Server.ino b/examples/Server/Server.ino new file mode 100644 index 0000000..84fdd13 --- /dev/null +++ b/examples/Server/Server.ino @@ -0,0 +1,121 @@ +#include +#include + +// Настройки для W5500 +#define W5500_CS_PIN PA2 // Пин для CS +#define SERVER_PORT 1337 // Порт на сервере + +byte mac[] = {0xDA, 0x7A, 0xFF, 0x00, 0x00, 0x00}; // MAC-адрес сервера +byte ip[] = {192, 168, 254, 254}; // IP-адрес сервера + +uint8_t gateway[] = {192, 168, 0, 1}; // Шлюз +uint8_t subnet[] = {255, 255, 0, 0}; // Маска подсети + +EthernetMaketServer server(SERVER_PORT); // Создаем сервер на указанном порту + +unsigned long previousMillis = 0; // Время последней отправки +const long interval = 1750; // Интервал отправки данных (1.75 секунды) +uint32_t packetCounter = 0; +uint32_t ttt; + +void serverHandler(EthernetClient client) +{ + //! + delay(10); // Ожидание окончания принятых данных, переделать в завершение по пакету финализации + byte buf[512]; + int len = client.read(buf, sizeof(buf)); + + // Обработка каждого 4-байтового пакета + for (int i = 0; i < len; i += 4) + { + int packetLen = min(4, len - i); // Определяем длину текущего пакета + processReceivedData(buf + i, packetLen); + for (uint8_t j = 0; j < 3; j++) + { + sendResponse(client, *(uint32_t *)(buf + i)); + } + packetCounter++; + } + + //!----------------- + Serial.println("DONE"); + client.stop(); + Serial.println(); + Serial.println(); +} + +void setup() +{ + Serial.begin(115200); + + // Инициализация SPI и Ethernet + SPI.begin(); + pinMode(W5500_CS_PIN, OUTPUT); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(W5500_CS_PIN, HIGH); + + // Инициализация Ethernet + Ethernet.setCsPin(W5500_CS_PIN); // Установка пина CS для W5500 + Ethernet.init(); + Ethernet.begin(mac, ip, subnet, gateway, gateway); + + // Запуск сервера + server.begin(); + server.setServerHandler(serverHandler); + Serial.print("Server is running at "); + Serial.println(Ethernet.localIP()); +} + +void loop() +{ + server.tick(); + uint32_t currentMillis = millis(); + + if (currentMillis - ttt > 75) + { + digitalToggle(PC13); + ttt = currentMillis; // Обновляем время + } +} + +// Обработка полученных данных +void processReceivedData(byte *data, int len) +{ + Serial.print("Received data: "); + for (int i = 0; i < len; i++) + { + Serial.print(data[i], HEX); + Serial.print(" "); + } + Serial.println(); +} + +// Отправка ответа клиенту +volatile void sendResponse(EthernetClient &client, uint32_t packetCount) +{ + byte response[16]; + + // Заполняем массив данных + for (int i = 0; i < 15; i++) + { + response[i] = (i + packetCount) % 256; // Пример данных + } + + // Вычисление контрольной суммы + uint8_t checksum = 0; + for (int i = 0; i < 15; i++) + { + checksum += response[i]; + } + response[15] = checksum; // Установка контрольной суммы + + // Отправка данных клиенту + client.write(response, sizeof(response)); + Serial.print("Send response: "); + for (int i = 0; i < 16; i++) + { + Serial.print(response[i], HEX); + Serial.print(" "); + } + Serial.println(); +} diff --git a/src/EthernetMaket.h b/src/EthernetMaket.h index be52b61..f6ab2b6 100644 --- a/src/EthernetMaket.h +++ b/src/EthernetMaket.h @@ -1,24 +1,8 @@ #ifndef __ETHERNETMAKET_H__ #define __ETHERNETMAKET_H__ -#include "Ethernet3.h" - - - -enum ConnectionStatusSimple{ - CONNECT_FAIL = 0, - CONNECT_SUCCESS = 1, - CONNECT_CONNECTING = 2, - CONNECT_START = 3, - CONNECT_IDLE = 4, - CONNECT_CONNECTED = 5, - CONNECT_STOP_START = 6, - CONNECT_STOP_WAITING = 7, -}; - - - +#include "EthernetOverride/Server.h" #include "EthernetOverride/TCP.h" - +#include "EthernetOverride/UDP.h" #endif // __ETHERNETMAKET_H__ \ No newline at end of file diff --git a/src/EthernetOverride/Server.cpp b/src/EthernetOverride/Server.cpp index adf374d..99f798c 100644 --- a/src/EthernetOverride/Server.cpp +++ b/src/EthernetOverride/Server.cpp @@ -61,4 +61,39 @@ void EthernetMaketServer::begin(int sock) listen(sock); EthernetClass::_server_port[sock] = _port; } +} + +void EthernetMaketServer::begin() +{ + EthernetServer::begin(); +} + +void EthernetMaketServer::tick() +{ + for (int sock = 0; sock < MAX_SOCK_NUM; sock++) + { + EthernetMaketClient sclient = available(sock); + if (sclient.connected() && sclient.available() > 0) + { + serverHandler(sclient); + } + // // Закрытие соединения по таймеру неактивности + // if (sclient.connected() && (millis() - lastActivityTime > timeout)) + // { + // Serial.println("Connection closed due to inactivity"); + // sclient.stop(); + // } + + // if (!wasConnected && sclient.connected()) + // { + // wasConnected[sock] = true; + // } + + // if (wasConnected && !sclient.connected()) + // { + // wasConnected[sock] = false; + // sclient.stop(); + // Serial.println("Client disconnected"); + // } + } } \ No newline at end of file diff --git a/src/EthernetOverride/Server.h b/src/EthernetOverride/Server.h index 239d5e0..7214e13 100644 --- a/src/EthernetOverride/Server.h +++ b/src/EthernetOverride/Server.h @@ -1,16 +1,17 @@ #ifndef __MAKET_SERVER_H__ #define __MAKET_SERVER_H__ -#include "Ethernet3.h" +#include "../util/config.h" #include "TCP.h" #include - +class EthernetMaketClient; class EthernetMaketServer : EthernetServer { private: EthernetClient available(); void accept(int sock); - std::function serverHandler = [](EthernetMaketClient sclient){}; + std::function serverHandler = [](EthernetMaketClient sclient) {}; + bool wasConnected[MAX_SOCK_NUM]; public: using EthernetServer::EthernetServer; @@ -18,7 +19,9 @@ public: void setServerHandler(std::function handler); void resetServerHandler(); + void begin() override; void begin(int sock); + void tick(); }; #endif // __MAKET_SERVER_H__ diff --git a/src/EthernetOverride/TCP.h b/src/EthernetOverride/TCP.h index 9609053..3d20ab3 100644 --- a/src/EthernetOverride/TCP.h +++ b/src/EthernetOverride/TCP.h @@ -1,7 +1,7 @@ #ifndef __MAKET_TCP_H__ #define __MAKET_TCP_H__ -#include "../EthernetMaket.h" +#include "../util/config.h" class EthernetMaketClient : public EthernetClient { diff --git a/src/EthernetOverride/UDP.h b/src/EthernetOverride/UDP.h index a720f01..a1dd613 100644 --- a/src/EthernetOverride/UDP.h +++ b/src/EthernetOverride/UDP.h @@ -1,7 +1,7 @@ #ifndef __MAKET_UDP_H__ #define __MAKET_UDP_H__ -#include "../EthernetMaket.h" +#include "../util/config.h" class EthernetMaketUDP : EthernetUDP { private: diff --git a/src/util/config.h b/src/util/config.h new file mode 100644 index 0000000..e9954a4 --- /dev/null +++ b/src/util/config.h @@ -0,0 +1,17 @@ +#ifndef __ETHERNET_MAKET_CONFIG_H__ +#define __ETHERNET_MAKET_CONFIG_H__ + +#include "Ethernet3.h" + +enum ConnectionStatusSimple{ + CONNECT_FAIL = 0, + CONNECT_SUCCESS = 1, + CONNECT_CONNECTING = 2, + CONNECT_START = 3, + CONNECT_IDLE = 4, + CONNECT_CONNECTED = 5, + CONNECT_STOP_START = 6, + CONNECT_STOP_WAITING = 7, +}; + +#endif // __ETHERNET_MAKET_CONFIG_H__ \ No newline at end of file