mirror of
				https://github.com/Show-maket/EthernetMaket.git
				synced 2025-10-30 02:12:43 +00:00 
			
		
		
		
	ini
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| **.vscode | ||||
							
								
								
									
										61
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| ## Внесение изменений для совместимости | ||||
|  | ||||
| Для обеспечения совместимости с библиотекой `Ethernet3` потребуется внести изменения в файлы `EthernetClient.h` и `EthernetUdp3.h`. Следуйте инструкциям ниже. | ||||
|  | ||||
| ### Изменение в `EthernetClient.h` | ||||
|  | ||||
| В файле `EthernetClient.h` замените доступ к переменным с `private` на `protected` для следующих элементов: | ||||
|  | ||||
| ```cpp | ||||
| class EthernetClient : public Client { | ||||
|   // ... | ||||
| protected: // <--- замените 'private' на 'protected' | ||||
|   static uint16_t _srcport; | ||||
|   uint8_t _sock; | ||||
| }; | ||||
| ``` | ||||
|  | ||||
| ### Изменение в `EthernetUdp3.h` | ||||
|  | ||||
| В файле `EthernetUdp3.h` также замените доступ к переменным с `private` на `protected`: | ||||
|  | ||||
| ```cpp | ||||
| class EthernetUDP : public UDP { | ||||
| protected: // <--- замените 'private' на 'protected' | ||||
|   uint8_t _sock;  // socket ID for Wiz5100 | ||||
|   // ... | ||||
| }; | ||||
| ``` | ||||
|  | ||||
| ### Изменение в `EthernetServer.h` | ||||
|  | ||||
| В файле `EthernetServer.h` также замените доступ к переменным с `private` на `protected`: | ||||
|  | ||||
| ```cpp | ||||
| class EthernetServer :  | ||||
| public Server { | ||||
| protected: // <--- замените 'private' на 'protected' | ||||
|   uint16_t _port; | ||||
|   void accept(); | ||||
| //... | ||||
| }; | ||||
| ``` | ||||
|  | ||||
| Эти изменения необходимы для обеспечения доступа к соответствующим членам класса при наследовании. | ||||
|  | ||||
| ## Обратите внимание | ||||
|  | ||||
| При работе с библиотекой `Ethernet3` версии 3 требуется отдельно указывать CS пин для инициализации. Пример кода: | ||||
|  | ||||
| ```cpp | ||||
| void setup() { | ||||
|     // ... | ||||
|     Ethernet.setCsPin(W5500_CS_PIN); | ||||
|     Ethernet.init(); | ||||
|     Ethernet.begin(mac, localIP, gateway, gateway, subnet); | ||||
|     // ... | ||||
| } | ||||
| ``` | ||||
|  | ||||
| Не забудьте правильно настроить `W5500_CS_PIN` и сетевые параметры (`mac`, `localIP`, `gateway`, `subnet`) в зависимости от вашей конфигурации. | ||||
| ``` | ||||
							
								
								
									
										184
									
								
								examples/Client/Client.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								examples/Client/Client.ino
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,184 @@ | ||||
| #include "EthernetMaket.h" // Предполагается, что этот файл подключает Ethernet3.h | ||||
|  | ||||
| // Настройки для W5500 | ||||
| #define W5500_CS_PIN PA2 // Пин для CS | ||||
| #define SOCKET_NUMBER 0  // Используем сокет 0 | ||||
| #define SERVER_PORT 1337 // Порт на сервере | ||||
| #define CLIENT_PORT 1337 // Порт клиента | ||||
|  | ||||
| #define ServerMac {0xDA, 0x7A, 0xFF, 0x00, 0x00, 0x00} | ||||
| #define ServerIP {192, 168, 254, 254} | ||||
|  | ||||
| #define IniMac {0xDA, 0x7A, 0xF0, 0x00, 0x00, 0x00} | ||||
| #define IniIP {192, 168, 254, 253} | ||||
|  | ||||
| uint8_t gateway[] = {192, 168, 0, 1}; // Шлюз | ||||
| uint8_t subnet[] = {255, 255, 0, 0};  // Маска подсети | ||||
|  | ||||
| uint8_t mac[] = IniMac;    // MAC-адрес | ||||
| uint8_t localIP[] = IniIP; // Локальный IP-адрес | ||||
|  | ||||
| uint8_t serverMac[] = ServerMac; // MAC-адрес сервера | ||||
| uint8_t serverIP[] = ServerIP;   // IP-адрес сервера | ||||
|  | ||||
| uint8_t buf[512]; // Буфер для передачи данных | ||||
|  | ||||
| unsigned long previousMillis = 0; // Для хранения времени последней отправки | ||||
| const long interval = 3750;       // Интервал отправки данных (1.75 секунды) | ||||
| uint32_t ttt; | ||||
|  | ||||
| EthernetServer server(SERVER_PORT); | ||||
| EthernetMaketClient client; | ||||
|  | ||||
| // EthernetMaketClient c; | ||||
|  | ||||
| uint32_t packetCounter = 0; | ||||
|  | ||||
| unsigned long lastActivityTime = 0; // Время последней активности | ||||
| const long timeout = 300;           // Таймаут неактивности в миллисекундах | ||||
|  | ||||
| bool wasConnected = false; | ||||
| bool dataReady = false; | ||||
|  | ||||
| void setup() | ||||
| { | ||||
|     Serial.begin(115200); | ||||
|     pinMode(LED_BUILTIN, OUTPUT); | ||||
|     Ethernet.setCsPin(W5500_CS_PIN); | ||||
|     Ethernet.init(); | ||||
|  | ||||
|     // Настройка Ethernet с указанием статических параметров | ||||
|     Ethernet.begin(mac, localIP, gateway, gateway, subnet); | ||||
|  | ||||
|     // Ethernet.setRtTimeOut(1000 * 10); | ||||
|     // Ethernet.setRtCount(3); | ||||
|  | ||||
|     // client.setNoDelayedACK(true); // Не ждать ответа от сервера | ||||
| } | ||||
|  | ||||
| void loop() | ||||
| { | ||||
|     uint32_t currentMillis = millis(); | ||||
|     if (currentMillis - ttt > 75) | ||||
|     { | ||||
|         digitalToggle(PC13); | ||||
|         ttt = currentMillis; // Обновляем время | ||||
|     } | ||||
|  | ||||
|     if (currentMillis - previousMillis >= interval) | ||||
|     { | ||||
|         previousMillis = currentMillis; | ||||
|  | ||||
|         Serial.println("\n\nConnecting..."); | ||||
|  | ||||
|         client.stop(); // Завершаем предыдущее соединение | ||||
|         dataReady = true; | ||||
|  | ||||
|     } | ||||
|  | ||||
|         // Подключаемся к серверу | ||||
|         ConnectionStatusSimple connectStatus; | ||||
|         bool isNonBlocking = true; // Флаг для определения режима подключения | ||||
|  | ||||
|         if (isNonBlocking) | ||||
|         { | ||||
|             connectStatus = client.connectNonBlock(serverIP, SERVER_PORT); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             connectStatus = (ConnectionStatusSimple)client.connect(serverIP, SERVER_PORT); | ||||
|         } | ||||
|  | ||||
|         if (connectStatus == CONNECT_SUCCESS) | ||||
|         { | ||||
|             Serial.print("Connection established in "); | ||||
|             Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); | ||||
|             //! Соединение установлено | ||||
|             lastActivityTime = millis(); // Обновляем время последней активности | ||||
|             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(); // Обновляем время последней активности | ||||
|             } | ||||
|             dataReady = false; | ||||
|             connectStatus = CONNECT_IDLE; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Serial.print("Failed to connect to server in "); | ||||
|             Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); | ||||
|             connectStatus = CONNECT_IDLE; | ||||
|             client.stop(); | ||||
|         } | ||||
|  | ||||
|     // Проверка наличия доступных данных от сервера | ||||
|     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"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Обновление состояния подключения | ||||
|     if (!wasConnected && client.connected()) | ||||
|     { | ||||
|         wasConnected = true; | ||||
|     } | ||||
|  | ||||
|     if (wasConnected && !client.connected()) | ||||
|     { | ||||
|         wasConnected = false; | ||||
|         client.stop(); | ||||
|         Serial.println("Client disconnected"); | ||||
|     } | ||||
|  | ||||
|     // Закрытие соединения по таймеру неактивности | ||||
|     if (client.connected() && (millis() - lastActivityTime > timeout)) | ||||
|     { | ||||
|         wasConnected = false; | ||||
|         Serial.println("Connection closed due to inactivity"); | ||||
|         client.stop(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										10
									
								
								library.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								library.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| name=MaketEthernet | ||||
| version=1.0.0 | ||||
| author=DashyFox | ||||
| maintainer=DashyFox@yandex.ru | ||||
| sentence= | ||||
| paragraph= | ||||
| category=Other | ||||
| url= | ||||
| architectures=* | ||||
| includes=CEthernetMaket.h | ||||
							
								
								
									
										21
									
								
								src/EthernetMaket.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/EthernetMaket.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| #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 | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| #include "EthernetOverride/TCP.h" | ||||
|  | ||||
|  | ||||
| #endif // __ETHERNETMAKET_H__ | ||||
							
								
								
									
										64
									
								
								src/EthernetOverride/Server.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								src/EthernetOverride/Server.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| #include "Server.h" | ||||
| #include "utility/w5500.h" | ||||
| #include "utility/socket.h" | ||||
|  | ||||
| void EthernetMaketServer::setServerHandler(std::function<void(EthernetMaketClient)> handler) | ||||
| { | ||||
|     serverHandler = handler; | ||||
| } | ||||
|  | ||||
| void EthernetMaketServer::resetServerHandler() | ||||
| { | ||||
|     serverHandler = [](EthernetMaketClient sclient) {}; | ||||
| } | ||||
|  | ||||
| EthernetMaketClient EthernetMaketServer::available(int sock) | ||||
| { | ||||
|     accept(sock); | ||||
|     EthernetMaketClient client(sock); | ||||
|     if (EthernetClass::_server_port[sock] == _port && | ||||
|         (client.status() == SnSR::ESTABLISHED || | ||||
|          client.status() == SnSR::CLOSE_WAIT)) | ||||
|     { | ||||
|         if (client.available()) | ||||
|         { | ||||
|             return client; | ||||
|         } | ||||
|     } | ||||
|     return EthernetMaketClient(MAX_SOCK_NUM); | ||||
| } | ||||
|  | ||||
| void EthernetMaketServer::accept(int sock) | ||||
| { | ||||
|     int listening = 0; | ||||
|     EthernetClient client(sock); | ||||
|  | ||||
|     if (EthernetClass::_server_port[sock] == _port) | ||||
|     { | ||||
|         if (client.status() == SnSR::LISTEN) | ||||
|         { | ||||
|             listening = 1; | ||||
|         } | ||||
|         else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) | ||||
|         { | ||||
|             client.stop(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!listening) | ||||
|     { | ||||
|         // begin(); | ||||
|         begin(sock); // added | ||||
|     } | ||||
| } | ||||
|  | ||||
| void EthernetMaketServer::begin(int sock) | ||||
| { | ||||
|     EthernetClient client(sock); | ||||
|     if (client.status() == SnSR::CLOSED) | ||||
|     { | ||||
|         socket(sock, SnMR::TCP, _port, 0); | ||||
|         listen(sock); | ||||
|         EthernetClass::_server_port[sock] = _port; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										24
									
								
								src/EthernetOverride/Server.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/EthernetOverride/Server.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| #ifndef __MAKET_SERVER_H__ | ||||
| #define __MAKET_SERVER_H__ | ||||
|  | ||||
| #include "Ethernet3.h" | ||||
| #include "TCP.h" | ||||
| #include <functional> | ||||
|  | ||||
| class EthernetMaketServer : EthernetServer | ||||
| { | ||||
| private: | ||||
|     EthernetClient available(); | ||||
|     void accept(int sock); | ||||
|     std::function<void(EthernetMaketClient)> serverHandler = [](EthernetMaketClient sclient){}; | ||||
|  | ||||
| public: | ||||
|     using EthernetServer::EthernetServer; | ||||
|     EthernetMaketClient available(int sock); | ||||
|  | ||||
|     void setServerHandler(std::function<void(EthernetMaketClient)> handler); | ||||
|     void resetServerHandler(); | ||||
|     void begin(int sock); | ||||
| }; | ||||
|  | ||||
| #endif // __MAKET_SERVER_H__ | ||||
							
								
								
									
										48
									
								
								src/EthernetOverride/TCP.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/EthernetOverride/TCP.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| #include "TCP.h" | ||||
| #include "utility/w5500.h" | ||||
| #include "utility/socket.h" | ||||
|  | ||||
| ConnectionStatusSimple EthernetMaketClient::connectNonBlock(IPAddress ip, uint16_t port) { | ||||
|   | ||||
|   if (_sock != MAX_SOCK_NUM) { | ||||
|     // Serial.println(F("connectNonBlock")); | ||||
|     uint8_t status_ = status(); | ||||
|     switch (status_) { | ||||
|       case SnSR::CLOSED: | ||||
|         // Serial.println(F("CLOSED")); | ||||
|         _sock = MAX_SOCK_NUM; | ||||
|         return CONNECT_FAIL; | ||||
|         break; | ||||
|       case SnSR::ESTABLISHED: | ||||
|         // Serial.println(F("ESTABLISHED")); | ||||
|         return CONNECT_SUCCESS; | ||||
|         break; | ||||
|       default: | ||||
|         // Serial.print(F("status ")); | ||||
|         // Serial.println(status_,HEX); | ||||
|         return CONNECT_CONNECTING; | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|   for (int i = 0; i < MAX_SOCK_NUM; i++) { | ||||
|     uint8_t s = w5500.readSnSR(i); | ||||
|     if (s == SnSR::CLOSED || s == SnSR::FIN_WAIT || s == SnSR::CLOSE_WAIT) { | ||||
|       _sock = i; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (_sock == MAX_SOCK_NUM) | ||||
|     return CONNECT_FAIL; | ||||
|  | ||||
|   _srcport++; | ||||
|   if (_srcport == 0) _srcport = 1024; | ||||
|   socket(_sock, SnMR::TCP, _srcport, 0); | ||||
|  | ||||
|   if (!::connect(_sock, rawIPAddress(ip), port)) { | ||||
|     _sock = MAX_SOCK_NUM; | ||||
|     return CONNECT_FAIL; | ||||
|   } | ||||
|    | ||||
|   return CONNECT_CONNECTING; | ||||
| } | ||||
							
								
								
									
										15
									
								
								src/EthernetOverride/TCP.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/EthernetOverride/TCP.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| #ifndef __MAKET_TCP_H__ | ||||
| #define __MAKET_TCP_H__ | ||||
|  | ||||
| #include "../EthernetMaket.h" | ||||
|  | ||||
| class EthernetMaketClient : public EthernetClient | ||||
| { | ||||
| public: | ||||
|     using EthernetClient::EthernetClient; | ||||
|  | ||||
|     ConnectionStatusSimple connectNonBlock(IPAddress ip, uint16_t port); | ||||
|  | ||||
|  | ||||
| }; | ||||
| #endif // __MAKET_TCP_H__ | ||||
							
								
								
									
										62
									
								
								src/EthernetOverride/UDP.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/EthernetOverride/UDP.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| #include "UDP.h" | ||||
|  | ||||
| #include "utility/w5500.h" | ||||
| #include "utility/socket.h" | ||||
|  | ||||
| void sendUDP_tick(SOCKET s, ConnectionStatusSimple &status) | ||||
| { | ||||
|   switch (status) | ||||
|   { | ||||
|   case CONNECT_START: | ||||
|     w5500.execCmdSn(s, Sock_SEND); | ||||
|     status = CONNECT_CONNECTING; | ||||
|     break; | ||||
|  | ||||
|   case CONNECT_CONNECTING: | ||||
|     if ((w5500.readSnIR(s) & SnIR::SEND_OK) != SnIR::SEND_OK) | ||||
|     { | ||||
|       if (w5500.readSnIR(s) & SnIR::TIMEOUT) | ||||
|       { | ||||
|         /* +2008.01 [bj]: clear interrupt */ | ||||
|         w5500.writeSnIR(s, (SnIR::SEND_OK | SnIR::TIMEOUT)); | ||||
|         status = CONNECT_FAIL; | ||||
|         break; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         status = CONNECT_CONNECTING; | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       status = CONNECT_SUCCESS; | ||||
|       w5500.writeSnIR(s, SnIR::SEND_OK); | ||||
|       break; | ||||
|     } | ||||
|     break; | ||||
|  | ||||
|   case CONNECT_FAIL: | ||||
|     status = CONNECT_IDLE; | ||||
|     break; | ||||
|   case CONNECT_SUCCESS: | ||||
|     status = CONNECT_IDLE; | ||||
|     break; | ||||
|   case CONNECT_IDLE: | ||||
|     break; | ||||
|  | ||||
|   default: | ||||
|     break; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void EthernetMaketUDP::endPacketNonBlock() | ||||
| { | ||||
|   _status = CONNECT_START; | ||||
|   sendUDP_tick(_sock, _status); | ||||
|   return; | ||||
| } | ||||
|  | ||||
| void EthernetMaketUDP::tick(){ | ||||
|   sendUDP_tick(_sock, _status); | ||||
| } | ||||
							
								
								
									
										15
									
								
								src/EthernetOverride/UDP.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/EthernetOverride/UDP.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| #ifndef __MAKET_UDP_H__ | ||||
| #define __MAKET_UDP_H__ | ||||
|  | ||||
| #include "../EthernetMaket.h" | ||||
| class EthernetMaketUDP : EthernetUDP | ||||
| { | ||||
| private: | ||||
|   ConnectionStatusSimple _status; // статус соединения | ||||
| public: | ||||
|     using EthernetUDP::EthernetUDP; | ||||
|     void endPacketNonBlock(); | ||||
|     void tick(); | ||||
| }; | ||||
|  | ||||
| #endif // __MAKET_UDP_H__ | ||||
		Reference in New Issue
	
	Block a user