Arduino NFC Block认证失败

时间:2014-07-14 17:34:57

标签: authentication arduino nfc mifare ndef

我将Arduino Mega 2560和SeeedStudio NFC屏蔽2.0拼凑在一起,并使用了以下库:

我正在尝试将一些文本写入MiFare Classic卡(1024位,32个分区,64位ID),但我一直收到错误:

  

Error.Block身份验证失败4。

以下是我使用的程序:

#include <SPI.h>
#include "PN532_SPI.h"
#include "PN532.h"
#include "NfcAdapter.h"

PN532_SPI interface(SPI, 10);
NfcAdapter nfc = NfcAdapter(interface);

void setup(void) {
  Serial.begin(9600);
  Serial.println("NDEF Reader");
  nfc.begin();
}

void loop(void) {
    Serial.println("\nScan a NFC tag\n");
    if (nfc.tagPresent())
    {
        NfcTag tag = nfc.read();
        tag.print();

        Serial.println("Writing to tag...");

        NdefMessage message = NdefMessage();
        message.addTextRecord("Hello, Arduino!");
        nfc.write(message);
    }
    delay(5000);
}

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

此库仅适用于根据恩智浦关于使用MIFARE Classic作为NDEF标记的应用说明预先格式化的MIFARE Classic卡 1 (请参阅AN1304和{{3} } 可以使用键A 2 编写。

您收到的错误表明,对于扇区1(通常是NDEF应用程序的第一个扇区),无法使用NDEF应用程序的密钥A进行身份验证(D3F7D3F7D3F7)。因此,似乎MF Classic标签未预先格式化(例如,它可能处于传输配置中,并且所有键都设置为FFFFFFFFFFFF)。

因此,你需要

  1. 创建应用程序目录,将所有扇区分配给NDEF应用程序(E103)。有关示例,请参见AN1304中的附录D.
  2. 写入分配给NDEF应用程序的扇区的所有扇区预告片,将密钥A设置为D3F7D3F7D3F7,将GPB设置为40,设置应用程序特定(密钥)密钥B并设置获得合理价值的条件。有关示例,请参见AN1304中的附录D.
  3. 如果将访问条件设置为允许使用密钥A写入的(不太合理)值,则可以使用此NDEF库将NDEF消息写入标记。


  4. 1 )实际上这个库不遵循AN1304 / AN1305甚至读取的NDEF消息只适用于非常有限的子集 MIFARE Classic标签用作NDEF标签。

    2 )用作NDEF标记的MIFARE Classic标记通常不能用公钥A写入,但是(如果有的话)只能用密钥B写入。因此,该库的写入功能是使用非常有限。

答案 1 :(得分:0)

我正在使用相同的库,并且有2个问题(也发布在github上)。也许有人可以帮我吗?抱歉,但是在github以外的地方找不到在线参考/文档。

问题1:关于写作

我正在尝试向MIFARE CLASSIC卡中写入内容。

我尝试使用其中一个:

ndefMessage.addTextRecord("hello, world");
or
ndefMessage.addUriRecord("http://arduino.cc");

但是我需要将新内容写入预写标签。我想在扇区3上执行此操作,因为扇区1已包含数据。有什么(简单的)方法可以做到这一点?到目前为止,它似乎写在扇区1上?

问题2:关于存储数据

另外,当我获得记录时,数据以开头。或.en(或正方形!) 我在github上看到了将数据打印为串行的示例,看起来不错,但是我需要将其存储到变量中。我有点设法做到这一点,但是看起来很丑。有更好的方法吗?

 for(int i=0;i<message.getRecordCount();i++)
              {
                NdefRecord record = message.getRecord(i);
                int payloadLength = record.getPayloadLength();
                byte payload[payloadLength];
                record.getPayload(payload);
                String data = (char *)payload;
                data = data.substring(3,data.length()-2);
                show(data); //my own method to print to serial. Could be serial here.
              }

非常感谢!