Toegangsbeperking voor hulpmiddelen door met de contactloze kaart NodeMCU en de module RC522 DEEL 5 - beveiliging.

Hallo en welkom bij een nieuwe blogpost voor de MiFare Card Reader.

In de huidige en de volgende blogpost in de serie richten we ons op veiligheid en flexibiliteit.

We willen enig licht werpen op de veiligheid en flexibiliteit van onze kaartlezer, evenals om meer transparantie in kaartlezer acties te waarborgen. Een belangrijke tekortkoming van de voorgaande delen van deze serie was dat, hoewel het inlogwachtwoord van de beheerder op de webinterface van kaartlezer tot kaartlezer verschilde, dit wachtwoord niet individueel kon worden gewijzigd.
Daar willen we vandaag verandering in brengen. Vanaf nu is het mogelijk om de W

eb-interface onder Systeem -> Beveiliging om een apart inlogwachtwoord in te voeren voor de "beheerder" van de gebruiker.

Menu: Wachtwoordwijzigen

Dit eigen wachtwoord kan tussen de 3 en 16 tekens lang zijn.
Deze gedefinieerde tekenperiode kan worden ingesteld met de definities PwMinLength en PwMaxLength in de code. Als kortere of langere wachtwoordlimieten gewenst zijn, kunnen de waarden individueel worden aangepast.

 

De procedure voor het wijzigen van het wachtwoord van de gebruiker "admin" is:

• Eerst inloggen op de webinterface met de gebruikersnaam "admin" en het wachtwoord bestaande uit de ESP ChipId. (Zoals beschreven in de vorige delen van de serie)
• Navigatie onder Systeem -> Beveiliging voer vervolgens hetzelfde (nieuwe) wachtwoord 2x en knop in ... Pers.
• Afmelden onder Systeem -> Afmelden. Het nieuwe wachtwoord is direct geldig.

Dus we hebben de beveiliging een beetje verhoogd, zodat iemand die ons project kent en toegang heeft tot de seriële interface en via het netwerk het geldige inlogwachtwoord niet meteen kan achterhalen.
Laten we verder gaan naar een ander punt van Rubrick veiligheid: vanuit een oogpunt van veiligheid, zou het wenselijk zijn om te weten wie onze kaartlezer met succes of niet met succes met welke kaart gebruikt. We creëren nu de kans om dat te doen. Onder het nieuwe menu-item "Gebeurtenislogboek" zien we nu verschillende inzendingen voor bepaalde acties of gebeurtenissen rond onze lezer.
We zien nu bijvoorbeeld in het gebeurtenislogboek alle pogingen met geldige en ongeldige kaarten om onze lezer een actie te laten ondernemen.

De volgende screenshot toont dit als voorbeeld:

Gebeurtenis

 

Zoals te zien is in de bovenstaande screenshot, is de lijst van de tijd en datum nog steeds generiek ingesteld op een vaste waarde, omdat we nog steeds geen geldige tijdbron hebben. We zullen deze bron toevoegen aan een van de volgende onderdelen.
De juiste initialisatie en het gebruik van het interne ESP SPIFFS-bestandssysteem is essentieel voor het gebeurtenislogboek. Om dit te doen, stellen we de compilatieopties zo in dat 2 MB van ons beschikbare 4 MB programmageheugen wordt opgemaakt als een SPIFFS-bestandssysteem. Hoe dit te doen, heb ik al beschreven in een andere blogpost "ESP8266 - Alles SPIFFS of wat?" door mij onder Setup.

Belangrijk: Zonder de juiste SPIFFS-instelling wordt de code gecompileerd en geüpload naar het ESP, maar bij het opstarten van het ESP met het bericht "ATFS:NOK" op de seriële interface mislukt "hangen" en verdere initiatie mislukt. We moeten deze SPIFFS-instelling behouden voor alle andere volgende delen van deze serie.

 

De code voor onze blog vandaag is:

 

#include <Spi.H>
#include <MFRC522.H>
#include <ESP8266WiFi.H>
#include <ESP8266WebServer.H>
#include <ESP8266mDNS.H>
#include <Eeprom.H>
#include <Fs.H>           Neem de SPIFFS-bibliotheek op

#define RST_PIN     5     SPI Reset-pin (D1-uitvoer)
#define RELAIS_PIN  16    Relais (D0-uitgang) [LOW Active] - Ook interne LED in de buurt van USB-poort
#define SS_PIN      15    // SPI slave select pin

#define RGBLED_R    2     // rood (D4-uitgang) 
#define RGBLED_G    0     // Groen (D3-uitgang) - Ook interne LED op de ESP-module
#define RGBLED_B    4     // blauw (D2-uitvoer)

#define WiFiPwdLen 25     // Maximale wifi-wachtwoordlengte
#define STANAMELEN 20     // Maximale WiFi SSID-lengte
#define ESPHostNameLen 20 // Maximaal aantal tekens ESPHostName

#define KEYA waar         // PICC vlagdefinitie
#define KEYB fout        // PICC vlagdefinitie

#define LED_BUILTIN 16
#define PIN_WIRE_SDA 4
#define PIN_WIRE_SCL 5

#define PwMinLength 3  // Minimale inlogwachtwoordlengte
#define PwMaxLength 16  // Maximale inlogwachtwoordlengte
#define LoginNameMaxLength 16  // Maximale lengte van de inlognaam

#define USED_Sector 1  // Kaartsector die wordt gebruikt voor de authenticatie- en configuratiegegevens (geldig: 1- 15)

ADC_MODE(ADC_TOUT);   // Configureer analoge ingang A0 naar extern. ADC_TOUT (voor externe spanning), ADC_VCC (voor systeemspanning).
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Maak een exemplaar van de MFRC522
MFRC522::MIFARE_Key sleutel;
ESP8266WebServer server(80);        // Maak een webserverinstantie
Bestand mijnbestand;               // maak een SPIFFS-verwerkingsvariabele
FSInfo fs_info;

struct WiFiEEPromData // 68 bytes objectlengte
{   char ESPHostName[ESPHostNameLen]; // 20   char APSTAName[STANAMELEN]; // STATION / AP Punt Naam TO Connect, indien uitgeschakeld 20   char WiFiPwd[WiFiPwdLen]; // WiFiPAssword, indien uitgeschakeld 25   char ConfigValid[3]; // Als Config Vaild is, is tag "TK" vereist "3
};

struct MiFareClassicKeyTable
{   byte Sleutel_A[6] = {0x22, 0x44, 0xFA, 0xAB, 0x90, 0x11}; // Wijzig de sleutel voor de PICC-kaart.   byte Sleutel_B[6] = {0xFE, 0xE1, 0xAA, 0x3D, 0xDF, 0x37}; // Wijzig de sleutel voor de PICC-kaart.   char ConfigValid[3]; // Als Config Vaild is, is tag "TK" vereist "
};

struct SysConf //
{   char LoginName[LoginNameMaxLength]; // 16   char LoginWachtwoord[PwMaxLength];  // 16   dwaas PCD_Disabled; // 1   byte USED_PICC_Sector; // 1   char ConfigValid[3]; // Als Config Vaild is, is tag "TK" vereist "// 3
};




MiFareClassicKeyTable MiFareClassicKey;
WiFiEEPromData MyWiFiConfig;
SysConf Systeemconfiguratie;


// Wereldwijd gebruikte variabelen
dwaas Resultaat  = fout;
dwaas LearnNewCard = fout;
dwaas Kaart wissen = fout;
dwaas Vervaldatum Datum Actief = fout;
dwaas PCD_Disabled = fout;
String Achternaam;
String Givennaam;
String Vervaldatum;
String temp;
niet ondertekend lang SessionID;
niet ondertekend lang PCD_ServiceCall_Handler = 0;
niet ondertekend lang PCD_WatchDog_Handler = 0;
uint8_t DataBuffer[18]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };


