MFRC522和特定扇区/块读取

时间:2016-06-18 16:18:10

标签: arduino rfid mifare

我正在使用嵌入8种不同游戏片段的Mifare标签创建游戏。我将使用带有MFRC522(库https://github.com/miguelbalboa/rfid)的Arduino NANO来实际读取标签,并使用ER301读/写器(使用电子阅读器软件)为它们分配游戏片数。我将创造每件作品的倍数,以防止由于破损或盗窃而造成的任何问题(由于这些是相当独特的游戏件)。由于将有8个不同的部分,每个部分4个副本,这将是32个UID以跟上。我宁愿为每个部分分配一个不同的编号,每个部分的编号也相同 - 所以只有8个数字可以跟上。

我的问题是 - 如何使用MFRC522读取某个块和扇区?

具体来说,第2区,第8区 - 因为这是游戏棋子编号的十六进制等值出现的地方(当它被指定为eReader软件和ER301编写器的产品名称时)。我理解使用MFRC522的库来读取UID,但这比我的理解更深入。

我已经为Arduino写了几个草图,但这是我对RFID世界的尝试,并且比我以前的Arduino项目要广泛得多。一旦我可以阅读特定的部门&阻止,Arduino NANO将输出一个二进制表示(在4个数字I / O上),其中放置了游戏片。

1 个答案:

答案 0 :(得分:0)

您正在使用的库提供了专用方法来对MIFARE标记执行读写操作:

StatusCode MIFARE_Read(byte blockAddr, byte *buffer, byte *bufferSize);
StatusCode MIFARE_Write(byte blockAddr, byte *buffer, byte bufferSize);

由于您的描述(第2部分,第8部分)表明您使用的是MIFARE Classic标记,因此您还需要对标记进行身份验证才能执行读/写操作。因此,您还需要身份验证方法:

StatusCode PCD_Authenticate(byte command, byte blockAddr, MIFARE_Key *key, Uid *uid);

就像您使用该库读取UID一样

if (mfrc522.PICC_ReadCardSerial()) {
    Serial.print(F("Card UID:"));
    dump_bytes(mfrc522.uid.uidByte, mfrc522.uid.size);
}

你也可以访问这些读/写方法:

MFRC522::StatusCode status;
MFRC522::MIFARE_Key key;
byte buffer[18];
byte size = sizeof(buffer);
for (byte i = 0; i < MFRC522::MF_KEY_SIZE; ++i) {
    key.keyByte[i] = 0xFF;
}

if (mfrc522.PICC_ReadCardSerial()) {
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 8, &key, &(mfrc522.uid));
    if (status == MFRC522::STATUS_OK) {
        status = mfrc522.MIFARE_Read(8, buffer, &size);
        if (status == MFRC522::STATUS_OK) {
            Serial.print(F("Data (block = 8): "));
            dump_bytes(buffer, 16);
        }
    }
}

请注意,我假设使用密钥A将块8(=扇区2,块0)作为readbale,并且将密钥A设置为默认传输密钥FF FF FF FF FF FF。如果您的其他读者更改了这些值,则需要相应地调整代码。此外,我使用伪方法dump_bytes(array, length)来表示有趣的值是length的第一个array字节。实际打印这些值的实现取决于您。

顺便说一下。关于如何使用库进行读/写操作的完整示例实际上与库一起提供!所以你可以看看ReadAndWrite.ino如何使用该库。