/** * TEST SKETCH – Telnet Server (Minimal, keine externen Libraries) * * Testet ob WiFiServer / WiFiClient auf dem ESP32 korrekt funktioniert. * Keine Abhängigkeiten außer dem ESP32 Arduino Framework. * * Ablauf: * 1. Verbindet sich mit WLAN (Credentials in mqtt_test_secrets.h) * 2. Öffnet Telnet-Server auf Port 23 * 3. Sendet jede Sekunde einen Zähler über Serial UND Telnet * 4. Eingehende Telnet-Bytes werden auf Serial gespiegelt * * ENTHÄLT ArduinoOTA → nach dem Test kann per OTA zurückgeflasht werden! * * Flash: pio run -e test-telnet --target upload * Monitor: pio device monitor (USB Serial, 115200) * Telnet: telnet 23 oder PuTTY (Telnet, Port 23) * Zurück: pio run -e az-delivery-devkit-v4-ota --target upload * * Erwartetes Verhalten: * Serial + Telnet: "[TICK] uptime: 5 s, heap: 234560" jede Sekunde */ #include #include #include #include "mqtt_test_secrets.h" // TEST_WIFI_SSID, TEST_WIFI_PASSWORD // ----------------------------------------------------------------------- // WiFi-Zugangsdaten aus mqtt_test_secrets.h // Fehlermeldung falls nicht definiert // ----------------------------------------------------------------------- #ifndef TEST_WIFI_SSID #error "TEST_WIFI_SSID nicht definiert – bitte mqtt_test_secrets.h anlegen" #endif static WiFiServer telnetServer(23); static WiFiClient telnetClient; // ----------------------------------------------------------------------- void setup() { Serial.begin(115200); delay(500); Serial.println("\n[SETUP] Telnet-Test gestartet"); // WLAN verbinden Serial.printf("[SETUP] Verbinde mit SSID: %s ...\n", TEST_WIFI_SSID); WiFi.begin(TEST_WIFI_SSID, TEST_WIFI_PASSWORD); uint32_t t = millis(); while (WiFi.status() != WL_CONNECTED) { if (millis() - t > 15000) { Serial.println("[SETUP] FEHLER: WLAN-Verbindung nach 15s fehlgeschlagen!"); Serial.println("[SETUP] Gerät startet neu ..."); delay(1000); ESP.restart(); } delay(500); Serial.print("."); } Serial.printf("\n[SETUP] WiFi verbunden! IP: %s\n", WiFi.localIP().toString().c_str()); // ArduinoOTA starten (damit nach dem Test per OTA zurückgeflasht werden kann) ArduinoOTA.setHostname("lasercutter-display"); ArduinoOTA.begin(); Serial.println("[SETUP] ArduinoOTA aktiv"); // Telnet-Server starten telnetServer.begin(); telnetServer.setNoDelay(true); Serial.printf("[SETUP] Telnet-Server läuft auf Port 23\n"); Serial.printf("[SETUP] Verbinde mit: telnet %s 23\n", WiFi.localIP().toString().c_str()); } // ----------------------------------------------------------------------- void loop() { ArduinoOTA.handle(); // --- Neuen Client annehmen --- if (!telnetClient || !telnetClient.connected()) { WiFiClient newClient = telnetServer.available(); if (newClient) { telnetClient = newClient; telnetClient.setNoDelay(true); Serial.println("[TELNET] Client verbunden!"); telnetClient.println("[TELNET] Verbindung OK. Sekunden-Ticks folgen ..."); telnetClient.flush(); } } else { // Weiteren wartenden Client ablehnen WiFiClient extra = telnetServer.available(); if (extra) { extra.stop(); } // Eingehende Bytes auf Serial spiegeln while (telnetClient.available()) { char c = telnetClient.read(); Serial.print(c); } } // --- Jede Sekunde Tick senden --- static uint32_t lastTick = 0; static uint32_t counter = 0; if (millis() - lastTick >= 1000) { lastTick = millis(); counter++; char msg[80]; snprintf(msg, sizeof(msg), "[TICK] #%lu uptime: %lu s heap: %u\n", counter, millis() / 1000, ESP.getFreeHeap()); Serial.print(msg); if (telnetClient && telnetClient.connected()) { telnetClient.print(msg); telnetClient.flush(); } } }