nietig instellen()
{   pinMode(RST_PIN, UITGANG);   digitalWrite(RST_PIN, HOOG);   pinMode(RELAIS_PIN, UITGANG);   pinMode(RGBLED_R, UITGANG);   pinMode(RGBLED_G, UITGANG);   pinMode(RGBLED_B, UITGANG);   digitalWrite(RELAIS_PIN, HOOG);   // relais niet actief   SetRGBLed(255, 0, 255, fout);    // Led-kleur paars begint met initialisatie   Serie.beginnen(115200);               // Initialiseer seriële communicatie met de pc met 115200 baud   Serie.println(F(" "));   temp = "ATSN:" + String(ESP.getChipId());   Serie.println(temp);   // Serial.print ("ADC Value:"); Serial.println (analogRead (A0));   SPI.beginnen();                      // Initialiseer SPI-communicatie   PCDHardReset();   SessionID = millis();   Resultaat = loadSysConfig();   Resultaat = InitalizeFileSystem();   Resultaat = startWiFiClient();   InitialiseerHTTPServer();   temp = "Systeemstart:";   temp += String(ESP.getResetReason());   WriteToLog(temp, 0);   temp = "";   ESP.wdtEnable(4000);             // Start waakhond   SetRGBLed(0, 0, 255, fout);    // Led-kleur blauw initialisatie voltooid
}


// ******************* Start Helper / Optimalisatie Functies ************************ ********

nietig SetRGBLed(byte RedValue, byte GreenValue, byte BlueValue, Boolean SlowFade) // Functie om de RGB-led te besturen
{   digitalWrite(RGBLED_R, Lage);   digitalWrite(RGBLED_G, Lage);   digitalWrite(RGBLED_B, Lage);   Als (RedValue RedValue == 255)   {     digitalWrite(RGBLED_R, Hoge);   }   Als (Groene waarde == 255) {     digitalWrite(RGBLED_G, Hoge);   }   Als (BlueValue == 255)  {     digitalWrite(RGBLED_B, Hoge);   }
}

Stop Helper/ Optimalisatiefuncties *******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

Start Functions Webserver **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

Cookie base routines zijn gebaseerd op GIT fragment:
//https://github.com/esp8266/ESPWebServer/blob/master/examples/SimpleAuthentification/SimpleAuthentification.ino
Bool is_authentified()
{   Als (Server.Hasheader("Cookie")) {     Cookie gevonden     Temp = Server.Header("Cookie");     Serial.println(temp);     Tekenreeks SessionStr SessionStr = Tekenreeks(Ihb.getChipId()) + "=" + Tekenreeks(Sessionid);     Opbrengst();     Als (Temp.Indexof(SessionStr SessionStr) != -1) {       Webverificatie geslaagd       Temp = "";       Terug Waar;     }   }   Webverificatie is mislukt   Temp = "";   Sessionid = millis();   Terug Valse;
}

Void handleLogin() {   Tekenreeks Msg;   Tekenreekscookie = server.header("Cookie");   Serial.println(cookie);   Als (Server.hasArg hasArg("LOSKOPPELEN")) {     Gebruikers loskoppelen;     Sessionid = millis();     Temp = Tekenreeks(Ihb.getChipId()) + "= NA ; HttpOnly ; SameSite=Strict";     Server.sendHeader("Stel cookie", Temp);     Temp = "Afmelden van de webinterface.";     WriteToLog(Temp, 0);     Temp = "";     PCD_Disabled = Valse; PCD activeren na uitloggen;     SetRGBLed(0, 0, 255, Valse);    Led Color Blue StandardModre     Server.sendHeader("Locatie", "/login");     Server.sendHeader("Cache-Control", "no-cache");     Server.Verzenden(301);     Server.Verzenden(301);     opbrengst();   }   Als (Server.hasArg hasArg("GEBRUIKERSNAAM") && Server.hasArg hasArg("WACHTWOORD")) {     Temp = Tekenreeks(Ihb.getChipId());     Als (Server.Slechte("GEBRUIKERSNAAM") == Systeemconfiguratie.Loginnaam &&  Server.Slechte("WACHTWOORD") == Systeemconfiguratie.LoginPassword ) {       Server.sendHeader("Locatie", "/");       Server.sendHeader("Cache-Control", "no-cache");       Sessionid = millis();       Temp = Tekenreeks(Ihb.getChipId()) + "=" + Tekenreeks(Sessionid) + "; HttpOnly ; SameSite=Strict";       Server.sendHeader("Stel cookie", Temp);       Temp = "Registratie van " + Server.Slechte("GEBRUIKERSNAAM") + " naar webinterface.";       WriteToLog(Temp, 0);       Temp = "";       Server.Verzenden(301);       PCD_Disabled = Waar; PcD uitschakelen zolang het web werkt;       SetRGBLed(255, 0, 255, Valse);    Led Color Purple in Service Fashion       Terug;     }     Msg = "<script>alert('Verkeerde gebruikersnaam of wachtwoord !'); </script>";     Temp = "Mislukte inlogpoging van " + Server.Slechte("GEBRUIKERSNAAM") + " naar webinterface. Wachtwoord: " + Server.Slechte("WACHTWOORD") ;     WriteToLog(Temp, 1);     Temp = "";   }   CSS_Header_Template();   Temp = "<head><title>Login</title><head><body><DIV ALIGN=CENTER>";   Server.sendContent(Temp);   Temp = "<h2>Registratie bij kaartlezer RC522</h2><body><br><br><br>table border=0 bgcolor=black><<tr><th><DIV ALIGN=RIGHT>";   Server.sendContent(Temp);   Temp = "<formulieractie='/login'-methode='post'>Gebruikersnaam: <invoertype=tekst Naam='GEBRUIKERSNAAM' Grootte=17 vereist><br>";   Server.sendContent(Temp);   Temp = "Wachtwoord: <input type=password Name='PASSWORD' Size=17 required><br><br><<br><br><button type=submit' ";   Server.sendContent(Temp);   Temp = "naam='Login_Button' value='1' style='hoogte: 30px; breedte: 100px' >Login</button><br></th></tr></form></DIV></table>";   Server.sendContent(Temp);   Temp = "<br><SMALL>Om in te loggen moet cookies voor deze website worden toegestaan.</SMALL>";   Server.sendContent(Temp);   Temp = Msg + "</DIV></body></HTML>";   Server.sendContent(Temp);   Temp = "";
}

Void handleNotFound()
{   Sessionid = millis();   Temp = "Pagina niet gevonden.;   Temp += "URI: ";   Temp += Server.Uri();   Temp += "AnMethod: ";   Temp += (Server.Methode() == HTTP_GET) ? "GET" : "POST";   Temp += "AnArguments: ";   Temp += Server.Args();   Temp += "Een";   Voor (uint8_t I. = 0; I. < Server.Args(); I.++) {     Temp += " " + Server.argName(I.) + ": " + Server.Slechte(I.) + "Een";   }   Opbrengst();   Server.Verzenden(404, "tekst/vlakte", Temp);   Temp = "Het aanroepen van de ongeldige URL: " + Server.Uri() + Parameters: " + Tekenreeks(Server.Args()) ;   WriteToLog(Temp, 2);   Temp = "";
}



