//----------------------------------------------------------------------------
// board: ESP8266 NodeMCU 1.0 (ESP12-E module)
// board: ESP32 D1 Mini NodeMCU WiFi Module
// board: ESP32-C6-MINI-1 Module
// Arduino IDE 1.8.5
// ESP* core 2.4.0
//----------------------------------------------------------------------------
//extern const char* ssid ="";
extern const char* ssid = "Wokwi-GUEST";
extern const char* password ="";
// define
char website_uname[20] ="admin" ;
char website_upwd[20] ="1234";
char* website_title ="ESP-WEB-Nas";
char* website_url = "";
#include "ESP_SSD1306.h"
#include "Adafruit_GFX.h"
#include "FreeSansBold12pt7b.h"
#include "FreeSans9pt7b.h"
//#include <Fonts/FreeMono12pt7b.h>
// I2C Wire
#include <Wire.h>
#ifdef ESP8266
#define SCL D1
#define SDA D2
#define D12 10
#define OLED_RESET 10
ESP_SSD1306 display(OLED_RESET);
#endif
#ifdef ESP32
#define SCL 22
#define SDA 21
#define D12 10
#define OLED_RESET -1
ESP_SSD1306 display(OLED_RESET);
#endif
#define PIN_BTND3 D3
// #define PIN_IN4 D4
#define PIN_OUT1 D5
#define PIN_OUT2 D7
#define PIN_OUT3 D8
#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#endif
#ifdef ESP32
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#endif
#define ORANGE 255,102,0
#define this_iph 5
#define http_port 80
IPAddress this_ip(192, 168, 178, this_iph);
IPAddress gateway(192, 168, 178, 1);
IPAddress subnet(255, 255, 255, 0);
#ifdef ESP8266
ESP8266WebServer lanserver(8081);
WiFiServer wifiserver(http_port);
#endif
#ifdef ESP32
WebServer lanserver(8081);
WiFiServer wifiserver(http_port);
#endif
bool authorized = false;
int16_t strstrpos(char * haystack, char * needle){
char *p = strstr(haystack, needle);
if (p) return p - haystack;
return -1;
}
const int MAXLEN = 1024;
const int TOKLEN = 64;
char * cstringarg( char* haystack, char* vname, char* sarg ) {
int i=0, pos=-1;
unsigned char ch=0xff;
char kini[3] = "&";
char kequ[3] = "=";
char needle[TOKLEN]="";
//kequ[0] = '=';
strcpy(sarg,"");
strcpy(needle, kini);
strcat(needle, vname);
strcat(needle, kequ);
pos = strstrpos(haystack, needle);
if(pos==-1) return sarg;
pos=pos+strlen(vname)+2;
while( (ch!='&')&&(ch!='\0') ) {
ch=haystack[pos+i];
if( (ch=='&')||(ch==';')||(ch==' ')||(ch=='\0') ||(ch=='\n')
||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) {
sarg[i]='\0';
return sarg;
}
if( (ch!='&') ) {
sarg[i]=ch;
i++;
}
}
return sarg;
}
void dashboard(int mode) {
display.clearDisplay();
if (mode >= 0) {
display.setCursor( 0, 0);
display.print(this_ip);
display.setCursor (0, 10);
display.print(gateway);
display.setCursor (0, 20);
display.print(subnet);
display.setCursor(0, 42);
display.print("Setup URL to connect:");
display.print("http://" + WiFi.localIP().toString() + ":" + http_port);
display.display();
}
display.setFont();
}
void setup() {
int IORes;
//STR_DEGREE[0] = CHR_DEGREE;
int progress = 0;
Serial.begin(115200);
delay(1000);
#ifdef ESP8266
Wire.pins(SDA, SCL); // SDA, SCL
#endif
#ifdef ESP32
//Wire.find(SDA, SCL); // SDA, SCL
Wire.begin(SDA,SCL); // SDA, SCL
#endif
Wire.begin();
delay(1);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setFont();
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
display.setCursor( 0, 0); display.print("OLED TEST OK");
display.display();
delay(1);
Serial.println("OLED sensor init...");
Serial.println();
Serial.println();
Serial.println("Connecting to Router: ");
Serial.println( WiFi.gatewayIP().toString() );
WiFi.begin(ssid, password);
#ifdef ESP8266
WiFi.config(this_ip, gateway, subnet);
#endif
#ifdef ESP32
WiFi.softAPConfig(this_ip, gateway, subnet);
#endif
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
display.clearDisplay();
display.setCursor( 0, 20); display.print("WiFi connecting...");
display.setCursor( 0, 40); display.print((String)progress + "%");
if (progress >= 98) {
progress = 80;
Serial.println();
}
display.display();
if (progress < 10) progress += 5;
else if (progress < 50) progress += 2;
else if (progress < 90) progress += 1;
}
display.clearDisplay();
progress = 100;
display.setCursor( 0, 20); display.print("WiFi connecting...");
display.setCursor( 0, 40); display.print((String)progress + "%");
display.display();
delay(300);
Serial.println("");
Serial.print("WiFi connected: ");
Serial.println(WiFi.gatewayIP());
wifiserver.begin();
Serial.println("WiFi Server started");
lanserver.on("/",handleRoot) ;
lanserver.on("/client/client0/", handleClients);
delay(10);
lanserver.on("/client/client1/", handleClients);
delay(10);
lanserver.on("/client/client2/", handleClients);
delay(10);
lanserver.on("/client/client3/", handleClients);
delay(10);
lanserver.begin();
Serial.println("ESP Server started");
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.print(":");
Serial.print(http_port);
Serial.println("/");
Serial.print((String)website_url + ":" + http_port + "/");
delay(1);
dashboard(1);
Serial.println("setup done \n");
}
void loop() {
static double ftmp;
static unsigned long tsec=millis(), tms = millis();
static int8_t LEDmode=0;
if (!authorized) {
handleNotAuthorized();
delay(100);
}
if (authorized) {
handleWebsite();
delay(10);
}
lanserver.handleClient();
delay(10);
if ( millis() - tms >= 100 ) {
tms = millis();
if ( millis() - tsec >= 4000 ) {
tsec=millis();
LEDmode++;
if(LEDmode>8) LEDmode=0;
}
dashboard(LEDmode);
delay(1);
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void handleNotAuthorized() {
String readString="";
char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN], test[TOKLEN] ;
#ifdef ESP8266
WiFiClient client = wifiserver.available();
#endif
#ifdef ESP32
WiFiClient client = wifiserver.available();
#endif
strcpy(strinput, "");
strcpy(strupwd, "");
strcpy(struname, "");
while ( client.connected() ) {
if (authorized) return;
readString.toCharArray(strinput, MAXLEN);
// cstringarg( char* haystack, char* vname, char* sarg )
cstringarg(strinput, "uname", struname);
cstringarg(strinput, "upwd", strupwd);
Serial.print("strupwd >>>"); Serial.print(strupwd); Serial.println("<<<");
Serial.print("website_upwd>>>"); Serial.print(website_upwd); Serial.println("<<<");
delay(1000);
if ( (strlen(strupwd)==strlen(website_upwd) ) && (strcmp(website_upwd, strupwd )==0)){
authorized = true;
//Serial.print("check: authorized="); Serial.println(authorized);
readString = "";
return;
}
if ( client.available() ) {
char c = client.read();
if (readString.length() < TOKLEN) {
readString += c;
Serial.println(c);
}
if (c == '\n') {
client.flush();
String script = "";
script += ("HTTP/1.1 401 Log-In Required");
script += ("Content-Type: text/html \n");
script += ("\n");
script += ("<!DOCTYPE html> \n");
script += ("<html> \n");
script += ("<head> \n");
script += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> \n";
script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
script += "<title>" ;
script += website_title ;
script += "</title> \n" ;
script += ("<link rel=\"shortcut icon\" href=\"http://"+(String)website_url+"/favicon.ico\" />\n") ;
script += "</head> \n" ;
script += "<style>body{margin: 0;background-color:#38e000;font-family: 'Arial';} .login{width: 282px;overflow: hidden;margin: auto;margin: 20 0 0 0px;padding: 60px;background: #24623f;border-radius: 15px ;} h2{text-align: center;color: #277582;padding: 20px;} label{color: #08ffd1;font-size: 17px;} #Pass{width: 300px;height: 30px;border: none;border-radius: 3px;padding-left: 8px;} #uname{width: 300px;height: 30px;border: none;border-radius: 3px;padding-left: 8px;} #log{width: 100px;height: 30px;margin-left:200px;border: none;border-radius: 17px;color: black;}</style>\n" ;
script += "<body> \n" ;
script += "<h1><p style=\"color:rgb(255,0,191);\"> " + (String)website_url ;
script += (String)": <wbr> <wbr> " + "Not authorized !</p> </h1> \n" ;
script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n");
script += ("<h2>ESP-8266 Login Page</h2><br>\n");
script += ("<div class=\"login\">\n");
script += ("<div id=\"login\" >\n");
script += ("<label><b>user name</b></label>\n");
script += ("<input type=\"text\" name=\"uname\" id=\"uname\">\n");
script += ("<label><b>Password</b></label>\n");
script += ("<input type=\"Password\" name=\"Pass\" id=\"Pass\">\n");
script += ("<br><br>\n");
script += ("<FORM ACTION='/' method=GET > \n");
script += ("<input type=submit onclick=\"sendPass()\" id=\"log\" > Log in </input>\n");
script += ("</FORM> \n");
script += ("</div>\n");
script += ("</div>\n");
//script += ("<h2>user name: <INPUT TYPE=text NAME='uname' VALUE='' MAXLENGTH='50'> </h2> \n");
//script += ("<h2>password : <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n");
//script += ("<h2><INPUT TYPE=SUBMIT></h2> \n");
//script += ("</FORM> \n");
//script += ("<BR> \n");
script += ("</body> \n");
script += ("<SCRIPT>InitWebSocket() function InitWebSocket(){websock = new WebSocket('ws://'+window.location.hostname+':"+(String)http_port+"');}function sendPass(){ var stringPass=document.getElementById('Pass').value; var Password='upwd'+stringPass;websock.send(Password);location.reload();}</SCRIPT> \n");
script += ("</html> \n");
client.print(script);
client.stop();
delay(1);
readString = "";
}
}
delay(1);
}
}
void handleWebsite() {
#ifdef ESP8266
WiFiClient client = wifiserver.available();
#endif
#ifdef ESP32
WiFiClient client = wifiserver.available();
#endif
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
if (request.indexOf("/logout") != -1) {
authorized = false;
return;
}
delay(1);
String script = "";
script += ("HTTP/1.1 200 OK \n");
script += ("Content-Type: text/html \n");
script += ("\n");
script += ("<!DOCTYPE html> \n");
script += ("<html> \n");
script += ("<head> \n");
script += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> \n";
script += "<meta http-equiv=\"refresh\" content=\"20; URL=";
script += (String)website_url + ":" + (String)http_port + "\"> \n" ;
script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
script += ("<title>");
script += (website_title);
script += ("</title> \n");
script += ("<link rel=\"shortcut icon\" href=\"http://"+(String)website_url+"/favicon.ico\" />\n");
script += ("<style> #btn{position:relative;top:200px;width: 300px;margin: auto;font-size: 100px;}</style>\n") ;
script += ("<SCRIPT>InitWebSocket() function InitWebSocket() {websock = new WebSocket('ws://+window.location.hostname+:"+(String)http_port+"'); websock.onmessage=function(evt){JSONobj = JSON.parse(evt.data);document.getElementById('btn').innerHTML = JSONobj.Data;}}setInterval(function(){ location.reload();},1000*5);</SCRIPT> \n");
script += ("</head> \n");
script += ("<body> \n");
script += ("<h1> <p> ");
script += ("<font style=\"color:rgb(255,0,204);\"> HELLO WORLD! ");
script += (" <wbr> <wbr> ");
script += ("<font style=\"color:rgb(0,205,102);\"> Welcome to " + (String)website_url );
script += ("! </p> </h1> "); // script+= ("! </p> </h1> \n");
delay(1);
script += ("<h2> <br> \n HEIMSERVER <br> \n </h2>");
script += ("<input type=\"button\" value=\"submit\" style=\"height: 100px; width: 100px; left: 250; top: 250;\">");
script += ("<div id=\"btn\">\n");
script += ("<button style=\"height:200px;width:200px\"> </button>");
script += ("</div>\n");
client.print(script);
script = "";
script += ("<p> <font face=\"courier\"> ");
script += "<h2> ";
script += "<p style=\"color:rgb(0,0,0);\" > </p> " ;
script += ("<br> \n");
script += "</h2>";
client.print(script);
script = "";
script += ("<br> \n");
script += ("<h3>Log Out: ");
script += ("<a href=\" /logout\"\"> <button style=\"height:70px;width:140px\" > Log Out </button></a> </h3> ");
script += WiFi.localIP().toString() +" "+ (String)ssid + " <br>" ;
script += "</font> </p> \n";
script += "</body> \n";
script += "</html> \n";
client.print(script);
delay(1);
}
void handleRoot() {
handleClients();
}
void handleClients() {
double ftmp;
String msgtok;
String message = "*** ";
// re CLIENT 0
/*
message += (String)"&c0t1=" + c0t1.sact + "&c0h1=" + c0h1.sact;
message += (String)"&c0t2=" + c0t2.sact + "&c0h2=" + c0h2.sact;
message += "&c0out1=" + (String)c0out1 + "&c0out2=" + (String)c0out2 + "&c0out3=" + (String)c0out3 ;
*/
message += " ###";
Serial.println(message);
lanserver.send(200, "text/plain", message);
}