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.
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:
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="/nl">Informatie</a></li>"; Server.sendContent(Temp); Temp = "<li><a href="/nl/settings">Sicherheit</a></li>"; Server.sendContent(Temp); Temp = "<li><a href="/nl/login? DISCONNECT=1">Abmelden</a></li>"; Server.sendContent(Temp); Temp = "<li><a href="/nl/? 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="/nl/newPICC">Neue Karte erstellen</a></li>"; Server.sendContent(Temp); Temp = "<li><a href="/nl/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.
3 Reacties
Markus
Hallo,
vielen Dank für das wunderbare Projekt.
Ich habe es mir einmal durchgelesen und bin gespannt wie es funktionieren wird.
Freundliche Grüße!
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
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); ^