Acceso restringido a dispositivos a través de tarjeta sin contacto con el NodeMCU y la tercera parte del módulo RC522: WPA, una interfaz web con protección de contraseña, información de estado y una barra de menú expandible.
Después de que en primera parte ha definido el hardware y puede usar una tarjeta para cambiar el relé, le damos a nuestro ESP en la tercera parte de esta fila un botón WPS para asumir automáticamente la configuración de WLAN, así como una página de inicio de sesión para que nuestro ESP se configure contra personas no autorizadas Proteger el cambio.
Registro de WPA:
Para poder guardar los datos de WLAN en nuestro ESP utilizando el método de botón WPA, tenemos que expandir nuestros circuitos básicos presentados en la primera parte.
Necesitamos 3 resistencias precisas con 6.8 KOhm y un botón. Este botón cortocircuita la resistencia media del divisor de voltaje para que nuestro ESP pueda registrar la presión del botón. El diagrama anterior muestra el cableado necesario y debe AGREGARSE a nuestro cableado desde la primera sección.
Aquí está el código:
#include <SPI.h> #include <MFRC522.h> #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <EEPROM.h> #definir RST_PIN 5 // Pin de restablecimiento SPI (salida D1) #definir RELAIS_PIN 16 // Relé (salida D0) [BAJA activa] - También LED interno cerca del puerto USB #definir SS_PIN 15 // Pin de selección de esclavo SPI #definir RGBLED_R 2 // rojo (salida D4) #definir RGBLED_G 0 // Verde (salida D3): también LED interno en el módulo ESP #definir RGBLED_B 4 // azul (salida D2) #definir WiFiPwdLen 25 // Longitud máxima de la contraseña de WiFi #definir STANAMELEN 20 // Longitud máxima de SSID WiFi #definir ESPHostNameLen 20 // Número máximo de caracteres ESPHostName #definir LED_BUILTIN 16 #definir PIN_WIRE_SDA 4 #definir PIN_WIRE_SCL 5 ADC_MODE(ADC_TOUT); // Configure la entrada analógica A0 a externa. ADC_TOUT (para voltaje externo), ADC_VCC (para voltaje del sistema). MFRC522 mfrc522(SS_PIN, RST_PIN); // Crear una instancia del MFRC522 MFRC522::MIFARE_Key clave; ESP8266WebServer servidor(80); // Crear instancia de servidor web estructura WiFiEEPromData { char ESPHostName[ESPHostNameLen]; char APSTAName[STANAMELEN]; // STATION / AP Point Name TO Connect, si está definido char WiFiPwd[WiFiPwdLen]; // WiFiPAssword, si está definido char ConfigValid[3]; // Si Config es Vaild, se requiere la etiqueta "TK" " }; estructura PICCardEEPRomData { char CardVaildUID[4]; char Reservado[4]; }; WiFiEEPromData MyWiFiConfig; PICCardEEPRomData MyEEPROMValidCardUID; // Variable global utilizada bool Resultado = falso; bool LearnNewCard = falso; Cadena temp =""; sin firmar largo ID de sesión; nulo configuración() { pinMode(RST_PIN,SALIDA); digitalWrite(RST_PIN,ALTO); pinMode(RELAIS_PIN,SALIDA); pinMode(RGBLED_R,SALIDA); pinMode(RGBLED_G,SALIDA); pinMode(RGBLED_B,SALIDA); digitalWrite(RELAIS_PIN,ALTO); // relé inactivo SetRGBLed(0,0,0,falso); // Led apagado De serie.comenzar(115200); // Inicializa la comunicación serial con la PC con 115200 baudios ceder(); De serie.println(""); temp = "ATSN:"+ Cadena(ESP.getChipId()); De serie.println(temp); // Serial.print ("Valor ADC:"); Serial.println (analogRead (A0)); SPI.comenzar(); // Inicializa la comunicación SPI ESP.wdtEnable(WDTO_4S); // Iniciar vigilancia ESP.wdtFeed(); digitalWrite(RST_PIN,BAJA); ID de sesión = millis(); ESP.wdtFeed(); Resultado = startWiFiClient(); ESP.wdtFeed(); ceder(); EEPROM.comenzar(512); EEPROM.obtener(100,MyEEPROMValidCardUID); // La tarjeta válida se almacena desde la dirección 100 EEPROM.fin(); InitalizeHTTPServer(); digitalWrite(RST_PIN,ALTO); mfrc522.PCD_Reset(); mfrc522.PCD_Init(); Inicializar módulo de lectura MFRC522 mfrc522.PCD_AntennaOn(); Rendimiento(); Esp.wdtFeed(); SetRGBLed(255,0,255,Falso); Led Color Púrpura Initalización Completada } Iniciar Funciones de ayuda/ optimización ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** Vacío SetRGBLed(Byte RedValue,Byte GreenValue,Byte BlueValue,Booleana SlowFade) Funkion para controlar el RGB Led { digitalWrite(RGBLED_R,Bajo); digitalWrite(RGBLED_G,Bajo); digitalWrite(RGBLED_B,Bajo); Si (RedValue == 255) { digitalWrite(RGBLED_R,Alto); } Si (GreenValue == 255) { digitalWrite(RGBLED_G,Alto); } Si (BlueValue == 255) { digitalWrite(RGBLED_B,Alto); } } Detener la aplicación auxiliar / Funciones de optimización ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* Iniciar funciones servidor Web *********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** Las rutinas de base de cookies se basan en el extracto de GIT: //https://github.com/esp8266/ESPWebServer/blob/master/examples/SimpleAuthentification/SimpleAuthentification.ino Bool is_authentified() { Si (Servidor.Hasheader("Cookie")){ Cookie encontrada Temp = Servidor.Rúbrica("Cookie"); Serial.println(temp); Cadena SessionStr = Cadena(Esp.getChipId()) + "=" + Cadena(Sessionid); Si (Temp.Indexof(SessionStr) != -1) { Autenticación web correcta Temp = ""; devolución Verdad; } } Error en la autenticación web Temp = ""; Sessionid = Millis(); devolución Falso; } Vacío handleLogin(){ Cadena Msg; Cookie de cadena: server.header("Cookie"); Serial.println(cookie); Si (Servidor.hasArg("DESCONECTAR")){ Usuario de desconexión; Servidor.sendHeader("Ubicación","/login"); Servidor.sendHeader("Control de caché","Sin caché"); Sessionid = Millis(); Temp = Cadena(Esp.getChipId()) + " NA ; HttpOnly ; SameSite-Estricto"; Servidor.sendHeader("Establecer cookie",Temp); Temp = ""; Servidor.Enviar(301); devolución; } Si (Servidor.hasArg("NOMBRE DE USUARIO") && Servidor.hasArg("PASSWORD")){ Temp = Cadena(Esp.getChipId()); Si (Servidor.Malo("NOMBRE DE USUARIO") == "admin" && Servidor.Malo("PASSWORD") == Temp ){ Servidor.sendHeader("Ubicación","/"); Servidor.sendHeader("Control de caché","Sin caché"); Sessionid = Millis(); Temp = Cadena(Esp.getChipId()) + "=" + Cadena(Sessionid) + "; HttpOnly ; SameSite-Estricto"; Servidor.sendHeader("Establecer cookie",Temp); Temp = ""; Servidor.Enviar(301); devolución; } Msg = "<script>alert('Nombre de usuario o contraseña incorrectos !'); </script>"; } CSS_Header_Template(); Temp = "<head><title>Login</title></head><body><DIV ALIGN-CENTER>"; Servidor.sendContent(Temp); Temp = "<h2>Registro en el lector de tarjetas RC522</h2><body><br><br><br>table border-0 bgcolor-black><tr><th><DIV ALIGN-RIGHT>"; Servidor.sendContent(Temp); Temp = "<acción de formulario ''/login' método''post'>Nombre de usuario: <tipo de entrada/Nombre de texto''NOMBRE DE USUARIO' Tamaño-17 requerido><br>"; Servidor.sendContent(Temp); Temp = "Contraseña: <tipo de entrada/nombre de la contraseña(Nombre de la contraseña) 'PASSWORD' Size (Tamaño de contraseña) ><br><br><br><br><button type>submit' "; Servidor.sendContent(Temp); Temp = "nombre 'Login_Button' valor '1' estilo 'altura: 30px; ancho: 100px' >Login</button><br></th></tr></form></DIV></table>"; Servidor.sendContent(Temp); Temp = "<br><SMALL>Para iniciar sesión para trabajar, se deben permitir las cookies de este sitio web.</SMALL>"; Servidor.sendContent(Temp); Temp = Msg + "</DIV></body></HTML>"; Servidor.sendContent(Temp); Temp = ""; } Vacío handleNotFound() { Sessionid = Millis(); Temp = "Página no encontrada.; Temp += "URI: "; Temp += Servidor.Uri(); Temp += "AnMethod:"; Temp += (Servidor.Método() == HTTP_GET)?"Get":"POST"; Temp += "AnArguments:"; Temp += Servidor.Args(); Temp += "Un"; Para (uint8_t Ⅰ.=0; Ⅰ.<Servidor.Args(); Ⅰ.++){ Temp += " " + Servidor.argName(Ⅰ.) + ": " + Servidor.Malo(Ⅰ.) + "Un"; } Servidor.Enviar(404, "Texto/sin formato", Temp); Temp = ""; } Vacío handleNewPICC() { Si (!is_authentified()) { Servidor.sendHeader("Ubicación","/login"); Servidor.sendHeader("Control de caché","Sin caché"); Servidor.Enviar(301); devolución; } CSS_Header_Template(); Temp = "<head><title>Kartenleser RC522</title></head><body>"; Servidor.sendContent(Temp); HtmlNavStructure(); Temp = "<script>alert('Bitte JETZT Karte vor den Leser halten!'); </script>"; Servidor.sendContent(Temp); SetRGBLed(255,255,0,Falso); Led Farbe Gelb Programmierungsmodus LearnNewCard = Verdad; Temp = "</body></html>"; Servidor.sendContent(Temp); Servidor.Cliente().Parada(); Temp = ""; } Vacío handleRoot(){ Si (!is_authentified()){ Servidor.sendHeader("Ubicación","/login"); Servidor.sendHeader("Control de caché","Sin caché"); Servidor.Enviar(301); devolución; } Contenido HTML CSS_Header_Template(); Temp = "<head><title>Kartenleser RC522</title></head><body>"; Servidor.sendContent(Temp); HtmlNavStructure(); Temp = "<div ALIGN-CENTER><br><br><br><BIG>Willkommen auf der Smartkartenleser RC522 Webseite.</BIG><br>"; Servidor.sendContent(Temp); Temp = "Resetgrund: " + Cadena(Esp.getResetReason()) + "<br>"; Servidor.sendContent(Temp); Temp = "Freier Heapspeicher:" + Cadena(Esp.getFreeHeap()) + " Bytes<br>"; Servidor.sendContent(Temp); Temp = "Int. Flash:" + Cadena(Esp.getFlashChipRealSize()) + " Bytes<br>"; Servidor.sendContent(Temp); Resultado = mfrc522.PCD_PerformSelfTest(); mfrc522.PCD_Init(); Initialisiere MFRC522 Lesemodul mfrc522.PCD_AntennaOn(); Si (Resultado) {Temp = "RC522 PCD-Estado: OK<br>"; } Más {Temp = "RC522 PCD-Status: Fehler!<br>"; } Servidor.sendContent(Temp); Temp = "ID de CPU: " + Cadena(Esp.getChipId()) + " @ " + Cadena(Esp.getCpuFreqMHz()) + " MHz<br>"; Servidor.sendContent(Temp); Temp = "<br>Sie sind erfolgreich angemeldet !<br><br><form action''/login' method''get'>"; Servidor.sendContent(Temp); Temp = "<tipo de botón 'Enviar' nombre 'DISCONNECT' valor 'YES' estilo 'altura: 30px; ancho: 200px' >Logout</button>"; Servidor.sendContent(Temp); Temp = "</form></div></body></html>"; Servidor.sendContent(Temp); Si (Servidor.hasArg("Reiniciar") ) Sistema de reinicio { Esp.wdtFeed(); Esp.wdtDisable(); Temp = "<script>alert('Das System startet JETZT neu.'); </script>"; Servidor.sendContent(Temp); Servidor.Cliente().Parada(); Temp = ""; Retraso(1000); Esp.Restablecer(); Retraso(4000); } Servidor.Cliente().Parada(); Temp = ""; } Vacío CSS_Header_Template() Formatvorlage f'r alle internen ESP Webseiten. https://wiki.selfhtml.org/wiki/CSS { Servidor.setContentLength(CONTENT_LENGTH_UNKNOWN); Temp = "<! DOCTYPE HTML PUBLIC '-/-//W3C//DTD HTML 4.01 Transitional//EN'><html lang''de'><meta charset''UTF-8'>"; Servidor.Enviar (200, "texto/html", Temp); Temp = "<tipo de estilo'texto/css'>*'margen: 0;padding: 0;' body-background:black;color:darkorchid;font-size: 16px;" ; servidor. sendContent(temp) temp "font-family: sans-serif,arial;.. nav-width: 1300px;altura: 30px;margen: 0 auto;border-radius: 5px;"; Servidor.sendContent(Temp); Temp = "ul li-list-style: none;width: 200px;line-height: 60px;position: relative;background: darkorchid;" ; servidor. sendContent(temp) "temp color""#434f54" estilo "color: #434f54;"> "box-shadow: 0px 2px 5px 0px gris;texto-alinear: center;float: left;background-color: #010000; ul li ul'"; Servidor.sendContent(Temp); Temp = "posición: absoluta;. nav > ul > li:nth-of-type(1)-border-radius: 5px 0px 0px 5px;. nav > ul > li:nth-of-type(5)"; Servidor.sendContent(Temp); Temp = "-border-radius: 0px 5px 5px 0px;- ul li a-color: rgb(182, 18, 18);width: 200px;height: 58px;display: inline-block;" ; servidor. sendContent(temp) "temp color""#434f54" style-"color: #434f54;">- "text-decoration: none;" ul li a:hover-font-weight: bold;border-bottom: 2px solid #fff; ul li ul-display: none;; Servidor.sendContent(Temp); Temp = ".nav ul li:hover ul-display: block;. fa-margen-derecha: 5px;. contenedor-ancho: 1000px;altura: 200px;" ; servidor. sendContent(temp) temp - "margin: 0 auto;padding:20px 20px;- @media pantalla y (ancho máximo: 480px) , encabezado, ancho: 100%; "; Servidor.sendContent(Temp); Temp = ".nav-display: none;width: 100%;altura: auto; ul li-ancho: 100%;float: none; ul li a-width: 100%;" ; servidor. sendContent(temp) "temp color""#434f54" style-"color: #434f54;"> "display: block;" ul li ul-posición: estática; ul li li a-background: #222;. fa-list.modify-display: block;-"; Servidor.sendContent(Temp); Temp = ".contenedor-ancho: 100%;altura: auto;- body-overflow-x:hidden; </estilo>"; Servidor.sendContent(Temp); Temp = ""; } Vacío HtmlNavStructure() { Temp = "<div class''menu'><nav class'nav'><ul>"; Servidor.sendContent(Temp); Temp = "<li><a href'''>Sistema</a>"; Servidor.sendContent(Temp); Temp = "<ul><li><a href''/'>Información</a></li>"; Servidor.sendContent(Temp); Temp = "<li><a href'/? Reiniciar-YES'>Neustart</a></li>"; Servidor.sendContent(Temp); Temp = "</ul>"; Servidor.sendContent(Temp); Temp = "</li><li><a href''''>PICC</a>"; Servidor.sendContent(Temp); Temp = "<ul><li><a href''/newPICC'>Karte registrieren</a></li></ul>"; Servidor.sendContent(Temp); Temp = "</li>"; Servidor.sendContent(Temp); Temp = "</ul></nav></div>"; Servidor.sendContent(Temp); Temp = ""; } Vacío InitalizeHTTPServer() { Bool initok = Falso; Const Char * headerkeys[] = {"Agente-usuario","Cookie"} ; Encabezado zum Tracken Size_t headerkeyssize = Sizeof(headerkeys)/Sizeof(Char*); Encabezado zum Tracken Servidor.En("/", handleRoot); Servidor.En("/login", handleLogin); Servidor.En("/newPICC", handleNewPICC); Servidor.onNotFound ( handleNotFound ); Servidor.collectHeaders(headerkeys, headerkeyssize );Servidor anweisen, diese zu Tracken Servidor.Comenzar(); Inicio del servidor web } ******************************************************************************************************************************************************************************************************************************************************************* ******************************************************************************************************************************************************************************************************************************************************* Funktion von https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/wps-mit-dem-esp8266?ls=de Bool startWPS() { Bool wpsSuccess = Wifi.beginWPSConfig(); Si(wpsSuccess) { Muss nicht immer erfolgreich hei-en! Nach einem Timeout ist die SSID leer Cadena newSSID = Wifi.Ssid(); Si(newSSID.Longitud() > 0) { Nur wenn eine SSID gefunden wurde waren wir erfolgreich Rendimiento(); Serial.println("ATWPS:OK"); saveCredentials(); Guardar credenciales en EEPROM } Más { Serial.println("ATWPS:NOK"); } } devolución wpsSuccess; } Bool startWiFiClient() { Bool WiFiClientStarted = Falso; Size_t A0_ADCValue = 0; Byte Ⅰ = 0; Byte connRes = 0; Serial.setDebugOutput(Falso); Zu Debugzwecken aktivieren. Wifi.Host("CrdRdr41667"); Wifi.softAPdisconnect(Verdad); Wifi.Desconecte(); Wifi.Modo(WIFI_STA); Si(loadCredentials()) { Wifi.Comenzar(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); Mientras (( connRes != 3 ) Y( connRes != 4 ) Y (Ⅰ != 30)) si connRes 0 "IDLE_STATUS - cambiar Statius" { Ⅰ++; Serial.print("."); Conectar vorgang auf der seriellen Schnittstelle beobachten Esp.wdtFeed(); Retraso(500); Rendimiento(); connRes = Wifi.waitForConnectResult(); } Si (connRes == 4 ) { si la contraseña es incorrecta Serial.println("ATWIFI:PWDERR"); Wifi.Desconecte(); } Si (connRes == 6 ) { módulo no está configurado en modo estación Serial.println("ATWIFI:STAERR"); Wifi.Desconecte(); } } Si(Wifi.Estado() == WL_CONNECTED) { Esp.wdtFeed(); Serial.Impresión("ATIP:"); Serial.println(Wifi.localIP()); Wifi.setAutoReconnect(Verdad); Establezca si el módulo intentará volver a conectarse a un punto de acceso en caso de que se desconecte. Configurar el respondedor MDNS Si (!MDNS.Comenzar("CrdRdr41667")) { Serial.println("ATMDNS:NOK"); } Más { MDNS.addService("http", "tcp", 80); } WiFiClientStarted = Verdad; } Más { A0_ADCValue = analogRead(A0); Wir waren nicht erfolgreich, daher starten wir WPS, wenn WPS Taster an A0 w-hrend des Resets gedr-ckt ist Si (A0_ADCValue > 499) { Si(startWPS()) { Esp.wdtFeed(); Retraso(500); Wifi.Desconecte(); Wifi.Modo(WIFI_STA); Wifi.Comenzar(Wifi.Ssid().c_str(), Wifi.Psk().c_str()); Esp.wdtFeed(); WiFiClientStarted = Verdad; } Más { WiFiClientStarted = Falso; Wifi.Desconecte(); } } Más { Wifi.Desconecte(); } } devolución WiFiClientStarted; } ******************************************************************************************************************************************************************************************************************************************************* *********************** Iniciar funciones Almacenar credenciales WiFi a EEPROM ****************** Bool loadCredentials() { Bool RetValue; Eeprom.Comenzar(512); Eeprom.Obtener(0,MyWiFiConfig); Eeprom.Final(); Si (Cadena(MyWiFiConfig.ConfigValid) == "Tk") { RetValue = Verdad; } Más { RetValue = Falso; No se ha encontrado la configuración de Wi-Fi. } Esp.wdtFeed(); devolución RetValue; } Vacío saveCredentials() Guardar credenciales de Wi-Fi en EEPROM { Size_t Ⅰ.; Para (Ⅰ. = 0 ; Ⅰ. < Sizeof(MyWiFiConfig) ; Ⅰ.++) Loeschen de la antigua configuración { Eeprom.Escribir(Ⅰ., 0); } Para (Ⅰ. = 0 ; Ⅰ. < STANameLen ; Ⅰ.++) Loeschen de la antigua configuración { MyWiFiConfig.WiFiPwd[Ⅰ.] = 0; } Para (Ⅰ. = 0 ; Ⅰ. < WiFiPwdLen ; Ⅰ.++) Loeschen de la antigua configuración { MyWiFiConfig.APSTAName[Ⅰ.] = 0; } Temp = Wifi.Ssid().c_str(); Ⅰ. = Temp.Longitud(); Temp.Tochararray(MyWiFiConfig.APSTAName,Ⅰ.+1); Temp = Wifi.Psk().c_str(); Ⅰ. = Temp.Longitud(); Temp.Tochararray(MyWiFiConfig.WiFiPwd,Ⅰ.+1); Temp = ""; Strncpy(MyWiFiConfig.ConfigValid , "Tk", Sizeof(MyWiFiConfig.ConfigValid) ); Eeprom.Comenzar(512); Eeprom.Poner(0, MyWiFiConfig); Eeprom.Cometer(); Eeprom.Final(); Esp.wdtFeed(); } FUNCIONEs END StoreCredentialsto EEPROM ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* Vacío Bucle() Lazo principal { Sólo cuando se encuentra una tarjeta y se puede leer lo hace si se ejecuta el contenido Si (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) PICC - tarjeta de circuito integrada de proximidad - tarjeta de chip sin contacto { Serial.Impresión("PICC UID:"); Para (Byte Ⅰ. = 0; Ⅰ. < mfrc522.Uid.Tamaño; Ⅰ.++) { Distancia entre los números HEX y cero a la izquierda en byte < 16 Serial.Impresión(mfrc522.Uid.uidByte[Ⅰ.] < 0x10 ? " 0" : " "); Serial.Impresión(mfrc522.Uid.uidByte[Ⅰ.], Hexagonal); } Bool Isvalid = Verdad; Si (LearnNewCard) { Para (Byte Ⅰ. = 0; Ⅰ. < Sizeof(MyEEPROMValidCardUID.CardVaildUID); Ⅰ.++) { MyEEPROMValidCardUID.CardVaildUID[Ⅰ.] = mfrc522.Uid.uidByte[Ⅰ.]; Eeprom.Comenzar(512); Eeprom.Poner(100,MyEEPROMValidCardUID); Eeprom.Cometer(); Eeprom.Final(); LearnNewCard = Falso; } Isvalid = Verdad; } Más { Para (Byte Ⅰ. = 0; Ⅰ. < Sizeof(MyEEPROMValidCardUID.CardVaildUID); Ⅰ.++) { Si (mfrc522.Uid.uidByte[Ⅰ.] != MyEEPROMValidCardUID.CardVaildUID[Ⅰ.]) { Isvalid = Falso; } } } Si (Isvalid) { Bool PinState= digitalRead(RELAIS_PIN); PinState = !PinState; digitalWrite(RELAIS_PIN, PinState); SetRGBLed(0,255,0,Falso); Led Green Serial.Impresión("Válido."); Retraso(2000); SetRGBLed(0,0,255,Falso); Lector de color led azul está en condiciones básicas } Más { SetRGBLed(255,0,0,Falso) ; Led Red - La última carta no era válida Serial.Impresión("No válido."); Retraso(2000); } Serial.println(); mfrc522.PICC_HaltA(); Coloca la tarjeta de lectura en modo de suspensión para buscar otras tarjetas. Retraso(100); } Servidor.handleClient(); Editar solicitudes de servidor web Rendimiento(); Llamar a funciones internas ESP8266 Esp.wdtFeed(); Perro guardián. Retraso(20); }
Compilamos el código y lo cargamos a nuestro ESP. Iniciamos el monitor serie y vemos la siguiente salida:
La primera línea muestra el número de serie del ESP. Tomamos nota de estos ya que los necesitamos para el primer registro en el sitio web. La segunda línea especifica la dirección IP en nuestra LAN. Ingresamos esta IP en el navegador y obtenemos la siguiente imagen:
El ID de inicio de sesión es:
Nombre de usuario: admin
Contraseña: Número de serie del chip ESP. (número ATSN)
Si el inicio de sesión falla, veremos la siguiente imagen:
De lo contrario, iremos al menú principal:
PICC - Tarjeta de Circuito Integrado de Proximidad
Para autorizar un nuevo mapa, ahora hacemos clic en registrar mapa en el menú "PICC":
El siguiente artículo de la serie dice: Down the Rabbit Hole.. nos ocupamos de las funciones de la tarjeta Classic Mifare y escribimos datos en la tarjeta con chip por primera vez.
1 comentario
Martin Kurth
Ich würde damit eine Wallbox Für ein E-Auto freischalten wollen. Es muss nur ein 12 V / 30mA Kontakt geschaltet werden. Da nehme ich dann ein Omron G3VM Halbleiterrelais.
Sinnvoll wäre auch eine feste IP. Dann muss man nicht im Terminal nach der Adresse schauen, wenn man später darauf zugreifen will. Helfen würde mir eine Routine, die die Freigabe nach einer definierten Zeit wieder entzieht, also den Ausgang wieder abschaltet. Der Ladevorgang dauert Max ca. 8h im ungünstigsten Fall.