This commit is contained in:
DashyFox 2024-11-14 10:36:25 +03:00
parent b374b5a260
commit 4d3d44d03a
4 changed files with 152 additions and 171 deletions

View File

@ -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");
}
}
//? -------------------------------------------------
}

View File

@ -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");
}
}
//? -------------------------------------------------
}

View File

@ -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__

1
todo Normal file
View File

@ -0,0 +1 @@
[] Проверить и отладить UDP