Void handleErasePICC()
{   Als (!is_authentified())   {     Server.sendHeader("Locatie", "/login");     Server.sendHeader("Cache-Control", "no-cache");     Server.Verzenden(301);     Opbrengst();     Terug;   }   CSS_Header_Template();   Opbrengst();   Temp = "<head><title>Kaartlezer RC522</title><head><body>";   Server.sendContent(Temp);   HtmlNavStructure();   Temp = "<script>alert('Houd de kaart nu voor de lezer verwijderd!'); </script>";   Server.sendContent(Temp);   Opbrengst();   EraseCard = Waar;   PCD_Disabled = Valse;   SetRGBLed(0, 255, 255, Valse);    Led-kleurcyaanprogrammeermodus   Temp = "</body></html>";   Server.sendContent(Temp);   Server.Client().Stoppen();   Temp = "";
}

Void handleInstellingen()
{   Als (!is_authentified())   {     Server.sendHeader("Locatie", "/login");     Server.sendHeader("Cache-Control", "no-cache");     Server.Verzenden(301);     Terug;   }   CSS_Header_Template();   Temp = "<head><title>Kaartlezer RC522</title><head><body>";   Server.sendContent(Temp);   HtmlNavStructure();   Temp = "<br><br><div align=center><form method='post' action='/settings' method='post'>";   Server.sendContent(Temp);   Temp = "<p><label>Nieuw inlogwachtwoord</label><br> <input type='password' naam='newPassword'>";   Server.sendContent(Temp);   Temp = "</p><p><label>repeat login password</label><br> <input type='password' naam='confirmNewPassword>><br><br><br><br>";   Server.sendContent(Temp);   Temp = "<button type='submit' name='Save' value='1' style='height: 30px; breedte: 200px' >Opslaan</button></p></form></div>";   Server.sendContent(Temp);   temp = "</p><p><button type='submit' name='save'>Save</button></p></form></div></body><</html>";   Als (Server.hasArg hasArg("Opslaan"))   {     Als (Server.Slechte("bevestignewpassword") == Server.Slechte("newPassword"))     {       Temp = Server.Slechte("newPassword");       Als ((Temp.Lengte() < PwMinLength ) |  (Temp.Lengte() > PwMaxLength ))       {         Temp = "<br><div align=center><br>Het wachtwoord moet ten minste tussen ";         Server.sendContent(Temp);         Temp = Tekenreeks(PwMinLength) + " en maximaal " + Tekenreeks(PwMaxLength) + " Wees een personage lang.</div>";         Server.sendContent(Temp);       } Anders       {         Temp = Server.Slechte("newPassword");         Temp.Tochararray(Systeemconfiguratie.LoginPassword , PwMaxLength);         saveSysConfig();         Temp = "Het login wachtwoord van de gebruiker" + Tekenreeks(Systeemconfiguratie.Loginnaam) + "is veranderd.";         WriteToLog(Temp, 0);         Temp = "<script>alert('Het inlogwachtwoord is gewijzigd.'); </script>";         Server.sendContent(Temp);       }     } Anders     {       Temp = "<br><div align=center><br>De wachtwoorden die u hebt ingevoerd komen niet overeen. Gelieve opnieuw in te voeren.</div>";       Server.sendContent(Temp);     }   }   Temp = "</body></html>";   Server.sendContent(Temp);   Server.Client().Stoppen();   Temp = "";
}

Void handleNewPICC()
{   Als (!is_authentified())   {     Server.sendHeader("Locatie", "/login");     Server.sendHeader("Cache-Control", "no-cache");     Server.Verzenden(301);     Terug;   }   Als (Server.hasArg hasArg("Achternaam") && Server.hasArg hasArg("Givenname"))   {     Achternaam = Server.Slechte("Achternaam");     Givenname = Server.Slechte("Givenname");     Vervaldatum = Server.Slechte("ExpDate");     Als (Server.hasArg hasArg("ExpDateOption")) {       ExpirdateActive = Waar;     } Anders {       ExpirdateActive = Valse;     }     Temp = "Het maken van een nieuwe kaart voor: " + Server.Slechte("Givenname") + ", " + Server.Slechte("Achternaam");     WriteToLog(Temp, 0);     PCD_Disabled = Valse;     LearnNewCard = Waar;     CSS_Header_Template();     Temp = "<head><title>Kaartlezer RC522</title><head><body>";     Server.sendContent(Temp);     HtmlNavStructure();     Temp = "<script>alert('Houd de nieuwe kaart nu voor de lezer!'); </script>";     Server.sendContent(Temp);     Temp = "</body></html>";     Server.sendContent(Temp);     Server.Client().Stoppen();     SetRGBLed(255, 255, 0, Valse);    Led-kleur gele programmeermodus     Opbrengst();     Terug;   }   CSS_Header_Template();   Temp = "<head><title>Kaartlezer RC522</title><head><body>";   Server.sendContent(Temp);   HtmlNavStructure();   Temp = "";   Temp = "<br><br><br<br><br><table border=0 ALIGN=CENTER><<th>";   Server.sendContent(Temp);   Temp = "<table border=1 bgcolor = black><form action='/newPICC' method='post'>";   Server.sendContent(Temp);   Temp = "<tr><th>Cardholder:<br><div ALIGN=RIGHT>";   Server.sendContent(Temp);   Temp = "Voornaam: <invoertype=tekst Naam='Achternaam' Maat=17 maxlenght=16 tijdelijke aanduiding='Max' vereist><br>";   Server.sendContent(Temp);   Temp = "Achternaam: <invoertype=tekst Naam='Givenname' Size=17 maxlenght=16 tijdelijke aanduiding='Mustermann' vereist><br>";   Server.sendContent(Temp);   Temp = "</div></th><th>Map metadata:<br><DIV ALIGN=RIGHT>";   Server.sendContent(Temp);   Temp = "<input Name='ExpDateOption' TYPE=checkbox WAARDE=1 >Vervaldatum:<invoertype=datum Naam='ExpDate' Grootte = 17 >";   Server.sendContent(Temp);   Temp = "<br><th><tr><th></table><br>";   Server.sendContent(Temp);   Temp = "<button type='submit' name='NewCard' value='1' style='height: 30px; breedte: 200px' >Een smartcard maken</button>";   Server.sendContent(Temp);   Temp = "<br></form></tr></th></table>";   Server.sendContent(Temp);   Temp = "</body></html>";   Server.sendContent(Temp);   Server.Client().Stoppen();   Temp = "";
}


Void handleLog()
{   Int Bestandsgrootte =  0;   Als (!is_authentified())   {     Server.sendHeader("Locatie", "/login");     Server.sendHeader("Cache-Control", "no-cache");     Server.Verzenden(301);     Terug;   }   Als (Server.hasArg hasArg("ClearLog"))   {     Als (SPIFFS (SPIFFS).Bestaat ("/usage_log.csv") )  Controleer of bestand usage_log.csv is geëexized.     {       SPIFFS (SPIFFS).Verwijderen("/usage_log.csv");  Bestand verwijderen       Seriële.println(V("ATFS:LogDelete"));       Temp = 'Bestand voor logboekregistratie voor gebeurtenissen verwijderd'.;       WriteToLog(Temp, 0);       Temp = "";     } Anders {       Seriële.println(V("ATFS:LogDelete_ERR"));     }     Opbrengst();   }   CSS_Header_Template();   Opbrengst();   Temp = "<head><title>Kaartlezer RC522</title><head><body>";   Server.sendContent(Temp);   HtmlNavStructure();   Temp = "<br><br><br<br><br><table border=4 ALIGN=CENTER><th>";   Server.sendContent(Temp);   Temp = "<textarea rows='20' cols='110' warp=soft readonly>";   Server.sendContent(Temp);   Als (SPIFFS (SPIFFS).Bestaat ("/usage_log.csv"))  Controleer of bestand usage_log.csv is geëexized.   {     Myfile = SPIFFS (SPIFFS).Open("/usage_log.csv", "r");  Het bestand usage_log.csv openen in de hoofdmap om te lezen     Als (!Myfile)     {       Temp = "Interne fout: Log bestand usage_log.csv kon niet worden geopend!";       Server.sendContent(Temp);     } Anders     {       Bestandsgrootte = Myfile.Grootte();       Terwijl (Myfile .Positie() < Myfile.Grootte())       {         Temp = Myfile.leesStringUntil('n');         Temp.Trim();         Temp += "Een"; Overzicht tekenregel toevoegen         Server.sendContent(Temp);       }       myfile.Sluiten();     }   } Anders   {     Temp = "Interner Fehler: Logdatei usage_log.csv nicht gefunden!";     Server.sendContent(Temp);   }   Temp = "</textarea></th></table><table border=0 ALIGN=CENTER>";   Server.sendContent(Temp);   SPIFFS (SPIFFS).Info(fs_info);   Temp = "<br><div ALIGN=CENTER> Loggroesse " + Tekenreeks(Bestandsgrootte) + " Bytes.<br>";   Server.sendContent(Temp);   Temp = Tekenreeks(fs_info.gebruikteBytes) + Bytes von " + Tekenreeks(fs_info.totalBytes) + " Bytes belegt.</div>";   Server.sendContent(Temp);   Temp = "<th><form action='/log' methode='post'><br><br>";   Server.sendContent(Temp);   Temp = "<button type='submit' name='RefreshLog' value='1' style='height: 30px; breedte: 100px' >Vernieuwen</button>";   Server.sendContent(Temp);   Temp = "<button type='submit' name='ClearLog' value='1' style='height: 30px; breedte: 100px' >Log</button>" wissen;   Server.sendContent(Temp);   Temp = "</form></th></table></HTML>";   Server.sendContent(Temp);   Server.Client().Stoppen();   Temp = "";
}

Void handleRoot()
{   Als (!is_authentified()) {     Server.sendHeader("Locatie", "/login");     Server.sendHeader("Cache-Control", "no-cache");     Server.Verzenden(301);     Terug;   }   HTML-inhoud   CSS_Header_Template();   Opbrengst();   Temp = "<head><title>Kartenleser RC522</title><head><body>";   Server.sendContent(Temp);   HtmlNavStructure();   Temp = "<div ALIGN=CENTER><br><br><br><br><BIG>Willkommen auf der Smartkartenleser RC522 Webseite.</BIG><br>";   Server.sendContent(Temp);   Temp = "Resetgrund: " + Tekenreeks(Ihb.getResetReason()) + "<br>";   Server.sendContent(Temp);   Temp = "Freier Heapspeicher: " + Tekenreeks(Ihb.getFreeHeap()) + " Bytes<br>";   Server.sendContent(Temp);   Temp = "Int. Flash: " + Tekenreeks(Ihb.getFlashChipRealSize()) + " Bytes<br>";   Server.sendContent(Temp);   Resultaat = mfrc522.PCD_PerformSelfTest();   mfrc522.PCD_Init();                       Initialisiere MFRC522 Lesemodul   mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); Setzt Antenne auf max. Empfang Empfang Empfang   mfrc522.PCD_AntennaOn();   Opbrengst();   Als (Resultaat) {     Temp = "RC522 PCD-Status: OK<br>";   } Anders {     Temp = "RC522 PCD-Status: Fehler!<br>";   }   Server.sendContent(Temp);   Temp = "CPU-ID: " + Tekenreeks(Ihb.getChipId()) + " @ " + Tekenreeks(Ihb.getCpuFreqMHz getCpuFreqMHz()) + " MHz<br>";   Server.sendContent(Temp);   Temp = "<br>Sie sind erfolgreich angemeldet !<br>";   Server.sendContent(Temp);   Temp = "<br>Programmiert von <a href='mailto:tobias.kuch@googlemail.com'>Tobias Kuch</a><br></div></body></html>";   Server.sendContent(Temp);   Als (Server.hasArg hasArg("Reboot") )  Opnieuw opstarten van systeem   {     Temp = "<script>alert('Das System startet JETZT neu.'); </script>";     Server.sendContent(Temp);     Server.Client().Stoppen();     Opbrengst();     Temp = "";     Ihb.Opnieuw instellen();     Vertraging(4000);   }   Server.Client().Stoppen();   Temp = "";
}

Void CSS_Header_Template() Formatvorlage für alle internen ESP Webseiten. https://wiki.selfhtml.org/wiki/CSS
{   Server.setContentLength(CONTENT_LENGTH_UNKNOWN);   Temp = "";   Server.Verzenden (200, "tekst/html", Temp);   Temp = "<! DOCTYPE HTML PUBLIC '-/-/W3C/DTD HTML 4.01 Transitional/EN'><html lang='de'><meta charset='UTF-8'>";   Server.sendContent(Temp);   Temp = "<style type='text/css'>*{marge: 0;padding: 0;} body{background:black;color:darkorchid;font-size: 16px;" ;   server. sendContent(temp);   temp = font-family: sans-serif,arial;}. nav{width: 1300px;hoogte: 30px;marge: 0 auto;randstraal: 5px;}";   Server.sendContent(Temp);   Temp = "ul li{list-style: none;width: 200px;line-height: 60px;position: relative;background: darkorchid;" ;   server. sendContent(temp);   temp = "box-shadow: 0px 2px 5px 0px 0px grijs;tekst-align: center;float: left;background-color: #010000;} ul li ul{";   Server.sendContent(Temp);   Temp = "positie: absoluut;}. nav > ul > li:nth-of-type(1){border-radius: 5px 0px 0px 5px;}. nav > ul > li:nth-of-type(5)";   Server.sendContent(Temp);   Temp = "{border-radius: 0px 5px 5px 0px;} ul li a{kleur: rgb(182, 18, 18);width: 200px;height: 58px;display: inline-block;" ;   server. sendContent(temp);   temp = tekstdecoratie: geen;} ul li a:hover{font-weight: bold;border-bottom: 2px solid #fff;} ul li ul{display: none;}";   Server.sendContent(Temp);   Temp = ".nav ul li:hover ul{display: block;}. fa{marge-rechts: 5px;}. container{breedte: 1000px;hoogte: 200px;" ;   server. sendContent(temp);   temp = "margin: 0 auto;padding:20px 20px;} @media scherm en (maximale breedte: 480px){header{width: 100%;}";   Server.sendContent(Temp);   Temp = ".nav{display: none;width: 100%;height: auto;} ul li{breedte: 100%;float: geen;} ul li a{breedte: 100%;" ;   server. sendContent(temp);   temp = "display: block;} ul li ul{positie: statisch;} ul li ul li a{achtergrond: #222;}. fa-list.modify{display: block;}";   Server.sendContent(Temp);   Temp = ".container{breedte: 100%;hoogte: auto;} body{overflow-x:hidden;}} </stijl>";   Server.sendContent(Temp);   Temp = "";
}

Void HtmlNavStructure()
{   Temp = "<div class='menu'><nav class='nav'><ul>";   Server.sendContent(Temp);   Temp = "<li><a href='#'>System</a>";   Server.sendContent(Temp);   Temp = "<ul><li><a href='/'>Informatie</a></li>";   Server.sendContent(Temp);   Temp = "<li><a href='/settings'>Sicherheit</a></li>";   Server.sendContent(Temp);   Temp = "<li><a href='/login? DISCONNECT=1'>Abmelden</a></li>";   Server.sendContent(Temp);   Temp = "<li><a href='/? Reboot=YES'>Neustart</a></li>";   Server.sendContent(Temp);   Temp = "</ul>";   Server.sendContent(Temp);   Temp = "</li><li><a href='#'>PICC</a>";   Server.sendContent(Temp);   Temp = "<ul><li><a href='/newPICC'>Neue Karte erstellen</a></li>";   Server.sendContent(Temp);   Temp = "<li><a href='/erasePICC'>Karte löschen</a></li></ul>";   Server.sendContent(Temp);   Temp = "</li>";   Temp = "</li><li><a href='/log'>Ereignisprotokoll</a></li>";   Server.sendContent(Temp);   Temp = "</ul></nav></div>";   Server.sendContent(Temp);   Temp = "";
}

