#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); // Создаем сервер на указанном порту W5500Server server(0, 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)); Serial.print("sock: "); Serial.println(client.getSocketNumber()); processReceivedData(buf, len); // // Обработка каждого 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 w5500.softReset(); Ethernet.setCsPin(W5500_CS_PIN); // Установка пина CS для W5500 Ethernet.init(); Ethernet.begin(mac, ip, subnet, gateway, gateway); // Запуск сервера server.begin(); server.enableCloseOnTimeout(false); // server.setServerHandler(serverHandler); Serial.print("Server is running at "); Serial.println(Ethernet.localIP()); } void loop() { server.tick(); uint32_t currentMillis = millis(); if(Serial.available()){ uint8_t in = Serial.read(); switch (in) { case 's': // server.printSocketsState(); printSocketsState(); break; case 'b': // server.begin(7); break; default: break; } } 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(); } void printSocketsState(){ // if(s.length() > 0) // Serial.println(s); for (int i = 0; i < MAX_SOCK_NUM; i++) { uint8_t s = w5500.readSnSR(i); String state = ""; switch (s) { case 0x00: state = "CLOSED"; break; case 0x13: state = "INIT"; break; case 0x14: state = "LISTEN"; break; case 0x15: state = "SYNSENT"; break; case 0x16: state = "SYNRECV"; break; case 0x17: state = "ESTABLISHED"; break; case 0x18: state = "FIN_WAIT"; break; case 0x1A: state = "CLOSING"; break; case 0x1B: state = "TIME_WAIT"; break; case 0x1C: state = "CLOSE_WAIT"; break; case 0x1D: state = "LAST_ACK"; break; case 0x22: state = "UDP"; break; case 0x32: state = "IPRAW"; break; case 0x42: state = "MACRAW"; break; case 0x5F: state = "PPPOE"; break; default: state = "UNKNOWN"; break; } delay(1); Serial.print("SOCK <- "); Serial.print(i); Serial.print(" State: "); Serial.println(state); } }