#include #include #include #include "CSS.h" //Includes headers of the web and de style file #include #include #include #include #include #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3c ///< See datasheet for Address; 0x3D for 128x32, 0x3C for 128x64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define DBG_OUTPUT_PORT display const char *ssid = "Meins"; const char *password = "geht"; const char *host = "ESP32Server"; int freierplatz; WebServer server(80); #define servername "ESP32Server" //Define the name to your server... bool SD_present = false; //Controls if the SD card is present or not /********* SETUP **********/ void setup(void) { Serial.begin(9600); //Startet Serialcomm //DBG_OUTPUT_PORT.begin(115200); Wire.begin(14,27); //starts Displaycommunication display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); //SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally display.clearDisplay(); //Resets Display for first start display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); DBG_OUTPUT_PORT.println("DrRobbis - NAS V0.7"); pinMode(2,OUTPUT); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); DBG_OUTPUT_PORT.print("Wlan:"); DBG_OUTPUT_PORT.println(ssid); delay(1500); DBG_OUTPUT_PORT.println(WiFi.localIP()); //Set your preferred server name, if you use "mcserver" the address would be http://mcserver.local/ if (!MDNS.begin(servername)) { DBG_OUTPUT_PORT.println(F("Error setting up MDNS responder!")); ESP.restart(); } DBG_OUTPUT_PORT.print(F("Init. SD card...")); display.display(); //see if the card is present and can be initialised. //Note: Using the ESP32 and SD_Card readers requires a 1K to 4K7 pull-up to 3v3 on the MISO line, otherwise may not work if (!SD.begin(SS)) { DBG_OUTPUT_PORT.println(F("Card failed or not present, no SD Card data logging possible...")); SD_present = false; } else { delay(2000); DBG_OUTPUT_PORT.println(F("bereit")); SD_present = true; } /********* Server Commands **********/ server.on("/", SD_dir); server.on("/upload", File_Upload); server.on("/sdinfo", sdinfo); server.on("/fupload", HTTP_POST,[](){ server.send(200);}, handleFileUpload); server.begin(); display.display(); // Show initial text } /********* LOOP **********/ void loop(void) { server.handleClient(); //Listen for client connections } //Info der SD Karte, grösse und freier Platz void sdinfo() { append_page_header(); webpage += F("

Cardsize : "); webpage += String(SD.cardSize()/1000000)+ " MB"+"

"; freierplatz=(SD.cardSize()-SD.usedBytes())/1000000; webpage += F("

Freespace : "); webpage += String(freierplatz)+ " MB"+"

"; webpage += F("

Usedspace : "); webpage += String(SD.usedBytes()/1000000)+ " MB"+"

"; webpage += F("[Back]

"); append_page_footer(); server.send(200, "text/html",webpage); } /********* FUNCTIONS **********/ //Initial page of the server web, list directory and give you the chance of deleting and uploading void SD_dir() { if (SD_present) { digitalWrite(2,HIGH); //Action acording to post, dowload or delete, by MC 2022 if (server.args() > 0 ) //Arguments were received, ignored if there are not arguments { String Order = server.arg(0); if (Order.indexOf("download_")>=0) { Order.remove(0,9); SD_file_download(Order); } if ((server.arg(0)).indexOf("delete_")>=0) { Order.remove(0,7); SD_file_delete(Order); } digitalWrite(2,LOW); } File root = SD.open("/"); if (root) { digitalWrite(2,HIGH); root.rewindDirectory(); SendHTML_Header(); webpage += F(""); webpage += F(""); printDirectory("/",0); webpage += F("
Name/TypDateityp/OrdnerGroesse
"); SendHTML_Content(); root.close(); digitalWrite(2,LOW); } else { SendHTML_Header(); webpage += F("

keine Dateien gefunden

"); } append_page_footer(); SendHTML_Content(); SendHTML_Stop(); //Stop is needed because no content length was sent } else ReportSDNotPresent(); } //Upload a file to the SD void File_Upload() { append_page_header(); webpage += F("

Dateien Upload

"); webpage += F("
"); webpage += F(""); webpage += F("

"); webpage += F("[Back]

"); append_page_footer(); server.send(200, "text/html",webpage); } //Prints the directory, it is called in void SD_dir() void printDirectory(const char * dirname, uint8_t levels) { File root = SD.open(dirname); if(!root){ return; } if(!root.isDirectory()){ return; } File file = root.openNextFile(); int i = 0; while(file){ if (webpage.length() > 1000) { SendHTML_Content(); } if(file.isDirectory()){ digitalWrite(2,HIGH); webpage += ""+String(file.isDirectory()?"Dir":"File")+""+String(file.name())+""; printDirectory(file.name(), levels-1); digitalWrite(2,LOW); } else { webpage += ""+String(file.name())+""; webpage += ""+String(file.isDirectory()?"Dir":"File")+""; int bytes = file.size(); String fsize = ""; if (bytes < 1024) fsize = String(bytes)+" B"; else if(bytes < (1024 * 1024)) fsize = String(bytes/1024.0,3)+" KB"; else if(bytes < (1024 * 1024 * 1024)) fsize = String(bytes/1024.0/1024.0,3)+" MB"; else fsize = String(bytes/1024.0/1024.0/1024.0,3)+" GB"; webpage += ""+fsize+""; webpage += ""; webpage += F(""); webpage += F(""); webpage += ""; webpage += ""; webpage += F(""); webpage += F(""); webpage += ""; webpage += ""; } file = root.openNextFile(); i++; } file.close(); } //Download a file from the SD, it is called in void SD_dir() void SD_file_download(String filename) { if (SD_present) { File download = SD.open("/"+filename); if (download) { server.sendHeader("Content-Type", "text/text"); server.sendHeader("Content-Disposition", "attachment; filename="+filename); server.sendHeader("Connection", "close"); server.streamFile(download, "application/octet-stream"); download.close(); } else ReportFileNotPresent("download"); } else ReportSDNotPresent(); } //Handles the file upload a file to the SD File UploadFile; //Upload a new file to the Filing system void handleFileUpload() { HTTPUpload& uploadfile = server.upload(); //See https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer/srcv //For further information on 'status' structure, there are other reasons such as a failed transfer that could be used if(uploadfile.status == UPLOAD_FILE_START) { String filename = uploadfile.filename; if(!filename.startsWith("/")) filename = "/"+filename; SD.remove(filename); //Remove a previous version, otherwise data is appended the file again UploadFile = SD.open(filename, FILE_WRITE); //Open the file for writing in SD (create it, if doesn't exist) filename = String(); } else if (uploadfile.status == UPLOAD_FILE_WRITE) {digitalWrite(2,HIGH); if(UploadFile) UploadFile.write(uploadfile.buf, uploadfile.currentSize); // Write the received bytes to the file digitalWrite(2,LOW); } else if (uploadfile.status == UPLOAD_FILE_END) { if(UploadFile) //If the file was successfully created { UploadFile.close(); //Close the file again webpage = ""; append_page_header(); webpage += F("

File was successfully uploaded

"); webpage += F("

Uploaded File Name: "); webpage += uploadfile.filename+"

"; webpage += F("

File Size: "); webpage += file_size(uploadfile.totalSize) + "



"; webpage += F("[Back]

"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); server.send(200,"text/html",webpage); SD.end(); SD.begin(SS); } else { ReportCouldNotCreateFile("upload"); } } } //Delete a file from the SD, it is called in void SD_dir() void SD_file_delete(String filename) { if (SD_present) { SendHTML_Header(); File dataFile = SD.open("/"+filename, FILE_READ); //Now read data from SD Card if (dataFile) { if (SD.remove("/"+filename)) { digitalWrite(2,HIGH); webpage += "

File '"+filename+"' has been erased

"; webpage += F("[Back]

"); digitalWrite(2,LOW); } else { webpage += F("

File was not deleted - error

"); webpage += F("[Back]

"); } } else ReportFileNotPresent("delete"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } else ReportSDNotPresent(); } //SendHTML_Header void SendHTML_Header() { server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Pragma", "no-cache"); server.sendHeader("Expires", "-1"); server.setContentLength(CONTENT_LENGTH_UNKNOWN); server.send(200, "text/html", ""); //Empty content inhibits Content-length header so we have to close the socket ourselves. append_page_header(); server.sendContent(webpage); webpage = ""; } //SendHTML_Content void SendHTML_Content() { server.sendContent(webpage); webpage = ""; } //SendHTML_Stop void SendHTML_Stop() { server.sendContent(""); server.client().stop(); //Stop is needed because no content length was sent } //ReportSDNotPresent void ReportSDNotPresent() { SendHTML_Header(); webpage += F("

No SD Card present

"); webpage += F("[Back]

"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //ReportFileNotPresent void ReportFileNotPresent(String target) { SendHTML_Header(); webpage += F("

File does not exist

"); webpage += F("[Back]

"; append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //ReportCouldNotCreateFile void ReportCouldNotCreateFile(String target) { SendHTML_Header(); webpage += F("

Could Not Create Uploaded File (write-protected?)

"); webpage += F("[Back]

"; append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //File size conversion String file_size(int bytes) { String fsize = ""; if (bytes < 1024) fsize = String(bytes)+" B"; else if(bytes < (1024*1024)) fsize = String(bytes/1024.0,3)+" KB"; else if(bytes < (1024*1024*1024)) fsize = String(bytes/1024.0/1024.0,3)+" MB"; else fsize = String(bytes/1024.0/1024.0/1024.0,3)+" GB"; return fsize; }