/* Wi-Fi STA Connect and Disconnect Example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include "_secret.h" #include #include #include #include #include #include #ifndef WIFI_SSID #error "You need to enter your wifi credentials. Copy secret.h to _secret.h and enter your credentials there." #endif // Enter your WIFI credentials in secret.h const char* ssid = WIFI_SSID; const char* password = WIFI_PASS; // hostname for mdns (psychic.local) const char* local_hostname = "psychic"; PsychicHttpServer server; PsychicWebSocketHandler websocketHandler; PsychicEventSource eventSource; const char* htmlContent = R"( Sample HTML

Hello, World!

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo dapibus elit, id varius sem dui id lacus.

)"; bool connectToWifi() { Serial.println(); Serial.print("[WiFi] Connecting to "); Serial.println(ssid); // WiFi.setSleep(false); // WiFi.useStaticBuffers(true); WiFi.begin(ssid, password); // Will try for about 10 seconds (20x 500ms) int tryDelay = 500; int numberOfTries = 20; // Wait for the WiFi event while (true) { switch (WiFi.status()) { case WL_NO_SSID_AVAIL: Serial.println("[WiFi] SSID not found"); break; case WL_CONNECT_FAILED: Serial.print("[WiFi] Failed - WiFi not connected! Reason: "); return false; break; case WL_CONNECTION_LOST: Serial.println("[WiFi] Connection was lost"); break; case WL_SCAN_COMPLETED: Serial.println("[WiFi] Scan is completed"); break; case WL_DISCONNECTED: Serial.println("[WiFi] WiFi is disconnected"); break; case WL_CONNECTED: Serial.println("[WiFi] WiFi is connected!"); Serial.print("[WiFi] IP address: "); Serial.println(WiFi.localIP()); return true; break; default: Serial.print("[WiFi] WiFi Status: "); Serial.println(WiFi.status()); break; } delay(tryDelay); if (numberOfTries <= 0) { Serial.print("[WiFi] Failed to connect to WiFi!"); // Use disconnect function to force stop trying to connect WiFi.disconnect(); return false; } else { numberOfTries--; } } return false; } void setup() { Serial.begin(115200); delay(10); Serial.println("PsychicHTTP Benchmark"); if (connectToWifi()) { // set up our esp32 to listen on the local_hostname.local domain if (!MDNS.begin(local_hostname)) { Serial.println("Error starting mDNS"); return; } MDNS.addService("http", "tcp", 80); if (!LittleFS.begin()) { Serial.println("LittleFS Mount Failed. Do Platform -> Build Filesystem Image and Platform -> Upload Filesystem Image from VSCode"); return; } // our index server.on("/", HTTP_GET, [](PsychicRequest* request, PsychicResponse* response) { return response->send(200, "text/html", htmlContent); }); // serve static files from LittleFS/www on / server.serveStatic("/", LittleFS, "/www/"); // a websocket echo server websocketHandler.onOpen([](PsychicWebSocketClient* client) { // client->sendMessage("Hello!"); }); websocketHandler.onFrame([](PsychicWebSocketRequest* request, httpd_ws_frame* frame) { response->send(frame); return ESP_OK; }); server.on("/ws", &websocketHandler); // EventSource server eventSource.onOpen([](PsychicEventSourceClient* client) { client->send("Hello", NULL, millis(), 1000); }); server.on("/events", &eventSource); // api - parameters passed in via query eg. /api/endpoint?foo=bar server.on("/api", HTTP_GET, [](PsychicRequest* request, PsychicResponse* response) { //create a response object JsonDocument output; output["msg"] = "status"; output["status"] = "success"; output["millis"] = millis(); //work with some params if (request->hasParam("foo")) { String foo = request->getParam("foo")->value(); output["foo"] = foo; } //serialize and return String jsonBuffer; serializeJson(output, jsonBuffer); return response->send(200, "application/json", jsonBuffer.c_str()); }); server.begin(); } } unsigned long last; void loop() { if (millis() - last > 1000) { Serial.printf("Free Heap: %d\n", esp_get_free_heap_size()); last = millis(); } }