【问题标题】:How to read/write a MIFARE tag with Arduino at NFC?如何在 NFC 上使用 Arduino 读取/写入 mifare 标签?
【发布时间】:2012-11-30 02:52:46
【问题描述】:

我正在开发一个从 mifare 标签读取和写入数据的应用程序。我买了一台可以使用 NFC 技术读写 mifare 标签操作的设备。 NFC Shield 我一直在使用 mifare ultralight 标签,但在尝试验证特定内存地址时遇到问题。由于这个原因,我无法开始阅读。这是我的 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 超轻标签制作的。在写操作的时候也遇到了同样的问题。

我该如何解决这个问题?

【问题讨论】:

    标签: arduino nfc mifare


    【解决方案1】:

    我遇到了同样的问题,我编辑了 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】:

      MIFARE Ultralight 与 MIFARE Classic 1K 不同。 MIFARE Ultralight 不支持(或不需要)身份验证。您可以直接开始阅读而无需使用身份验证。

      【讨论】:

        【解决方案3】:

        使用PN532 libraryNDEF library,您可以读/写mifare classic 标签和读mifare ultralight 标签。

        【讨论】:

        • NDEF 是 Mifare Classic 或 Ultralight 之上的额外协议。使用 NDEF 库,您将 NDEF 记录编码到 Mifare Classic 块或 Mifare Ultralight 块中。由于 NDEF 开销,您将丢失字节。
        【解决方案4】:

        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 卡需要身份验证。

        读/写长度

        出于兼容性原因,“读取”请求 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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-10
          • 1970-01-01
          • 2020-02-05
          • 1970-01-01
          • 1970-01-01
          • 2014-07-05
          • 2021-11-07
          相关资源
          最近更新 更多