mirror of
				https://github.com/Show-maket/EthernetMaket.git
				synced 2025-10-30 02:12:43 +00:00 
			
		
		
		
	tcp fix
This commit is contained in:
		| @ -30,18 +30,8 @@ uint32_t ttt; | |||||||
| EthernetServer server(SERVER_PORT); | EthernetServer server(SERVER_PORT); | ||||||
| EthernetMaketClient client; | EthernetMaketClient client; | ||||||
|  |  | ||||||
| // EthernetMaketClient c; |  | ||||||
|  |  | ||||||
| uint32_t packetCounter = 0; | 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() | void setup() | ||||||
| { | { | ||||||
|     Serial.begin(115200); |     Serial.begin(115200); | ||||||
| @ -58,7 +48,7 @@ void setup() | |||||||
|     // client.setNoDelayedACK(true); // Не ждать ответа от сервера |     // client.setNoDelayedACK(true); // Не ждать ответа от сервера | ||||||
| } | } | ||||||
|  |  | ||||||
| ConnectionStatusSimple connectStatus = CONNECT_IDLE; |  | ||||||
| void loop() | void loop() | ||||||
| { | { | ||||||
|     uint32_t currentMillis = millis(); |     uint32_t currentMillis = millis(); | ||||||
| @ -72,145 +62,11 @@ void loop() | |||||||
|     { |     { | ||||||
|         previousMillis = currentMillis; |         previousMillis = currentMillis; | ||||||
|         // client.stop(); // Завершаем предыдущее соединение |         // 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"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     //? ------------------------------------------------- |  | ||||||
| } | } | ||||||
| @ -60,27 +60,140 @@ void EthernetMaketClient::close(){ | |||||||
|     _sock = MAX_SOCK_NUM; |     _sock = MAX_SOCK_NUM; | ||||||
| } | } | ||||||
|  |  | ||||||
| // void EthernetMaketClient::stop() { | void EthernetMaketClient::tick(){ | ||||||
| //   if (_sock == MAX_SOCK_NUM) |   // Подключаемся к серверу | ||||||
| //     return; |     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); |         for (size_t i = 0; i < 3; i++) | ||||||
| //   unsigned long start = millis(); |         { | ||||||
|  |             client.write((uint8_t *)&packetCounter, sizeof(packetCounter)); | ||||||
|  |  | ||||||
| //   // wait a second for the connection to close |             // Печать отправленного пакета | ||||||
| //   uint8_t s; |             Serial.print("Sending packet: "); | ||||||
| //    do { |             for (size_t j = 0; j < sizeof(packetCounter); j++) | ||||||
| //      s = status(); |             { | ||||||
| //      if (s == SnSR::CLOSED) |                 Serial.print(((uint8_t *)&packetCounter)[j], HEX); | ||||||
| //      break; // exit the loop |                 Serial.print(" "); | ||||||
| //      delay(1); |             } | ||||||
| //    } while (millis() - start < 1000); |             Serial.println(); | ||||||
|  |             packetCounter++; | ||||||
|  |             lastActivityTime = millis(); // Обновляем время последней активности для каждого пакета | ||||||
|  |         } | ||||||
|  |         //! Передача завершена | ||||||
|  |  | ||||||
| //   // if it hasn't closed, close it forcefully |         break; | ||||||
| //   if (status() != SnSR::CLOSED) |     case CONNECT_CONNECTED: | ||||||
| //     close(_sock); |         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"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     //? ------------------------------------------------- | ||||||
|  | } | ||||||
|  | |||||||
| @ -5,6 +5,17 @@ | |||||||
|  |  | ||||||
| class EthernetMaketClient : public EthernetClient | 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: | public: | ||||||
|     using EthernetClient::EthernetClient; |     using EthernetClient::EthernetClient; | ||||||
|  |  | ||||||
| @ -12,6 +23,6 @@ public: | |||||||
|     // void stop() override; |     // void stop() override; | ||||||
|     void disconnect(); |     void disconnect(); | ||||||
|     void close(); |     void close(); | ||||||
|  |     void tick(); | ||||||
| }; | }; | ||||||
| #endif // __MAKET_TCP_H__ | #endif // __MAKET_TCP_H__ | ||||||
		Reference in New Issue
	
	Block a user