Estoy trabajando en un proyecto para mi Makerspace local, tenemos un presupuesto limitado, así que esperaba usar los lectores RFID-RC522 el'cheap'o RFID / NFC en eBay. Recibí un par de placas basadas en SPI, sin embargo funcionan. Los ejemplos de código para ellos son limitados.
He encontrado varias bibliotecas diferentes y me decidí por esta: https://github.com/ljos/MFRC522
El problema es que todo el código disponible en línea parece surgir del código Python de algunos chinos que la gente ha traducido y pirateado en una biblioteca Arduino.
El código funciona, pero las tarjetas Mifare deben tener UID de 4, 7 o 10 bytes y el ejemplo / biblioteca está devolviendo un número de serie de 5 bytes.
No hay documentación y la hoja de datos de NXP es incomprensible ... Además, parece funcionar con la mayoría de las tarjetas, pero no funciona con las tarjetas Mastercard PayWave que cumplen con el estándar ISO 14443. El lector RDM880 más caro, que se basa en el MFRC500, funciona bien y tiene una buena biblioteca, pero el costo hace que la implementación sea imposible.
Entonces, ¿alguien puede ayudarme a conseguir que esta unidad basada en NXP MFRC522 lea el UID de todas las tarjetas ISO 14443?
#include <SPI.h>
#include <MFRC522.h>
#define RFID_SS 10
#define RFID_RST 5
MFRC522 rfid( RFID_SS, RFID_RST );
void setup() {
SPI.begin();
Serial.begin(115200);
rfid.begin();
}
void loop() {
byte data[MAX_LEN];
byte uid[5];
if ( rfid.requestTag( MF1_REQIDL, data ) == MI_OK ) {
if ( rfid.antiCollision( data ) == MI_OK ) {
memcpy( uid, data, 5 );
for ( int i = 0; i < 5; i++ ) {
Serial.print( uid[i], HEX );
Serial.print( ' ' );
}
Serial.println();
}
}
}
uid
matriz es de longitud 5. ¿Intentó usar una matriz más grande ya que desea un resultado de 10 bytes?Respuestas:
Lo siento, pero debo estar en desacuerdo con su 'hoja de datos NXP es incomprensible' . Desde la PRIMERA PÁGINA de la hoja de datos MFRC522:
'Observación: El MFRC522 admite todas las variantes de los protocolos de identificación MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 y MIFARE Plus RF'
Aquí dice que el MFRC522 cubre solo una parte de ISO / IEC 14443. Falta lo siguiente del NXP RC522:
* MIFARE DESFire EV1 (incluye cifrado AES)
MIFARE DESFire EV2 (incluye MIsmartApp, Transaction MAC, Aplicaciones ilimitadas MIFARE Plus reemplazo directo para MIFARE Classic con nivel de seguridad certificado (basado en AES 128)
MIFARE SAM AV2 (módulo de acceso seguro que proporciona el almacenamiento seguro de claves criptográficas y funciones criptográficas) *
Estos son probablemente los que se usan en las tarjetas bancarias. Nuevamente, desde la PRIMERA PÁGINA de la hoja de datos MFRC500:
'Todas las capas de protocolo de ISO / IEC 14443 A son compatibles'.
Tendrá que examinar todas las diferentes especificaciones MIFARE / ISO / IEC 14443 para averiguar cuántos bytes de ID hay para los diferentes tipos (sospecho que diferentes tipos devuelven una cantidad diferente de bytes).
Entonces, básicamente, estás jodido. Primavera para el costoso lector basado en MFRC500. Supongo que con el mayor costo también obtienes una API de alta clase, documentación y ejemplos o incluso (¡jadeo!) Soporte técnico.
Salud
fuente
El MFRC522 :: requestTag () devuelve el tipo de tarjeta en los primeros dos bytes del segundo parámetro ( datos en su ejemplo anterior). Deberá observar este valor para determinar qué tipo de tarjeta es. Use esta información para imprimir los N bytes de ID requeridos .
En caso de necesidad, puede volcar los 16 bytes completos (MAX_LEN) y probarlos con sus diversos tipos de tarjeta para ver qué bytes están cambiando de manera determinista, lo que le permite determinar la longitud correcta de la ID.
Y en caso de que le ahorre algo de tiempo, si llama a las funciones de autocomprobación de esa biblioteca: getFirmwareVersion () y digitalSelfTestPass (); es necesario llamar a MFRC522 :: begin () nuevamente, de lo contrario no es posible leer las ID de RFID (en el momento de la escritura, por supuesto).
fuente
Intenta usar el más popular.
https://github.com/miguelbalboa/rfid
Esto es trabajo para mí. Devuelve el uID como lo que deseas. Simplemente elimine las otras funciones, solo la obtención del uid de su ejemplo.
fuente