1

我正在开发一个用于从 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 和 seedtudio NFC Shield v1.0 和 mifare 超轻标签制作的。在编写操作过程中也遇到了同样的问题。

我怎么解决这个问题 ?

4

4 回答 4

2

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

于 2012-12-12T18:54:52.877 回答
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 ;-)

于 2015-07-22T15:04:15.387 回答
1

With PN532 library and NDEF library, you can read/write mifare classic tags and read mifare ultralight tags.

于 2013-11-12T01:05:18.533 回答
0

维基百科中,您可以阅读

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

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

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

他们在文件中谈到 Mifare Ultralight:

访问数据块

为了访问卡,您必须执行以下两个步骤:“连接”到 Mifare Ultralight 卡并检索卡的 7 字节 UID。一旦建立了被动模式连接,就可以直接读取和写入内存。Mifare Ultralight 卡不需要身份验证。

读/写长度

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

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

更新!!

我发现 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

我希望它们与您的盾牌兼容。

于 2013-08-29T19:38:34.447 回答