diff --git a/examples/Client/Client.ino b/examples/Client/Client.ino index 6884020..1a30d49 100644 --- a/examples/Client/Client.ino +++ b/examples/Client/Client.ino @@ -30,18 +30,8 @@ uint32_t ttt; EthernetServer server(SERVER_PORT); EthernetMaketClient client; -// EthernetMaketClient c; - uint32_t packetCounter = 0; -uint32_t lastActivityTime = 0; // Время последней активности -const uint16_t timeout = 300; // Таймаут неактивности в миллисекундах -uint32_t startConnection = 0; -const uint16_t connectionTimeout = 350; - -uint32_t stopStartTime = 0; // Время начала состояния CONNECT_IDLE -const uint32_t stopTimeout = 300; // Таймаут для закрытия сокета в состоянии CONNECT_IDLE - void setup() { Serial.begin(115200); @@ -58,7 +48,7 @@ void setup() // client.setNoDelayedACK(true); // Не ждать ответа от сервера } -ConnectionStatusSimple connectStatus = CONNECT_IDLE; + void loop() { uint32_t currentMillis = millis(); @@ -72,145 +62,11 @@ void loop() { previousMillis = currentMillis; // client.stop(); // Завершаем предыдущее соединение - connectStatus = CONNECT_START; + connectStatus = CONNECT_START; // функция коннекта + // client.connect(serverIP, SERVER_PORT); + client.setData(buf, sizeof(buf)); + client() } - // Подключаемся к серверу - - bool isNonBlocking = true; // Флаг для определения режима подключения - - switch (connectStatus) - { - case CONNECT_START: - startConnection = millis(); - connectStatus = CONNECT_CONNECTING; - client.close(); - Serial.println("\n\nConnecting..."); - break; - case CONNECT_CONNECTING: - if (millis() - startConnection >= connectionTimeout) - { - connectStatus = CONNECT_FAIL; - break; - } - break; - case CONNECT_FAIL: - Serial.print("Failed to connect to server in "); - Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); - connectStatus = CONNECT_STOP_START; - break; - case CONNECT_SUCCESS: - Serial.print("Connected to server in "); - Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); - lastActivityTime = millis(); - connectStatus = CONNECT_CONNECTED; - - //! Передача пакетов - for (size_t i = 0; i < 3; i++) - { - client.write((uint8_t *)&packetCounter, sizeof(packetCounter)); - - // Печать отправленного пакета - Serial.print("Sending packet: "); - for (size_t j = 0; j < sizeof(packetCounter); j++) - { - Serial.print(((uint8_t *)&packetCounter)[j], HEX); - Serial.print(" "); - } - Serial.println(); - packetCounter++; - lastActivityTime = millis(); // Обновляем время последней активности для каждого пакета - } - //! Передача завершена - - break; - case CONNECT_CONNECTED: - if (!client.connected()) - { - Serial.println("Client disconnected"); - connectStatus = CONNECT_STOP_START; - } - - // Закрытие соединения по таймеру неактивности - if (client.connected() && (millis() - lastActivityTime > timeout)) - { - Serial.println("Connection closed due to inactivity"); - connectStatus = CONNECT_STOP_START; - } - break; - - case CONNECT_STOP_START: - client.disconnect(); - stopStartTime = millis(); - connectStatus = CONNECT_STOP_WAITING; - break; - - case CONNECT_STOP_WAITING: - if (millis() - stopStartTime >= stopTimeout) - { - client.close(); // Закрываем сокет после таймаута - connectStatus = CONNECT_IDLE; - } - break; - - default: - break; - } - - switch (connectStatus) - { - case CONNECT_START: - case CONNECT_CONNECTING: - if (isNonBlocking) - { - connectStatus = client.connectNonBlock(serverIP, SERVER_PORT); - } - else - { - connectStatus = (ConnectionStatusSimple)client.connect(serverIP, SERVER_PORT); - } - break; - - default: - break; - } - - //? Проверка наличия доступных данных от сервера - if (client.available() > 0) - { - byte response[16]; - int len = client.read(response, sizeof(response)); - - if (len == 16) - { - // Проверка контрольной суммы - uint8_t checksum = 0; - for (int i = 0; i < 15; i++) - { - checksum += response[i]; - } - - Serial.print("RX: "); - for (int i = 0; i < 16; i++) - { - Serial.print(response[i], HEX); - Serial.print(" "); - } - - if (response[15] == checksum) - { - Serial.println("Checksum is OK"); - } - else - { - Serial.println("Checksum is ERROR"); - } - lastActivityTime = millis(); // Обновляем время последней активности - } - else - { - Serial.println("Received an incomplete response"); - } - } - //? ------------------------------------------------- + } \ No newline at end of file diff --git a/src/EthernetOverride/TCP.cpp b/src/EthernetOverride/TCP.cpp index 567d5bd..fb4bee3 100644 --- a/src/EthernetOverride/TCP.cpp +++ b/src/EthernetOverride/TCP.cpp @@ -60,27 +60,140 @@ void EthernetMaketClient::close(){ _sock = MAX_SOCK_NUM; } -// void EthernetMaketClient::stop() { -// if (_sock == MAX_SOCK_NUM) -// return; +void EthernetMaketClient::tick(){ + // Подключаемся к серверу + switch (connectStatus) + { + case CONNECT_START: + startConnection = millis(); + connectStatus = CONNECT_CONNECTING; + close(); + Serial.println("\n\nConnecting..."); + break; + case CONNECT_CONNECTING: + if (millis() - startConnection >= connectionTimeout) + { + connectStatus = CONNECT_FAIL; + break; + } + break; + case CONNECT_FAIL: + Serial.print("Failed to connect to server in "); + Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); + connectStatus = CONNECT_STOP_START; + break; + case CONNECT_SUCCESS: + Serial.print("Connected to server in "); + Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); + lastActivityTime = millis(); + connectStatus = CONNECT_CONNECTED; -// // attempt to close the connection gracefully (send a FIN to other side) -// disconnect(_sock); -// unsigned long start = millis(); + //! Передача пакетов + for (size_t i = 0; i < 3; i++) + { + client.write((uint8_t *)&packetCounter, sizeof(packetCounter)); -// // wait a second for the connection to close -// uint8_t s; -// do { -// s = status(); -// if (s == SnSR::CLOSED) -// break; // exit the loop -// delay(1); -// } while (millis() - start < 1000); + // Печать отправленного пакета + Serial.print("Sending packet: "); + for (size_t j = 0; j < sizeof(packetCounter); j++) + { + Serial.print(((uint8_t *)&packetCounter)[j], HEX); + Serial.print(" "); + } + Serial.println(); + packetCounter++; + lastActivityTime = millis(); // Обновляем время последней активности для каждого пакета + } + //! Передача завершена -// // if it hasn't closed, close it forcefully -// if (status() != SnSR::CLOSED) -// close(_sock); + break; + case CONNECT_CONNECTED: + if (!connected()) + { + Serial.println("Client disconnected"); + connectStatus = CONNECT_STOP_START; + } -// EthernetClass::_server_port[_sock] = 0; -// _sock = MAX_SOCK_NUM; -// } + // Закрытие соединения по таймеру неактивности + if (connected() && (millis() - lastActivityTime > timeout)) + { + Serial.println("Connection closed due to inactivity"); + connectStatus = CONNECT_STOP_START; + } + break; + + case CONNECT_STOP_START: + disconnect(); + stopStartTime = millis(); + connectStatus = CONNECT_STOP_WAITING; + break; + + case CONNECT_STOP_WAITING: + if (millis() - stopStartTime >= stopTimeout) + { + close(); // Закрываем сокет после таймаута + connectStatus = CONNECT_IDLE; + } + break; + + default: + break; + } + + switch (connectStatus) + { + case CONNECT_START: + case CONNECT_CONNECTING: + if (isNonBlocking) + { + connectStatus = connectNonBlock(serverIP, SERVER_PORT); + } + else + { + connectStatus = (ConnectionStatusSimple)connect(serverIP, SERVER_PORT); + } + break; + + default: + break; + } + + //? Проверка наличия доступных данных от сервера + if (available() > 0) + { + byte response[16]; + int len = read(response, sizeof(response)); + + if (len == 16) + { + // Проверка контрольной суммы + uint8_t checksum = 0; + for (int i = 0; i < 15; i++) + { + checksum += response[i]; + } + + Serial.print("RX: "); + for (int i = 0; i < 16; i++) + { + Serial.print(response[i], HEX); + Serial.print(" "); + } + + if (response[15] == checksum) + { + Serial.println("Checksum is OK"); + } + else + { + Serial.println("Checksum is ERROR"); + } + lastActivityTime = millis(); // Обновляем время последней активности + } + else + { + Serial.println("Received an incomplete response"); + } + } + //? ------------------------------------------------- +} diff --git a/src/EthernetOverride/TCP.h b/src/EthernetOverride/TCP.h index 3d20ab3..000672f 100644 --- a/src/EthernetOverride/TCP.h +++ b/src/EthernetOverride/TCP.h @@ -5,6 +5,17 @@ class EthernetMaketClient : public EthernetClient { +protected: + uint32_t lastActivityTime = 0; // Время последней активности + const uint16_t timeout = 300; // Таймаут неактивности в миллисекундах + uint32_t startConnection = 0; + const uint16_t connectionTimeout = 350; + uint32_t stopStartTime = 0; // Время начала состояния CONNECT_IDLE + const uint32_t stopTimeout = 300; // Таймаут для закрытия сокета в состоянии CONNECT_IDLE + + bool isNonBlocking = true; // Флаг для определения режима подключения + ConnectionStatusSimple connectStatus = CONNECT_IDLE; + public: using EthernetClient::EthernetClient; @@ -12,6 +23,6 @@ public: // void stop() override; void disconnect(); void close(); - + void tick(); }; #endif // __MAKET_TCP_H__ \ No newline at end of file diff --git a/todo b/todo new file mode 100644 index 0000000..98be9f7 --- /dev/null +++ b/todo @@ -0,0 +1 @@ +[] Проверить и отладить UDP \ No newline at end of file