1

mifareタグからデータを読み書きするためのアプリケーションを開発しています。NFC技術でmifareタグ操作を読み書きできるデバイスを購入しました。 NFC シールド 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

4 に答える 4

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 に答える
2

MIFARE Ultralight は、MIFARE Classic 1K と同じではありません。MIFARE Ultralight は認証をサポートしていません (または必要としません)。認証を使用せずに読み始めることができます。

于 2012-12-12T18:54:52.877 に答える
1

PN532ライブラリNDEF ライブラリを使用すると、mifare クラシック タグを読み書きし、mifare 超軽量タグを読み取ることができます。

于 2013-11-12T01:05:18.533 に答える
0

ウィキペディアで読むことができます

「MIFARE Ultralight には 512 ビットのメモリ (つまり 64 バイト) しかなく、暗号化によるセキュリティはありません。メモリは 4 バイトの 16 ページで提供されます。」

したがって、少なくともコードを変更してauthenticateBlockを削除し、 4 バイト長のブロックの読み取りを開始する必要があると思います。

adafruit.com には、Mifare Classic と Mifare Ultralightがどのように機能するかを説明するドキュメントがあります。Mifare Ultralight から読み取ったバイトの意味について、いくつかのヒントがあります。

ドキュメントでは、彼らは Mifare Ultralight について次のように述べています。

データ ブロックへのアクセス

カードにアクセスするには、次の 2 つの手順に従う必要があります。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 用の 2 つの NFC ライブラリ (1 つは I2C を使用し、もう 1 つは SPI) があり、両方とも次の名前の 1 つのメソッドを実装していることがわかりました。

// 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 に答える