Void InitalizeHTTPServer()
{   Bool initok = Valse;   Const Char * koptoetsen[] = {"User-Agent", "Cookie"} ; Kop zum Tracken   size_t headerkeyssize = grootte van(koptoetsen) / grootte van(Char*); Kop zum Tracken   Server.Op("/", handleRoot);   Server.Op("/login", handleLogin);   Server.Op("/newPICC", handleNewPICC);   Server.Op("/erasePICC", handleErasePICC);   Server.Op("/instellingen", handleInstellingen);   Server.Op("/log", handleLog);   Server.onNotFound ( handleNotFound );   Server.collectHeaders(koptoetsen, headerkeyssize );Server anweisen, diese zu Tracken   Server.Beginnen(); Webserver starten
}

******************** Eindfuncties webserver ************************************************************************************************************************************************************************************

******************** Start functies Filesystem *****************************************************************************************************************************************************************************
Booleaanse InitalizeFileSystem()
{   Bool initok = Valse;   initok = SPIFFS (SPIFFS).Beginnen();   Vertraging(200); Zonder vertraging heb ik gezien dat het IP-adres leeg   Als (!(initok)) Indeling SPIFS, van niet opgemaakt. - Probeer 1   {     Seriële.println(F("ATFS:FRM"));     SPIFFS (SPIFFS).Formaat();     initok = SPIFFS (SPIFFS).Beginnen();   }   Als (!(initok)) Indeling SPIFS, van niet opgemaakt. - Probeer 2   {     SPIFFS (SPIFFS).Formaat();     initok = SPIFFS (SPIFFS).Beginnen();   }   Als (initok) {     Seriële.println(F("ATFS:OK"));   } Anders {     Seriële.println(F("ATFS:NOK"));   }   Terug initok;
}

Booleaanse WriteToLog(Tekenreeks LogEntry LogEntry, Byte Logtype)
{   Bool writeok writeok = Valse;   SPIFFS (SPIFFS).Info(fs_info);   Als (fs_info.totalBytes - fs_info.gebruikteBytes - 2000 > 1) Speicherplatz überprüfen   {     myfile = SPIFFS (SPIFFS).Open("/usage_log.csv", "A");  Öffne die Datei usage_log.csv im Root Verzeichnis zum schreiben     Als (!myfile)     {       myfile.Sluiten();       Seriële.println(F("ATFS:InitLog_ERR"));       Terug writeok writeok;     }     Temp = "";     Temp += "01.01.1980 12:00:00 "; noch EchtDatum hinzufügen     Schakelen (Logtype)     {       Geval 0:         Temp += "Info: ";         Breken;       Geval 1:         Temp += "Warnung: ";         Breken;       Geval 2:         Temp += "Fehler: ";         Breken;       Standaard:         Temp += "Info: ";         Breken;     }     Temp += LogEntry LogEntry;     writeok writeok = myfile.println(Temp);     Als (!(writeok writeok)) {       Seriële.println(F("ATFS:WriteLog_ERR"));     }     myfile.Sluiten();     Temp = "";   }   Terug writeok writeok;
}


********************* Eindfuncties Filesystem **********************************************************************************************************************************************************************************

******************* Startfuncties WiFi Management *****************************************************************************************************************************************************************
Funktion von https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/wps-mit-dem-esp8266?ls=de
Bool startWPS()
{   Bool wpsSucces = Wifi.beginWPSConfig();   Als (wpsSucces) {     Muss nicht immer erfolgreich heißen! Nach einem Timeout ist die SSID leer     Tekenreeks newSSID = Wifi.Ssid();     Als (newSSID.Lengte() > 0) {       Nur wenn eine SSID gefunden wurde waren wir erfolgreich       Opbrengst();       Seriële.println(F("ATWPS:OK"));       referenties opslaan(); Referenties opslaan bij EEPROM     } Anders {       Seriële.println(F("ATWPS:NOK"));     }   }   Terug wpsSucces;
}

Bool startWiFiClient startWiFiClient()
{   Bool WiFiClientGestart = Valse;   size_t A0_ADCValue = 0;   Byte I = 0;   Byte connRes connRes = 0;   Seriële.setDebugOutput(Valse);  Zu Debugzwecken aktivieren.   Wifi.Hostname("CrdRdr41667");   Wifi.softAPdisconnect(Waar);   Wifi.Verbreken();   Wifi.Modus(WIFI_STA);   Als (loadCredentials())   {     Wifi.Beginnen(MyWiFiConfig MyWiFiConfig.APSTAName, MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd);     Terwijl (( connRes connRes != 3 ) En ( connRes connRes != 4 ) En (I != 30)) als connRes == 0 "IDLE_STATUS - change Statius"     {       I++;       Serial.print(F(".")); Connect vorgang auf der seriellen Schnittstelle beobachten       ESP.wdtFeed();       Vertraging(500);       Opbrengst();       connRes connRes  = Wifi.waitForConnectResult();     }     Als (connRes connRes == 4 ) { als het wachtwoord onjuist is       Seriële.println(F("ATWIFI:PWDERR"));       Wifi.Verbreken();     }     Als (connRes connRes == 6 ) { module is niet geconfigureerd in stationsmodus       Seriële.println(F("ATWIFI:STAERR"));       Wifi.Verbreken();     }   }   Als (Wifi.Status() == WL_CONNECTED)   {     ESP.wdtFeed();     Seriële.Afdrukken(F("ATIP:"));     Seriële.println(Wifi.localIP());     Wifi.setAutoReconnect(Waar); Stel in of de module probeert opnieuw verbinding te maken met een toegangspunt voor het geval de verbinding wordt verbroken.     MDNS-responder instellen     Als (!Mdns.Beginnen("CrdRdr41667"))     {       Seriële.println(F("ATMDNS:NOK"));     } Anders {       Mdns.addService("http", "tcp", 80);     }     WiFiClientGestart = Waar;   } Anders   {     A0_ADCValue = analoogLezen(A0);     Wir waren nicht erfolgreich, daher starten wir WPS, wenn WPS Taster an A0 während des Resets gedrückt ist     Als (A0_ADCValue > 499)     {       Als (startWPS())       {         ESP.wdtFeed();         Vertraging(500);         Wifi.Verbreken();         Wifi.Modus(WIFI_STA);         Wifi.Beginnen(Wifi.Ssid().c_str(), Wifi.Psk().c_str());         ESP.wdtFeed();         WiFiClientGestart = Waar;       } Anders       {         WiFiClientGestart = Valse;         Wifi.Verbreken();       }     } Anders     {       Wifi.Verbreken();     }   }   WiFi.printDiag(Serieel);       Zu Debugzwecken aktivieren.   Terug WiFiClientGestart;
}
******************** Eindfuncties WiFi Management ****************************************************************************************************************************************************************

******************* Startfuncties WiFi-referenties opslaan bij EEPROM ********************
Bool loadCredentials()
{   Bool RetValue;   Eeprom.Beginnen(512);   Eeprom.Toevoegen(0, MyWiFiConfig MyWiFiConfig);   Eeprom.Einde();   Als (Tekenreeks(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) == "TK")   {     RetValue = Waar;   } Anders   {     RetValue = Valse; WLAN Settings nicht gefunden.   }   ESP.wdtFeed();   Terug RetValue;
}

