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 を 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...  

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