Text von NFC-Tag lesen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Hey, um den Inhalt des Tags zu lesen, der im NDEF-Format (NFC Data Exchange Format) gespeichert ist, brauchst du noch ein bisschen zusätzlichen Code.

Es gibt die Bibliothek

adafruit_pn532

die Funktionen zum Lesen und Schreiben von Daten auf MiFare-Karten bietet, wie zum Beispiel

mifare_classic_read_block

und

mifare_classic_write_block

Damit kannst du Datenblöcke auf der Karte lesen und schreiben, aber sie interpretieren die Daten nicht als NDEF-Nachrichten.

Um NDEF-Nachrichten zu lesen und zu schreiben, brauchst du eine weitere Bibliothek, die das NDEF-Format unterstützt. Eine solche Bibliothek ist

ndeflib

die du mit

pip install ndeflib

installieren kannst.

Nach der Installation kannst du

ndeflib

verwenden, um NDEF-Nachrichten zu lesen und zu schreiben. Hier ist ein einfaches Beispiel, wie du eine NDEF-Nachricht von einer MiFare-Karte liest:

import ndef
from adafruit_pn532.i2c import PN532_I2C


# Initialisieren das PN532-Modul wie im Tutorial
pn532 = PN532_I2C(i2c, debug=False)


# Warte auf eine Karte
uid = pn532.read_passive_target(timeout=0.5)
if uid is not None:
    print('Found card with UID:', [hex(i) for i in uid])


    # Lesen den ersten Block der Karte
    data = pn532.mifare_classic_read_block(4)
    if data is not None:
        # Interpretiere die Daten als NDEF-Nachricht
        message = ndef.message_decoder(data)
        for record in message:
            print('Record type:', record.type)
            print('Record data:', record.data)


Dass ist nur ein einfaches Beispiel und ist möglicherweise nicht für alle NFC-Tags kompatibel. Manche Tags verwenden spezielle Formate oder Sicherheitsmechanismen, die zusätzlichen Code erfordern.


Ompyl 
Fragesteller
 18.05.2023, 08:59

Danke, zu mifare_classic_read_block() und pn532.ntag2xx_read_block() bin ich gekommen, aber ndeflib hab ich nicht gekannt.

Danke, du hast mir viel Arbeit erspart!

1
Ompyl 
Fragesteller
 18.05.2023, 11:18

aber ganz so einfach ist es nicht, in diesem Porgramm würdest du ja nur den Block 4 auslesen, und einfach von 0 bis 27 kann man auch nicht, da davor andere Daten gespeichert sind (Encoding, UUID, Schreibschutz), So sieht der Tag in Hex aus: https://imgur.com/a/8xMgmhY

0