如何在NFC上使用Arduino读取/写入mifare标签?

时间:2012-12-12 11:50:32

标签: arduino nfc mifare

我正在开发一个从mifare标签读取和写入数据的应用程序。我买了一台可以用NFC技术读写mifare标签操作的设备。 NFC Shield 我一直在使用mifare超轻标签,但在尝试验证特定内存地址时遇到问题。因此我无法开始阅读。这是我的Arduino代码:

//This example reads a MIFARE memory block. It is tested with new MIFARE 1K cards.
//Uses default keys.
//Contributed by Seeed Technology Inc (www.seeedstudio.com)

#include <PN532.h>

#define SCK 52
#define MOSI 51
#define SS 10
#define MISO 50

PN532 nfc(SCK, MISO, MOSI, SS);

void setup(void) {
  Serial.begin(9600);
  Serial.println("Hello!");

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  // Got ok data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  Serial.print("Supports "); Serial.println(versiondata & 0xFF, HEX);

  // configure board to read RFID tags and cards
  nfc.SAMConfig();
}

void loop(void) {
  uint32_t id;
  // look for MiFare type cards
  id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

  if (id != 0) {
    Serial.print("Read card #"); Serial.println(id);

    uint8_t keys[]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
    if(nfc.authenticateBlock(1, id ,0x08,KEY_A,keys)) { //authenticate block 0x08
      Serial.print("giris tmm #");
      //if authentication successful
      uint8_t block[16];
      //read memory block 0x08
      if(nfc.readMemoryBlock(1,0x08,block)) {
        Serial.print("Read tmm #");
        //if read operation is successful
        for(uint8_t i=0;i<16;i++) {
          //print memory block
          Serial.print(block[i],HEX);
          Serial.print(" ");
        }
        Serial.println();
      }
    }
  }

  delay(500);
}

此阅读代码是为Arduino Mega 2560和seedstudio NFC Shield v1.0以及mifare超轻型标签制作的。写作过程中也遇到了同样的问题。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

MIFARE Ultralight与MIFARE Classic 1K不同。 MIFARE Ultralight不支持(或需要)身份验证。您可以在不使用身份验证的情况下开始阅读。

答案 1 :(得分:2)

我遇到了同样的问题,并编辑了Mifare Classic示例来读取Mifare Ultralight卡片。这是我的代码:https://gist.github.com/SamDecrock/bd1ec55f083a71ecee95

输出应该是这样的:

Looking for PN532...
Found chip PN532
Firmware ver. 1.6
Waiting for an ISO14443A Card ...
Found an ISO14443A card
  UID Length: 7 bytes
  UID Value: 4 13 74 72 83 1E 81 
Page 0   04 13 74 EB    ..t.
Page 1   72 83 1E 81    r...
Page 2   6E 48 00 00    nH..
Page 3   E1 11 06 00    ....
Page 4   00 00 00 00    ....
Page 5   00 00 00 00    ....
Page 6   00 00 00 00    ....
Page 7   00 00 00 00    ....
Page 8   00 00 00 00    ....
Page 9   00 00 00 00    ....
Page 10  00 00 00 00    ....
Page 11  00 00 00 00    ....
Page 12  00 00 00 00    ....
Page 13  00 00 00 00    ....
Page 14  00 00 00 00    ....
Page 15  00 00 00 00    ....


Send a character to run the mem dumper again!

如您所见,第0页和第1页包含UID; - )

答案 2 :(得分:1)

使用PN532 libraryNDEF library,您可以读/写mifare经典标签并阅读mifare超轻标签。

答案 3 :(得分:0)

wikipedia中,您可以阅读

  

“MIFARE Ultralight只有512位内存(即64字节),   没有加密安全性。内存以16页的形式提供   4个字节。“

所以我认为至少你必须更改删除 authenticateBlock 的代码并开始读取4个字节长的块。

adafruit.com上有一份文件,其中解释了Mifare Classic and Mifare Ultralight的工作原理。关于你从Mifare Ultralight读取的字节含义有一些提示。

他们在文件中谈到了Mifare Ultralight:

  

访问数据块

     

要访问这些卡,您必须执行以下两个步骤:“连接”到Mifare Ultralight卡并   检索卡的7字节UID。可以读写内存   直接进行被动模式连接。没有   Mifare Ultralight卡需要进行身份验证。

     

读/写长度

     

出于兼容性原因,对“a”的“读取”请求   Mifare Ultralight卡一次可检索16个字节(4页)   (对应于Mifare Classic卡的块大小)。对于   例如,如果您指定要在实际页面中阅读第3页   将读取并返回3,4,5和6,您可以简单地丢弃   最后12个字节,如果不需要它们。如果您选择更高的页面,   16字节读取将换行到第0页。例如,读取页面   14实际上将返回第14,15,0和1页。

     

“写入”请求以页面(4个字节)发生,因此没有问题   覆盖后续页面上的数据。

<强> UPDATE !!

我发现adafruit有两个用于adruino的NFC库(一个使用I2C和另一个SPI),并且都实现了一个名为的方法:

// Mifare Ultralight functions
  uint8_t mifareultralight_ReadPage (uint8_t page, uint8_t * buffer);

图书馆在这里:learn.adafruit.com/adafruit-pn532-rfid-nfc/arduino-library

我希望他们与你的盾牌兼容。

相关问题