Arduino mit MFRC522-Reader

Arduino mit MFRC522-Reader

Lesen des Speichers

In diesem Abschnitt werden wir auf den internen Speicher unseres Tag-Chips zugreifen. Wir werden in diesem Zusammenhang aber auch noch weitere nützliche Methoden der MFRC522-Bibliothek kennen lernen.

Zunächst brauchen wie einige weitere Variablen, in der wir z. B. für die Angabe des zu lesenden Blocks und der Blocklänge und natürlich einen Puffer, in den wir die Daten schreiben:



Darüber brauchen wir eigentlich kein Wort zu verlieren, wäre da nicht eine etwas seltsame Konstruktion mit dem Namen:

MFRC522::MIFARE_Key keyA;

Hierbei handelt es ich um einen speziellen Datentypen "MIFARE_Key", der in der Klasse MFRC522 definiert ist. Auf eine Klassenvariable greifen wir über "KLASSE::variable" zu, auf eine Instanzvariable hingegen über "instanz.variable". Das gehört aber zu den Grundlagen der objektorientierten Programmierung in C++, auf die wir hier leider nicht eingehen können.

Von diesem Typ definieren wir die Variable "keyA", die wir für den Authentifikations-Schlüssel benötigen.

Kommen wir zum Setup-Teil unseres Read-Programms:



Erwähnenswert ist hier nur die "for-Schleife", mit der wir 6 Mal den Wert "0xff" in das Array "keyByte" der Variablen keyA schreiben. Für "bBlock" wählen wir 0, wir wollen also den ersten Speicherblock mit den Herstellerdaten lesen.

Weiter geht´s zum Hauptteil unseres neuen Programms:



Im ersten Schritt führen wir einen Request durch und speichern das Ergebnis in "bStatus". In der MFRC522-Klasse gibt es eine Enumeration, in der "STATUS_OK" definiert ist, der einer "1" entspricht. Ein "STATUS_TIMEOUT" wäre z. B. die "4". Erhalten wir eine "1" springen wir in die folgende if-Verzweigung.

Dort selektieren wir den Tag und wir holen uns über die Methode:

mfrc522.PICC_GetType()

den genauen Kartentyp, den wir aus dem Wert für "SAK" ermitteln. Die Rückgabe ist allerdings nur ein numerischer Wert und deshalb rufen wir im Anschluss die Methode:

mfrc522.PICC_GetTypeName()

die wiederum der Zahl einen konkreten Namen zuordnet, den wir dann auch ausgeben.

Das war nur ein wenig Kosmetik und jetzt kommen wir zum interessanten Teil, denn mit:

mfrc522.PCD_Authenticate();

und dieser Methode übergeben wir zunächst eine Konstante, mit der wir festlegen, welche Authentifikation wir anwenden, in diesem Fall nutzen wir Schlüssel A. Danach folgt die Angabe des Trailer-Blocks. Wir wollen den ersten Block (Block 0) lesen, der liegt im 1. Sektor und der TrailerBlock des 1. Sektors ist Block 4. Dann übergeben wir den Schlüssel "keyA" und die UID der Karte.

Diese Methode vergleicht also unseren eingegebenen Schlüssel mit dem Eintrag, der sich im 4. Block in den Bytes "KEY_A" befindet. Die Übertragung geschieht allerdings verschlüsselt und deshalb brauchen wir auch den etwas seltsam anmutenden Variablentyp "MIFARE_Key".

Ist alles glatt gelaufen, wurde unsere Karte in den Zustand "ACTIVE" versetzt und wir können nun lesen. Dazu verwenden wir den Befehl:

mfrc522.MIFARE_Read();

Als Parameter übergeben wir...

Die Funktion "dump_byte_array()" dient lediglich zur formatierten Ausgabe des Arrays, bedarf keiner Erläuterungen und ist wie folgt aufgebaut:



Bleiben noch zwei Befehle in der Hauptschleife, nämlich das Blockieren des Tags durch "mfrc522.PICC_Halt()" und der letzte Befehl lautet: "mfrc522.PCD_StopCrypto1()". Aus Sicherheitsgründen werden alle Zugriffe auf den Speicher verschlüsselt durchgeführt. Der Reader befindet sich nach den obigen Zugriffen aber noch immer im Kryptografie-Modus und würde einen Request nicht mehr korrekt ausführen. Deshalb schalten wir diese Betriebsart wieder ab.

Unser Ergebnis, wenn wir hintereinander 2 Tags auf den Reader legen: