This code works perfectly except….. It ran for over an hour and a half. Then I shut everything down and came back about an hour later and nothing. The server is running (I can see and connect to the ssid). The server dhcp is handing out IP addresses just fine. But when I try to connect to the server through a web browser I get nothing, failure to connect.
/*
ESP32 WiFi AP Mode
http:://www.electronicwings.com
Adapted Mar 16, 2026 for specific project
Modified by: John Wright
*/
#include <WiFi.h>
const char* ssid = "Composter"; /*Set Your SSID*/
const char* password = "westviewHS"; /*Set Your Password*/
WiFiServer server(80); /* Instance of WiFiServer with port number 80 */
WiFiClient client;
IPAddress Ip(192, 168, 4, 1);
IPAddress NMask(255, 255, 255, 0);
String request;
#define LED 7
int LED_Status;
void setup(){
Serial.begin(115200);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Serial.println("ESP32 Access Point Mode");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
delay(100);
WiFi.softAPConfig(Ip, Ip, NMask);
Serial.print("Connect to IP address: ");
Serial.println(WiFi.softAPIP());
server.begin();
}
void html (){
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
client.println("<style>");
client.println("html { font-family: Roboto; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button {background-color: #4CAF50; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer;");
client.println("text-decoration: none; font-size: 25px; margin: 2px; cursor: pointer;}");
client.println(".button_ON {background-color: white; color: black; border: 2px solid #4CAF50;}");
client.println(".button_OFF {background-color: white; color: black; border: 2px solid #f44336;}");
client.println("</style>");
client.println("</head>");
client.println("<body>");
client.println("<h2>Composter Motor Controller</h2>");
client.println("<p>Click to start/stop rotating the Composter</p>");
if(LED_Status == LOW)
{
client.print("<p><a href=\"/LED_ON\n\"><button class=\"button button_ON\">ON</button></a></p>");
}
else
{
client.print("<p><a href=\"/LED_OFF\n\"><button class=\"button button_OFF\">OFF</button></a></p>");
}
client.println("</body>");
client.println("</html>");
}
void loop()
{
client = server.available();
if(!client)
{
return;
}
while (client.connected())
{
if (client.available())
{
char c = client.read();
request += c;
if (c == '\n')
{
if (request.indexOf("GET /LED_ON") != -1)
{
Serial.println("Motor Rotating");
digitalWrite(LED, HIGH);
LED_Status = HIGH;
}
if (request.indexOf("GET /LED_OFF") != -1)
{
Serial.println("Motor Stopped");
digitalWrite(LED, LOW);
LED_Status = LOW;
}
html();
break;
}
}
}
delay(1);
request="";
client.stop();
}
There is one error that shows up after the code is running, it shows up in the bottom window:
JmDNS(fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local.).Timer] WARN javax.jmdns.impl.tasks.resolver.DNSResolverTask - ServiceResolver(fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local.).run() exception
java.net.SocketException: Operation not permitted
at java.base/sun.nio.ch.DatagramChannelImpl.send0(Native Method)
at java.base/sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:1005)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:966)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:889)
at java.base/sun.nio.ch.DatagramChannelImpl.blockingSend(DatagramChannelImpl.java:952)
at java.base/sun.nio.ch.DatagramSocketAdaptor.send(DatagramSocketAdaptor.java:193)
at java.base/java.net.DatagramSocket.send(DatagramSocket.java:662)
at javax.jmdns.impl.JmDNSImpl.send(JmDNSImpl.java:1634)
at javax.jmdns.impl.tasks.resolver.DNSResolverTask.run(DNSResolverTask.java:73)
at java.base/java.util.TimerThread.mainLoop(Timer.java:566)
at java.base/java.util.TimerThread.run(Timer.java:516)
[fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local..recover()] WARN javax.jmdns.impl.JmDNSImpl - RECOVERING
[JmDNS(fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local.).State.Timer] WARN javax.jmdns.impl.tasks.state.DNSStateTask - Canceler(fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local.).run() exception
java.net.SocketException: Operation not permitted
at java.base/sun.nio.ch.DatagramChannelImpl.send0(Native Method)
at java.base/sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:1005)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:966)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:889)
at java.base/sun.nio.ch.DatagramChannelImpl.blockingSend(DatagramChannelImpl.java:952)
at java.base/sun.nio.ch.DatagramSocketAdaptor.send(DatagramSocketAdaptor.java:193)
at java.base/java.net.DatagramSocket.send(DatagramSocket.java:662)
at javax.jmdns.impl.JmDNSImpl.send(JmDNSImpl.java:1634)
at javax.jmdns.impl.tasks.state.DNSStateTask.run(DNSStateTask.java:131)
at java.base/java.util.TimerThread.mainLoop(Timer.java:566)
at java.base/java.util.TimerThread.run(Timer.java:516)
[fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local..recover()] WARN javax.jmdns.impl.DNSStatefulObject$DefaultImplementation - Wait for canceled timed out: DNS: fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local. [fe80:0:0:0:a34a:6ca0:cf83:1f9b%wlp2s0/fe80:0:0:0:a34a:6ca0:cf83:1f9b%wlp2s0] state: canceling 1 task: null
[fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local..recover()] WARN javax.jmdns.impl.JmDNSImpl - fe80-0-0-0-a34a-6ca0-cf83-1f9b-wlp2s0.local..recover() Could not recover we are Down!
[JmDNS(192-168-4-2.local.).Timer] WARN javax.jmdns.impl.tasks.resolver.DNSResolverTask - ServiceResolver(192-168-4-2.local.).run() exception
java.net.SocketException: Operation not permitted
at java.base/sun.nio.ch.DatagramChannelImpl.send0(Native Method)
at java.base/sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:1005)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:966)
at java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:889)
at java.base/sun.nio.ch.DatagramChannelImpl.blockingSend(DatagramChannelImpl.java:952)
at java.base/sun.nio.ch.DatagramSocketAdaptor.send(DatagramSocketAdaptor.java:193)
at java.base/java.net.DatagramSocket.send(DatagramSocket.java:662)
at javax.jmdns.impl.JmDNSImpl.send(JmDNSImpl.java:1634)
at javax.jmdns.impl.tasks.resolver.DNSResolverTask.run(DNSResolverTask.java:73)
at java.base/java.util.TimerThread.mainLoop(Timer.java:566)
at java.base/java.util.TimerThread.run(Timer.java:516)
[192-168-4-2.local..recover()] WARN javax.jmdns.impl.JmDNSImpl - RECOVERING
[JmDNS(192-168-4-2.local.).State.Timer] WARN javax.jmdns.impl.tasks.state.DNSStateTask - Canceler(192-168-4-2.local.).run() exception
java.net.SocketException: Operation not permitted
at
This keep repeating. I have no idea what this is trying to tell me. Any help appreciated.