Void referenties opslaan() Speichere WLAN geloofsbrieven auf EEPROM
{   size_t I;   Voor (I = 0 ; I < grootte van(MyWiFiConfig MyWiFiConfig) ; I++) Loeschen der alten Konfiguration   {     Eeprom.Schrijven(I, 0);   }   Voor (I = 0 ; I < STANameLen STANamelen  ; I++) Loeschen der alten Konfiguration   {     MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = 0;   }   Voor (I = 0 ; I < WiFiPwdLen WiFiPwdLen ; I++) Loeschen der alten Konfiguration   {     MyWiFiConfig MyWiFiConfig.APSTAName[I] = 0;   }   Temp = Wifi.Ssid().c_str();   I = Temp.Lengte();   Temp.toCharArray(MyWiFiConfig MyWiFiConfig.APSTAName, I + 1);   Temp = Wifi.Psk().c_str();   I = Temp.Lengte();   Temp.toCharArray(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd, I + 1);   Temp = "";   strncpy strncpy(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid) , "TK", grootte van(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) );   Eeprom.Beginnen(512);   Eeprom.zet(0, MyWiFiConfig MyWiFiConfig);   Eeprom.Commit();   Eeprom.Einde();   ESP.wdtFeed();
}

Void saveSysConfig()
{   Byte I;   strncpy strncpy(Systeemconfiguratie.ConfigValid (ConfigValid) , "TK", grootte van(Systeemconfiguratie.ConfigValid (ConfigValid)) );   Eeprom.Beginnen(512);   Eeprom.zet(80, Systeemconfiguratie);   Eeprom.Commit();   Eeprom.Einde();   ESP.wdtFeed();

}

Bool loadSysConfig()
{   Bool RetValue;   Eeprom.Beginnen(512);   Eeprom.Toevoegen(80, Systeemconfiguratie);   Eeprom.Einde();   Als (Tekenreeks(Systeemconfiguratie.ConfigValid (ConfigValid)) == "TK")   {     RetValue = Waar;   } Anders   {     Temp = Tekenreeks(Ihb.getChipId());     Temp.toCharArray(Systeemconfiguratie.LoginPassword , PwMaxLength);     Temp = "";     strncpy strncpy(Systeemconfiguratie.Loginnaam , "Admin", grootte van(Systeemconfiguratie.Loginnaam) );     Systeemconfiguratie.PCD_Disabled = Valse;     Systeemconfiguratie.USED_PICC_Sector = 1;     saveSysConfig();     RetValue = Valse; Config Instellingen nicht gültig /Standardinitalisierung ausführe   }   ESP.wdtFeed();   Terug RetValue;
}

******************** EINDfuncties StoreCredentialsto EEPROM ******************************************************************************************************************************************

****************** Start functies Cardservices ****************************************************************************************************************************************************************

Void PCDHardReset()
{   digitalWrite(RST_PIN, Lage);   Vertraging(200);   digitalWrite(RST_PIN, Hoge);   mfrc522.PCD_Reset();   mfrc522.PCD_Init();                              Initialisiere MFRC522 Lesemodul   mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); Setzt Antenne auf max. Empfang Empfang Empfang   mfrc522.PCD_AntennaOn();
}

Booleaanse CardAuthenticate(Booleaanse ABKey ABKey, Byte Sector, Byte Ikey[6])
{   Const Byte sectorsleutelbaar [16] = {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63};   Byte statusA;   statusA = 0;   Voor (Int A = 0; A < 6; A++)   {     Sleutel.keyByte[A] = Ikey[A];   }   Sleutel A   Als (ABKey ABKey)   {     statusA = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sectorsleutelbaar[Sector], &Sleutel, &(mfrc522.Uid));     Als (statusA != MFRC522::STATUS_OK)     {       Seriële.println(F("ATAUTH:ERR_A"));       Terug Valse;     }   }   Sleutel B   Anders Als (Niet ABKey ABKey)   {     statusA = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, sectorsleutelbaar[Sector], &Sleutel, &(mfrc522.Uid));     Als (statusA != MFRC522::STATUS_OK)     {       Seriële.println(F("ATAUTH:ERR_B"));       Terug Valse;     }   }   Terug Waar;
}

WriteData . gebruikt Global Variable DataBuffer voor datareturn
Booleaanse CardDataWrite CardDataWrite(Byte Sector, Byte Blok, Byte Waarde[16])
{   Byte Status;   Byte schrijfvector;   Byte sectorsleutelbaar [16] = {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63};   schrijfvector = Sector * 4 + Blok - 1 ;   Voor (Byte A = 0; A < 16; A++)   {     Als (schrijfvector ==  sectorsleutelbaar[A])     {       Serial.println("NAK";       Terug Valse;     }   }   Status = mfrc522.MIFARE_Write(schrijfvector, Waarde, 16);   Als (Status != MFRC522::STATUS_OK)   {     Seriële.println(F("ATPCD:W_ERR"));     Serial.println(mfrc522. GetStatusCodeName(status));     Terug Valse;   } Anders   {     Serial.print(F("ATPCD:Write_Card_OK"));     Terug Waar;   }
}

Leesgegevens - gebruikt Globale variabele databuffer voor gegevensretour
Booleaanse CardDataRead(Byte Sector, Byte Blok)
{   Byte statusi;   Byte leesvector;   Const Byte sectorsleutelbaar [16] = {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63};   Byte Formaat = 18;   leesvector = Sector * 4 + Blok - 1 ;   Voor (Byte A = 0; A < 16; A++)   {     Als (leesvector ==  sectorsleutelbaar[A])     {       Seriële.println(F("ATPCD:R_ERR"));       Terug Valse;     }   }   statusi = mfrc522.MIFARE_Read(leesvector, Gegevensbuffer, &Formaat);   Als (statusi != MFRC522::STATUS_OK)   {     Seriële.println(F("ATPCD:R_ERR"));     Terug Valse;   } Anders   {     Terug Waar;   }
}

Booleaanse ResetCardtoDefault()
{   Byte Ikey[16];   Byte Status, I;   Byte schrijfvector;   Const Byte sectorsleutelbaar [16] = {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63};   schrijfvector = sectorsleutelbaar[USED_Sector];   Als (CardAuthenticate(KEYB, USED_Sector, MifareClassicKey.Key_B)) Sector Autenticate voor WRITE Access   {     Voor (I = 0; I <= 16; I++) {       Gegevensbuffer[I] = 0;     }     Als (!(CardDataWrite CardDataWrite(USED_Sector, 1, Gegevensbuffer))) {       Terug Valse;     }     Voor (I = 0; I <= 16; I++) {       Gegevensbuffer[I] = 0;     }     Als (!(CardDataWrite CardDataWrite(USED_Sector, 2, Gegevensbuffer))) {       Terug Valse;     }     Voor (I = 0; I <= 16; I++) {       Gegevensbuffer[I] = 0;     }     Als (!(CardDataWrite CardDataWrite(USED_Sector, 3, Gegevensbuffer))) {       Terug Valse;     }   }   Voor (Byte I = 0; I <= 16; I++) {     Ikey[I] = 255;  Standaardsleutel laden voor alle sectoren   }   Ikey[6] = 0xFF; Standaardinstelling voor Access Bits   Ikey[7] = 0x07; //   Ikey[8] = 0x80; //   Ikey[9] = 0x69;   Status = mfrc522.MIFARE_Write(schrijfvector, Ikey, 16);   Als (Status != MFRC522::STATUS_OK)   {     Terug Valse;   }   Terug Waar;
}

Booleaanse SetSectorAccessControl (Byte Sector, Byte Akey[6], Byte Bkey Bkey[6])
{   Byte Ikey[16];   Byte Status;   Byte schrijfvector;   Const Byte sectorsleutelbaar [16] = {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63};   schrijfvector = sectorsleutelbaar[Sector];   Ikey[0] = Akey[0];   Ikey[1] = Akey[1];   Ikey[2] = Akey[2];   Ikey[3] = Akey[3];   Ikey[4] = Akey[4];   Ikey[5] = Akey[5];   Ikey[6] = 0x78; Data block 0-3 Toegangsvoorwaarden: Key B schrijven / Key A Lezen   Ikey[7] = 0x77; KEY A & KEY B & Acces Bits Schrijven:Key B / Key A Leestoegang Bits   Ikey[8] = 0x88; Calculator: http://calc.gmss.ru/Mifare1k/   Ikey[9] = 0x69; Fixer Wert - > standaard hex 69   Ikey[10] = Bkey Bkey[0];   Ikey[11] = Bkey Bkey[1];   Ikey[12] = Bkey Bkey[2];   Ikey[13] = Bkey Bkey[3];   Ikey[14] = Bkey Bkey[4];   Ikey[15] = Bkey Bkey[5];   Status = mfrc522.MIFARE_Write(schrijfvector, Ikey, 16);   Als (Status != MFRC522::STATUS_OK)   {     Seriële.println(F("ATPCD:W_KEY_ERR"));     Terug Valse;   } Anders   {     Terug Waar;   }
}

Booleaanse CheckforDefaultCardKey ()
{   Byte tkey[6];   Booleaanse Kaartresultaat;   Byte leesvector;   Byte statusi;   Const Byte sectorsleutelbaar [16] = {3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63};   Byte Formaat = 18;   Voor (Byte I = 0; I <= 6; I++) {     tkey[I] = 255;  Standaardsleutel laden voor alle sectoren   }   Kaartresultaat = Waar;   Als (!CardAuthenticate(Keya, USED_Sector, tkey)) {     Kaartresultaat = Valse;   };   leesvector = sectorsleutelbaar[USED_Sector];   statusi = mfrc522.MIFARE_Read(leesvector, Gegevensbuffer, &Formaat);   Als (statusi != MFRC522::STATUS_OK) {     Kaartresultaat = Valse;   }   als (!) (DataBuffer[7] = 0x07) & (DataBuffer[7] = 0x80)) { CardResult = false; };   Terug Kaartresultaat;
}

