es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar la biblioteca Mfrc522 de dotnet/iot.

Quiero leer los datos de una etiqueta NFC con mi RC522 conectado a una Raspberry Pi. Me gusta mucho más la programación en C# que Python, así que decidí usar la biblioteca Mfrc522 (https://github.com/dotnet/iot/tree/main/src/devices/Mfrc522) de dotnet/iot.

Pero con la biblioteca Mfrc522 no obtengo ninguna información de la tarjeta.

“`int pinReset = 22;
board = Board.Create();
GpioController gpioController = board.CreateGpioController();

SpiConnectionSettings connection = new(0, 1);
// Here you can use as well MfRc522.MaximumSpiClockFrequency which is 10_000_000
// Anything lower will work as well
connection.ClockFrequency = 5_000_000;
SpiDevice spi = board.CreateSpiDevice(connection);
mfrc522 = new(spi, pinReset, gpioController, false);

bool res;

Console.WriteLine("Start Listening");

Data106kbpsTypeA card;
do
{
res = mfrc522.ListenToCardIso14443TypeA(out card, TimeSpan.FromSeconds(2));
Thread.Sleep(res ? 0 : 200);
}
while (!res);

Console.WriteLine("CardFound");

Console.WriteLine();
if (UltralightCard.IsUltralightCard(card.Atqa, card.Sak))
{
Console.WriteLine("Ultralight card detected, running various tests.");
ProcessUltralight();
}
else
{
Console.WriteLine("Mifare card detected, dumping the memory.");
ProcessMifare();
}“`

Pero res = mfrc522.ListenToCardIso14443TypeA(out card, TimeSpan.FromSeconds(2)); es siempre falso, he probado diferentes tarjetas y etiquetas.
En la documentación establecen 4 para el pinReset, esto no funcionó, así que probé con 22 porque RST es el pin 22, pero sin éxito.

El cableado es correcto porque si ejecuto el script de Python:

#!/usr/bin/env python
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
try:
id, text = reader.read()
print(id)
print(text)
finally:
GPIO.cleanup()

Todo funciona sin problemas.

Uso una Raspberry 3 B+ y RC522 (https://joy-it.net/de/products/SBC-RFID-RC522).

EDIT:
Compré un módulo de cómputo Raspberry 4, con la nueva Raspberry la biblioteca funciona y obtengo una tarjeta.

Pero si intento leer mis tarjetas Mifare 1k siempre obtengo “Error de autenticación”, el valor devuelto del Authcommand siempre es -1.

“`static void ProcessMifare()
{
Console.WriteLine($"ID: {Encoding.UTF8.GetString(card.NfcId)}");
var mifare = new MifareCard(mfrc522!, 0);
mifare.SerialNumber = card.NfcId;
mifare.Capacity = MifareCardCapacity.Mifare1K;
mifare.KeyA = MifareCard.DefaultKeyA.ToArray();
mifare.KeyB = MifareCard.DefaultKeyB.ToArray();
int ret;

<pre><code>for (byte block = 0; block < 64; block++)
{
mifare.BlockNumber = block;
mifare.Command = MifareCardCommand.AuthenticationB;
ret = mifare.RunMifareCardCommand();
if (ret < 0)
{
// If you have an authentication error, you have to deselect and reselect the card again and retry
// Those next lines shows how to try to authenticate with other known default keys
mifare.ReselectCard();
// Try the other key
mifare.KeyA = MifareCard.DefaultKeyA.ToArray();
mifare.Command = MifareCardCommand.AuthenticationA;
ret = mifare.RunMifareCardCommand();
if (ret < 0)
{
mifare.ReselectCard();
mifare.KeyA = MifareCard.DefaultBlocksNdefKeyA.ToArray();
mifare.Command = MifareCardCommand.AuthenticationA;
ret = mifare.RunMifareCardCommand();
if (ret < 0)
{
mifare.ReselectCard();
mifare.KeyA = MifareCard.DefaultFirstBlockNdefKeyA.ToArray();
mifare.Command = MifareCardCommand.AuthenticationA;
ret = mifare.RunMifareCardCommand();
if (ret < 0)
{
mifare.ReselectCard();
Console.WriteLine($"Error leyendo bloque: {block}");
}
}
}
}

if (ret >= 0)
{
mifare.BlockNumber = block;
mifare.Command = MifareCardCommand.Read16Bytes;
ret = mifare.RunMifareCardCommand();
if (ret >= 0)
{
if (mifare.Data is object)
{
Console.WriteLine($"Bloque: {block}, Datos: {BitConverter.ToString(mifare.Data)}");
}
}
else
{
mifare.ReselectCard();
Console.WriteLine($"Error leyendo bloque: {block}");
}

if (block % 4 == 3)
{
if (mifare.Data != null)
{
// Check what are the permissions
for (byte j = 3; j > 0; j–)
{
var access = mifare.BlockAccess((byte)(block – j), mifare.Data);
Console.WriteLine($"Bloque: {block – j}, Acceso: {access}");
}

var sector = mifare.SectorTailerAccess(block, mifare.Data);
Console.WriteLine($"Bloque: {block}, Acceso: {sector}");
}
else
{
Console.WriteLine("No se puede revisar ningún bloque de sector");
}
}
}
else
{
Console.WriteLine($"Error de autenticación, ret es {ret}");
}
}
</code></pre>

}“`

He utilizado diferentes tarjetas pero siempre obtengo un error, excepto la primera vez que leo la tarjeta, la primera vez obtuve el volcado de memoria hasta el bloque 62 y luego también obtuve el error de autenticación. Pero solo funcionó una vez desde entonces nunca volvió a funcionar, también reinicié, etc.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que puede haber problemas de compatibilidad entre la librería Mfrc522 y la configuración específica de su hardware. Aunque la librería está diseñada para funcionar con el RC522, es posible que ciertas configuraciones del Raspberry Pi y/o el RC522 estén causando que la librería falle.

    Una cosa que podría intentar es verificar que su RC522 sea realmente compatible con la librería Mfrc522. Podría revisar la documentación del RC522 y ver si menciona alguna librería específica que se requiere para que funcione correctamente.

    Otra cosa a revisar es su configuración de cableado. Es posible que haya un problema con el cableado que esté evitando que el RC522 se comunique correctamente con el Raspberry Pi. Verifique todas las conexiones y asegúrese de que estén correctas y seguras.

    Si todo lo demás falla, podría intentar usar una librería diferente, o incluso cambiar a Python si encuentra que es más adecuado para sus necesidades. Aunque C# es un gran lenguaje para ciertas tareas, no siempre es la mejor opción para todas las situaciones. En última instancia, lo más importante es encontrar una solución que funcione de manera confiable y eficiente para sus necesidades específicas.

Comments are closed.