#include #include #include #define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT #define ETH_PHY_POWER 12 #include #define blinkDuration 500 #define connectDuration 1000 #ifndef LIGHT_NUMBER #define LIGHT_NUMBER -1 #endif #define lampOutputPin 5 bool isBlinking = false; bool lampState = false; long blinkTimer = 0; long connectTimer = 0; bool foundIp = false; IPAddress ip; WebSocketsClient webSocket; static bool eth_connected = false; void WiFiEvent(WiFiEvent_t event) { switch (event) { case SYSTEM_EVENT_ETH_START: Serial.println("ETH Started"); // set eth hostname here ETH.setHostname("a2clight" + LIGHT_NUMBER); break; case SYSTEM_EVENT_ETH_CONNECTED: Serial.println("ETH Connected"); break; case SYSTEM_EVENT_ETH_GOT_IP: Serial.print("ETH MAC: "); Serial.print(ETH.macAddress()); Serial.print(", IPv4: "); Serial.print(ETH.localIP()); if (ETH.fullDuplex()) { Serial.print(", FULL_DUPLEX"); } Serial.print(", "); Serial.print(ETH.linkSpeed()); Serial.println("Mbps"); eth_connected = true; break; case SYSTEM_EVENT_ETH_DISCONNECTED: Serial.println("ETH Disconnected"); eth_connected = false; break; case SYSTEM_EVENT_ETH_STOP: Serial.println("ETH Stopped"); eth_connected = false; break; default: break; } } void blinkLamp() { isBlinking = true; } void noBlinkLamp() { isBlinking = false; lampState = false; digitalWrite(lampOutputPin, LOW); } void lampon() { isBlinking = false; digitalWrite(lampOutputPin, HIGH); } void lampoff() { isBlinking = false; digitalWrite(lampOutputPin, LOW); } void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) { switch (type) { case WStype_DISCONNECTED: Serial.println("[WSc] Disconnected!"); foundIp = false; break; case WStype_CONNECTED: { Serial.print("[WSc] Connected to controller"); webSocket.sendTXT("conlamp:" + String(LIGHT_NUMBER)); foundIp = true; } break; case WStype_TEXT: Serial.print("[WSc] get text:"); Serial.println((char *)payload); if (strcmp((char *)payload, "blinkLamp") == 0) { blinkLamp(); Serial.println("Enable Blinking!"); } else if (strcmp((char *)payload, "noBlinkLamp") == 0) { noBlinkLamp(); Serial.println("Disable Blinking!"); } else if (strcmp((char *)payload, "lampon") == 0) { lampon(); Serial.println("Lamp on!"); } else if (strcmp((char *)payload, "lampoff") == 0) { lampoff(); Serial.println("Lamp off!"); } break; } } void setup() { Serial.begin(115200); pinMode(lampOutputPin, OUTPUT); WiFi.onEvent(WiFiEvent); ETH.begin(); while (!eth_connected) { delay(1000); } if (!MDNS.begin("a2clight" + LIGHT_NUMBER)) { Serial.println("Error setting up MDNS responder!"); while (1) { delay(1000); } } } void browseService(const char *service, const char *proto) { Serial.printf("Browsing for service _%s._%s.local. ... ", service, proto); int n = MDNS.queryService(service, proto); if (n == 0) { Serial.println("no services found"); } else { Serial.print(n); Serial.println(" service(s) found"); for (int i = 0; i < n; ++i) { // Print details for each service found Serial.print(" "); Serial.print(i + 1); Serial.print(": "); Serial.print(MDNS.hostname(i)); Serial.print(" ("); Serial.print(MDNS.IP(i)); Serial.print(":"); Serial.print(MDNS.port(i)); Serial.println(")"); if (MDNS.hostname(i).startsWith("a2clcontroller")) { Serial.println("Trying to connect"); Serial.println(MDNS.IP(i)); foundIp = true; ip = MDNS.IP(i); webSocket.begin(ip.toString(), 80, "/ws"); webSocket.onEvent(webSocketEvent); // webSocket.setAuthorization("user", "Password"); webSocket.setReconnectInterval(500); webSocket.enableHeartbeat(1500, 2000, 2); } } } Serial.println(); } void loop() { if (!foundIp && eth_connected && ((millis() - connectTimer) > connectDuration)) { browseService("http", "tcp"); connectTimer = millis(); } if (foundIp) webSocket.loop(); if (isBlinking && millis() - blinkTimer > blinkDuration) { lampState = !lampState; digitalWrite(lampOutputPin, lampState); blinkTimer = millis(); } }