|
|
|
|
|
|
|
|
#include <WebSocketsServer.h> |
|
|
#include <WebSocketsServer.h> |
|
|
#include <EEPROM.h> |
|
|
#include <EEPROM.h> |
|
|
#include <DNSServer.h> |
|
|
#include <DNSServer.h> |
|
|
|
|
|
#include "States.h" |
|
|
|
|
|
|
|
|
const int ledPin = LED_BUILTIN; // The built-in LED on the Wemos D1 Mini is on GPIO2 (D4) |
|
|
|
|
|
|
|
|
|
|
|
ESP8266WebServer webServer(80); |
|
|
|
|
|
WebSocketsServer webSocket(81); |
|
|
|
|
|
DNSServer dnsServer; |
|
|
|
|
|
|
|
|
AppState state = STATE_BOOT; |
|
|
|
|
|
unsigned long connectStart = 0; |
|
|
|
|
|
|
|
|
|
|
|
const int ledPin = LED_BUILTIN; // The built-in LED on the Wemos D1 Mini is on GPIO2 (D4) |
|
|
const byte DNS_PORT = 53; |
|
|
const byte DNS_PORT = 53; |
|
|
|
|
|
|
|
|
// AP Daten |
|
|
// AP Daten |
|
|
|
|
|
|
|
|
bool valid; |
|
|
bool valid; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
ESP8266WebServer webServer(80); |
|
|
|
|
|
WebSocketsServer webSocket(81); |
|
|
|
|
|
DNSServer dnsServer; |
|
|
Config config; |
|
|
Config config; |
|
|
|
|
|
|
|
|
// ---------- EEPROM ---------- |
|
|
// ---------- EEPROM ---------- |
|
|
|
|
|
|
|
|
void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) { |
|
|
void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) { |
|
|
|
|
|
|
|
|
switch (type) { |
|
|
switch (type) { |
|
|
|
|
|
|
|
|
case WStype_CONNECTED: { |
|
|
case WStype_CONNECTED: { |
|
|
|
|
|
|
|
|
IPAddress ip = webSocket.remoteIP(num); |
|
|
IPAddress ip = webSocket.remoteIP(num); |
|
|
|
|
|
|
|
|
Serial.printf( |
|
|
|
|
|
"WS Client %u verbunden von %d.%d.%d.%d\n", |
|
|
|
|
|
num, |
|
|
|
|
|
ip[0], ip[1], ip[2], ip[3]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Serial.printf("WS Client %u verbunden von %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]); |
|
|
webSocket.sendTXT(num, "Connected"); |
|
|
webSocket.sendTXT(num, "Connected"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
case WStype_TEXT: { |
|
|
case WStype_TEXT: { |
|
|
|
|
|
|
|
|
String msg = String((char*) payload); |
|
|
String msg = String((char*) payload); |
|
|
|
|
|
|
|
|
Serial.print("WS empfangen: "); |
|
|
Serial.print("WS empfangen: "); |
|
|
Serial.println(msg); |
|
|
Serial.println(msg); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void setState(AppState newState) { |
|
|
|
|
|
Serial.printf("STATE %s -> %s\n", stateToString(state), stateToString(newState)); |
|
|
|
|
|
state = newState; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleBoot() { |
|
|
|
|
|
|
|
|
|
|
|
if (config.valid) { |
|
|
|
|
|
WiFi.mode(WIFI_STA); |
|
|
|
|
|
WiFi.begin(config.ssid, config.pass); |
|
|
|
|
|
setState(STATE_CONNECTING); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
startAP(); |
|
|
|
|
|
setState(STATE_AP_MODE); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleConnecting() { |
|
|
|
|
|
|
|
|
|
|
|
if (WiFi.status() == WL_CONNECTED) { |
|
|
|
|
|
startSTAWebServer(); |
|
|
|
|
|
setState(STATE_STA_MODE); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (millis() - connectStart > 10000) { |
|
|
|
|
|
Serial.println("Connect Timeout"); |
|
|
|
|
|
startAP(); |
|
|
|
|
|
setState(STATE_AP_MODE); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleAPMode() { |
|
|
|
|
|
dnsServer.processNextRequest(); |
|
|
|
|
|
webServer.handleClient(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleSTAMode() { |
|
|
|
|
|
webServer.handleClient(); |
|
|
|
|
|
webSocket.loop(); |
|
|
|
|
|
|
|
|
|
|
|
if (WiFi.status() != WL_CONNECTED) { |
|
|
|
|
|
Serial.println("WLAN verloren"); |
|
|
|
|
|
WiFi.begin(config.ssid, config.pass); |
|
|
|
|
|
connectStart = millis(); |
|
|
|
|
|
setState(STATE_CONNECTING); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleError() { |
|
|
|
|
|
digitalWrite(ledPin, LOW); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void startSTAWebServer() |
|
|
|
|
|
{ |
|
|
|
|
|
Serial.println("Starte STA Services"); |
|
|
|
|
|
|
|
|
|
|
|
// Webseite |
|
|
|
|
|
webServer.on("/", handleRoot); |
|
|
|
|
|
|
|
|
|
|
|
// optional |
|
|
|
|
|
webServer.on("/save", HTTP_POST, handleSave); |
|
|
|
|
|
webServer.begin(); |
|
|
|
|
|
|
|
|
|
|
|
// WebSocket |
|
|
|
|
|
webSocket.begin(); |
|
|
|
|
|
webSocket.onEvent(webSocketEvent); |
|
|
|
|
|
|
|
|
|
|
|
Serial.print("HTTP Server: http://"); |
|
|
|
|
|
Serial.println(WiFi.localIP()); |
|
|
|
|
|
|
|
|
|
|
|
Serial.print("WebSocket: ws://"); |
|
|
|
|
|
Serial.print(WiFi.localIP()); |
|
|
|
|
|
Serial.println(":81/"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ---------- SETUP ---------- |
|
|
// ---------- SETUP ---------- |
|
|
void setup() { |
|
|
void setup() { |
|
|
Serial.begin(115200); |
|
|
Serial.begin(115200); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loadConfig(); |
|
|
loadConfig(); |
|
|
|
|
|
|
|
|
if (config.valid && connectSTA()) { |
|
|
|
|
|
Serial.println("STA Mode aktiv"); |
|
|
|
|
|
} else { |
|
|
|
|
|
Serial.println(); |
|
|
|
|
|
Serial.println(); |
|
|
|
|
|
Serial.println("Starte Captive Portal"); |
|
|
|
|
|
startAP(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
setState(STATE_BOOT); |
|
|
|
|
|
connectStart = millis(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// ---------- LOOP ---------- |
|
|
// ---------- LOOP ---------- |
|
|
void loop() { |
|
|
void loop() { |
|
|
|
|
|
|
|
|
if (WiFi.getMode() == WIFI_AP) { |
|
|
|
|
|
|
|
|
switch (state) { |
|
|
|
|
|
case STATE_BOOT: |
|
|
|
|
|
handleBoot(); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
dnsServer.processNextRequest(); |
|
|
|
|
|
webServer.handleClient(); |
|
|
|
|
|
|
|
|
case STATE_AP_MODE: |
|
|
|
|
|
handleAPMode(); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
case STATE_CONNECTING: |
|
|
|
|
|
handleConnecting(); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
webServer.handleClient(); |
|
|
|
|
|
|
|
|
case STATE_STA_MODE: |
|
|
|
|
|
handleSTAMode(); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
webSocket.loop(); |
|
|
|
|
|
|
|
|
case STATE_ERROR: |
|
|
|
|
|
handleError(); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |