elechouse/PN532 ライブラリで Felica 学生カードを読む追試


(Felica/Mifare/NFC チャレンジシリーズ) その他の記事はこちら 「Felica/Mifare/NFC でいろいろ実験」
https://qiita.com/nanbuwks/items/1f416d6e45a87250ee0a


-----

@gpioblink さんの記事「PN532を使ってArduinoでFeliCa学生証を読む方法」
https://qiita.com/gpioblink/items/91597a5275862f7ffb3c
では、PN532 NFC RFID module を使って FeliCa 学生症から学籍番号を読んでました。
この FeliCa 学生証というのはFCFキャンパスカードのことでしょうか。

この記事で使っているライブラリは
https://github.com/elechouse/PN532
です。

この記事を追試してみました。


# 環境
- PN532 NFC RFID module
  - 電解コンデンサ追加加工済
  - cf., 「NFC モジュールの動作安定性を改善する」https://qiita.com/nanbuwks/items/a9217ba2e8f206b899b1
- Arduino 1.8.10 Linux版 (ポータブル化済)
- Arduino UNO
- elechouse/PN532 ライブラリ

# 準備

ライブラリのインストールや設定、接続方法などはこちらの通りに行いました。
「PN532 NFC RFID module を Arduino UNO で読む」
https://qiita.com/nanbuwks/items/42f639e7eec928181298

# ライブラリ付属のサンプルプログラムで動作確認

「ファイル」-「スケッチ例」-「カスタムライブラリのスケッチ例」-「PN532」-「FeliCa_card_detection」を選び実行します。

手持ちの nanaco カードを読ませてみました。

```

Hello!
 for an FeliCa card...  Hello!
Found chip PN532
Firmware ver. 1.6
Waiting for an FeliCa card...  Found a card!
  IDm:  01 14 B4 27 6B 11 5A 23
  PMm:  0F 0D 23 04 2F 77 83 FF
  System Code: 8B61
Card access completed!

Waiting for an FeliCa card...  Could not find a card
Waiting for an FeliCa card...  
```

ボードを認識、nanaco カードの IDm や PMm が無事読めていることがわかります。


# 学籍番号を読むプログラムを試してみる


@gpioblink さんの記事「PN532を使ってArduinoでFeliCa学生証を読む方法」
https://qiita.com/gpioblink/items/91597a5275862f7ffb3c
の記事から、テスト用に抜粋したものが以下のプログラムです。

```

#include <Arduino.h>
#include <SPI.h>
#include <PN532_SPI.h>
#include <PN532.h>
#include <Wire.h>
PN532_SPI pn532spi(SPI, 10);
PN532 nfc(pn532spi);
#include <PN532_debug.h>
uint8_t        _prevIDm[8];
unsigned long  _prevTime;

void PrintHex8(const uint8_t d) {
  Serial.print(" ");
  Serial.print( (d >> 4) & 0x0F, HEX);
  Serial.print( d & 0x0F, HEX);
}

void setup(void)
{
  Serial.begin(115200);
  Serial.println("Hello!");
  nfc.begin();
  uint32_t versiondata = nfc.getFirmwareVersion();
  if (!versiondata)
  {
    Serial.print("Didn't find PN53x board");
    while (1) {delay(10);};      // halt
  }
  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);
  nfc.setPassiveActivationRetries(0xFF);
  nfc.SAMConfig();
  memset(_prevIDm, 0, 8);
}

void loop(void)
{
  uint8_t ret;
  //uint16_t systemCode = 0xFFFF;
  uint16_t systemCode = 0xFE00;
  uint8_t requestCode = 0x01;       // System Code request
  uint8_t idm[8];
  uint8_t pmm[8];
  uint16_t systemCodeResponse;
  Serial.print("Waiting for an FeliCa card...  ");
  ret = nfc.felica_Polling(systemCode, requestCode, idm, pmm, &systemCodeResponse, 5000);
  if (ret != 1)
  {
    Serial.println("Could not find a card");
    delay(500);
    return;
  }
  if ( memcmp(idm, _prevIDm, 8) == 0 ) {
    if ( (millis() - _prevTime) < 3000 ) {
      Serial.println("Same card");
      delay(500);
      return;
    }
  }
  Serial.println("Found a card!");
  Serial.print("  IDm: ");
  nfc.PrintHex(idm, 8);
  Serial.print("  PMm: ");
  nfc.PrintHex(pmm, 8);
  Serial.print("  System Code: ");
  Serial.print(systemCodeResponse, HEX);
  Serial.print("\n");
  memcpy(_prevIDm, idm, 8);
  _prevTime = millis();
  uint8_t blockData[3][16];
  uint16_t serviceCodeList[1];
  uint16_t blockList[3];
  memset(blockData[0], 0, 16);
  Serial.print("Read Without Encryption command -> ");
  serviceCodeList[0] = 0x1A8B;
  blockList[0] = 0x8000;
  blockList[1] = 0x8002;
  blockList[2] = 0x8003;
  ret = nfc.felica_ReadWithoutEncryption(1, serviceCodeList, 3, blockList, blockData);
  if (ret != 1)
  {
    Serial.println("error");
  } else {
    Serial.println("OK!");
    for(int i=0; i<3; i++ ) {
      Serial.print("  Block no. "); Serial.print(i, DEC); Serial.print(": ");
      nfc.PrintHex(blockData[i], 16);
    }
  }
  Serial.println("Card access completed!\n");
  delay(1000);
}
```

このプログラムでは、システムコードFE00、 サービスコード1A8B 、ブロック 8000-8003までを暗号化なしで読んでいます。

まずは nanaco カードを読ませてみました。

```

Hello!
Found chip PN532
Firmware ver. 1.6
Waiting for an FeliCa card...  Found a card!
  IDm:  11 14 B4 27 6B 11 5A 23
  PMm:  0F 0D 23 04 2F 77 83 FF
  System Code: FE00
Read Without Encryption command -> error
Card access completed!

Waiting for an FeliCa card...  Same card
Waiting for an FeliCa card...  Same card
Waiting for an FeliCa card...  Same card

```

学生カードを読ませてみました。

```

Waiting for an FeliCa card...  Could not find a card
Waiting for an FeliCa card...  Found a card!
  IDm:  11 16 06 00 0A 1E 78 03
  PMm:  03 32 42 82 82 47 AA FF
  System Code: FE00
Read Without Encryption command -> OK!
  Block no. 0:  30 31 31 30 31 32 33 34 35 36 37 38 00 00 31 31
  Block no. 1:  33 36 30 31 30 30 36 34 32 30 31 33 30 34 30 31
  Block no. 2:  32 30 32 31 30 33 33 31 39 39 39 39 39 39 39 39
Card access completed!

Waiting for an FeliCa card...  Same card
Waiting for an FeliCa card...  Same card
Waiting for an FeliCa card...  Could not find a card
Waiting for an FeliCa card...  

```

読めているみたいですね。