Booleaanse WriteNewMiFareClassicPICC ()
{   Byte tkey[6];   Byte I, A;   Booleaanse Kaartresultaat;   Als (CheckforDefaultCardKey())   {     Voor (I = 0; I <= 6; I++) {       tkey[I] = 255;  Standaardsleutel laden voor alle sectoren     }     Voor (I = 0; I <= 16; I++) {       Gegevensbuffer[I] = 0;  Variabele buffer wissen     }     Kaartresultaat = Waar;     Als (CardAuthenticate(Keya, USED_Sector, tkey)) Sector Autenticate     {       Serial.println("Auth Sec 0 OK");       Als (Achternaam.Lengte() > 15) {         A = 15;       } Anders {         A = Achternaam.Lengte();       }       Als (Achternaam.Lengte() > 0)       {         Voor (I = 0; I <= 16; I++) {           Gegevensbuffer[I] = 0;         }         Voor (I = 0; I <= A; I++) {           Gegevensbuffer[I] = Achternaam[I];         }         Als (!(CardDataWrite CardDataWrite(USED_Sector, 2, Gegevensbuffer))) {           Kaartresultaat = Valse;  Sector 0 Blok 2 Vorname mit Key A schreiben         }       }       Als (Givenname.Lengte() > 15) {         A = 15;       } Anders {         A = Givenname.Lengte();       }       Als (Givenname.Lengte() > 0)       {         Voor (I = 0; I <= 16; I++) {           Gegevensbuffer[I] = 0;         }         Voor (I = 0; I <= A; I++) {           Gegevensbuffer[I] = Givenname[I];         }         Als (!(CardDataWrite CardDataWrite(USED_Sector, 3, Gegevensbuffer))) {           Kaartresultaat = Valse;  Sector 0 Blok 3 Nachname mit Key A schreiben         }       }       Als (!(SetSectorAccessControl (USED_Sector, MifareClassicKey.Key_A, MifareClassicKey.Key_B))) {         Kaartresultaat = Valse;  (bytesector,byte Akey[6],byte Bkey[6])       }     } Anders {       Kaartresultaat = Valse;       Terug Kaartresultaat;     }   } Anders {     Kaartresultaat = Valse;     Terug Kaartresultaat;   }   Als (Kaartresultaat)   {     Serial.println("PICC geschreven";     Kaartresultaat = Waar;   }   Anders   {     Serial.println("PICC niet leeg");     Kaartresultaat = Valse;   }   Opbrengst();   Terug Kaartresultaat;
}


Booleaanse ReadMiFareClassicPICC ()
{   Booleaanse Kaartresultaat;   Byte I ;   Kaartresultaat = Waar;   Als (CardAuthenticate(Keya, USED_Sector, MifareClassicKey.Key_A)) Sector Autenticate met LEES Sleutel A   {     Givenname = "               "; Tijdelijke aanduiding     Achternaam   = "               "; Tijdelijke aanduiding     Voor (I = 0; I < 18; I++) {       Gegevensbuffer[I] = 0;  Variabele buffer wissen     }     Als (CardDataRead(USED_Sector, 2)) Feld Vorname auslesen     {       Voor (I = 0; I < 16; I++) {         Achternaam[I] = Char(Gegevensbuffer[I]);       }     } Anders {       Terug Valse;     }     Voor (I = 0; I < 18; I++) {       Gegevensbuffer[I] = 0;  Variabele buffer wissen     }     Als (CardDataRead(USED_Sector, 3)) Feld Nachname auslesen     {       Voor (I = 0; I < 16; I++) {         Givenname[I] = Char(Gegevensbuffer[I]);       }     } Anders {       Terug Valse;     }   } Anders   {     Terug Valse;   }   Terug Waar;
}

Void CardServer()
{   Byte I ;
#define PCD_Poll_Interval 400
#define PCD_Watchdog_Interval 60000   Als (millis() - PCD_ServiceCall_Handler >= PCD_Poll_Interval)   {     PCD_ServiceCall_Handler = millis();     Als (mfrc522.PICC_IsNewCardPresent())   PICC = nabijheid geïntegreerde circuitkaart = kontaktlose Chipkarte     {       mfrc522.PICC_ReadCardSerial();       Opbrengst();       Unterscheidung nach Kartentyp       0x08 für MIFARE Classic 1K       0x18 für MIFARE Classic 4K       0x11 für MIFARE PLUS       Als (mfrc522.Uid.Sak == 0x08 || mfrc522.Uid.Sak == 0x18)       {         MiFare_Classic_Processor START (mfrc522.uid.sak);  Nur ausführen wenn Eine Mifare Classic Karte vor den Leser gehalten wurde.         Byte tkey[6];         Voor (Byte I = 0; I <= 6; I++) {           tkey[I] = 255;  Standaardsleutel laden voor alle sectoren         }         Als (LearnNewCard) neue Karte soll angelernt werden.         {           Als (WriteNewMiFareClassicPICC()) {             SetRGBLed(0, 255, 0, Valse);             LearnNewCard = Valse;           } Anders           {             SetRGBLed(255, 0, 0, Valse);             LearnNewCard = Valse;           }         }         Anders Als (EraseCard)  KartenDaten sollen gelöscht werden.         {           Als (ResetCardtoDefault()) {             SetRGBLed(0, 255, 0, Valse);             EraseCard = Valse;           } Anders           {             SetRGBLed(255, 0, 0, Valse);             EraseCard = Valse;           }         }         Anders         {           Als (ReadMiFareClassicPICC())           { Karte gültig !             Seriële.Afdrukken (F("ATAUTH_S:"));             Seriële.println (Achternaam);             Seriële.Afdrukken (F("ATAUTH_G:"));             Seriële.println (Givenname);             Temp = "Gültige Karte. Benutzer: ";             Voor (I = 0; I < 16; I++)             {               Als  (Givenname[I] == 0)               {                 Breken;               }               Temp += Char(Givenname[I]);             }             Temp += ", ";             Voor (I = 0; I < 16; I++)             {               Als  (Achternaam[I] == 0)               {                 Breken;               }               Temp += Char(Achternaam[I]);             }             Temp += " - UUID der Karte: ";             Voor (Byte I = 0; I < 4; I++) {               Temp += Tekenreeks(mfrc522.Uid.uidByte uidByte[I], Hex) + " ";             }             WriteToLog(Temp, 0);             Temp = " ";             Acties uitvoeren als de juiste kaart wordt gedetecteerd             Bool PinState = digitaalLezen(RELAIS_PIN);             PinState = !PinState;             digitalWrite(RELAIS_PIN, PinState);             SetRGBLed(0, 255, 0, Valse);     Led Grün             Temp = "";           } Anders {             SetRGBLed(255, 0, 0, Valse);             Temp = "";             Voor (Byte I = 0; I < 4; I++) {               Temp += Tekenreeks(mfrc522.Uid.uidByte uidByte[I], Hex) + " ";             }             Temp = "Unbekannte MiFare Classic Karte. UUID der Karte: " + Temp ;             WriteToLog(Temp, 1);             Temp = "";           }         }         LearnNewCard = Valse;         MiFare_Classic_Processor STOP (mfrc522.uid.sak);       } Anders Als (mfrc522.Uid.Sak == 0x00) Mifare Ultralight       {         SetRGBLed(255, 0, 0, Valse);         Temp = "";         Voor (Byte I = 0; I < 7; I++) {           Temp += Tekenreeks(mfrc522.Uid.uidByte uidByte[I], Hex) + " ";         }         Temp = "Mifare UltraLight Karte nicht unterstützt. UUID der Karte: " + Temp;         WriteToLog(Temp, 1);         Temp = "";       } Anders       {         SetRGBLed(255, 0, 0, Valse);         Temp = "";         Voor (Byte I = 0; I < mfrc522.Uid.Grootte; I++) {           Temp += Tekenreeks(mfrc522.Uid.uidByte uidByte[I], Hex) + " ";         }         Temp = "Unbekannte Karte und Kartentyp. Typnummer: " + Tekenreeks(mfrc522.Uid.Sak) + " UUID der Karte: " + Temp ;         WriteToLog(Temp, 1);         Temp = "";       }       mfrc522.PCD_StopCrypto1();       mfrc522.PICC_HaltA();       Vertraging(2000);       SetRGBLed(0, 0, 255, Valse);     Led Farbe Blau Leser ist in Grundzustand     }   }   Als (millis() - PCD_WatchDog_Handler >= PCD_Watchdog_Interval)   {     PCD_WatchDog_Handler = millis();     Resultaat = mfrc522.PCD_PerformSelfTest();     Opbrengst();     mfrc522.PCD_Init();                       Initialiseer MFRC522 Leesmodule opnieuw     mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); Stelt antenne op max. ontvangst     mfrc522.PCD_AntennaOn();     Opbrengst();     Als (!(Resultaat))     {       PCDHardReset();       Seriële.println(V("ATPCD:ERR_H"));     }   }
}

Stop functies CardServices ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

Void Lus()  Hoofdlus
{   Server.handleClient();                    Aanvragen voor webserver bewerken   Als (!(PCD_Disabled) | !(Systeemconfiguratie.PCD_Disabled)) {     CardServer();  Kaartlezer om specifieke aanvragen af te handelen   }   Ihb.wdtFeed();                            Watchdog. Uitschakelen met "wdt_disable();"
}

 

Ik wens u veel plezier en veel succes in de bouw van het project en tot de volgende keer.

Projekte für fortgeschrittene

2 Kommentare

Martin Kurth

Martin Kurth

Leider hat Tobias dieses Projekt nicht weiter verfolgt oder veröffentlicht. Ich würde es wirklich gerne einsetzen. Aber leider hat er wohl keine Zeit mehr dafür.

Martin Kurth

Martin Kurth

Ich bekomme die Fehler nicht weg. IDE 1.8.10.

G:\BOX.heidelberg.projekt\MiFare_CardReader-master\CardReader_ESP8266_-Teil_5\CardReader_ESP8266_-Teil_5.ino:27:0: warning: "PINWIRESDA" redefined [enabled by default]

#define PIN_WIRE_SDA 4 ^

In file included from C:\Users\Martin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266/Arduino.h:302:0,

from sketch\CardReader_ESP8266_-_Teil_5.ino.cpp:1:

C:\Users\Martin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\variants\nodemcu/pins_arduino.h:29:0: note: this is the location of the previous definition

#define PIN_WIRE_SDA (4) ^

G:\BOX.heidelberg.projekt\MiFare_CardReader-master\CardReader_ESP8266_-Teil_5\CardReader_ESP8266_-Teil_5.ino:28:0: warning: "PINWIRESCL" redefined [enabled by default]

#define PIN_WIRE_SCL 5 ^

In file included from C:\Users\Martin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266/Arduino.h:302:0,

from sketch\CardReader_ESP8266_-_Teil_5.ino.cpp:1:

C:\Users\Martin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\variants\nodemcu/pins_arduino.h:30:0: note: this is the location of the previous definition

#define PIN_WIRE_SCL (5) ^

G:\BOX.heidelberg.projekt\MiFare_CardReader-master\CardReader_ESP8266_-Teil_5\CardReader_ESP8266_-_Teil5.ino: In function ‘void saveCredentials()’:

G:\BOX.heidelberg.projekt\MiFare_CardReader-master\CardReader_ESP8266_-Teil_5\CardReader_ESP8266_-_Teil5.ino:806:34: warning: iteration 20u invokes undefined behavior [-Waggressive-loop-optimizations]

MyWiFiConfig.APSTAName[i] = 0; ^

G:\BOX.heidelberg.projekt\MiFare_CardReader-master\CardReader_ESP8266_-Teil_5\CardReader_ESP8266_-_Teil5.ino:804:3: note: containing loop

for (i = 0 ; i < WiFiPwdLen ; i++) // Loeschen der alten Konfiguration ^

In file included from C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp:8:0:

C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.h: In constructor ‘MFRC522Extended::MFRC522Extended(uint8_t)’:

C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.h:81:44: warning: ‘MFRC522::MFRC522’ is deprecated (declared at C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.h:339): use MFRC522 [-Wdeprecated-declarations]

MFRC522Extended(uint8_t rst) : MFRC522 {}; ^

C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp: In member function ‘bool MFRC522::MIFARE_SetUid(byte*, byte, bool)’:

C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1853:39: warning: ‘bool MFRC522::MIFARE_OpenUidBackdoor(bool)’ is deprecated (declared at C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1709): will move to extra class in next version [-Wdeprecated-declarations]

if (!MIFARE_OpenUidBackdoor(logErrors)) { ^

C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp: In member function ‘bool MFRC522::MIFARE_UnbrickUidSector(bool)’:

C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1882:34: warning: ‘bool MFRC522::MIFARE_OpenUidBackdoor(bool)’ is deprecated (declared at C:\Users\Martin\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1709): will move to extra class in next version [-Wdeprecated-declarations]

MIFARE_OpenUidBackdoor(logErrors); ^

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi