PC/SCを用いてUnityから非接触型ICカードの情報を読み取る

こんちには。

今回、PaSoRi RC-S380 を使って、
Arduino等を使わずに、直接UnityからFeliCa/NFC(TypeA/TypeB)タグの情報を取得しようとしていました。

そこで PC/SC APIを用いてSuicaカードの利用履歴情報の読み取りという記事を見つけ、 
こちらの記事を引用させていただき、Unityで使えるように書き換えてみました。

FeliCa / NFC(TypeA/TypeB) について

非接触型ICには主に FeliCa / NFC の2つのタイプがあります。 
FeliCaは海外の国のほとんどが利用していません。※徐々にアジア展開を広げています。 (2018/07/05 現在)
海外ではNFCの「TypeA」または「TypeB」を利用しています。

> 参考 : Sony NFCとFeliCaの関係

Felica

Felicaは、Sonyの非接触型ICカードの通信技術NFCの通信システムのひとつです。
Suica, PASMOなどの交通系ICカードや、楽天Edy、nanaco、WAONなどのプリペイド型電子マネーなど
日本国内で電子マネー決済に利用される主流の規格となっています。
また、iPhone7以降はFelicaを搭載しています。

TypeA

オランダのNXPセミコンダクターズが開発した規格です。
日本では、タバコの購入時に必要なTaspoカードに利用されています。

TypeB

アメリカのモトローラが開発した規格です。
日本では個人番号カード(マイナンバーカード)や住民基本台帳カード、
運転免許証、在留カード、パスポートに利用されています。

PC/SC (Personal Computer/Smart Card)

Windowsの標準APIにPC/SCというものがあります。
FeliCa/NFC(TypeA/TypeB)を読み取るものです。
Windows標準のWinSCard.dllを使用します。

開発環境

– Windows PC (Surface Pro 4 / Windows 10)
WinSCard.dllを使用するため、Windowsのみの対応です。
– PaSoRi RC-S380 

pasori
– Unity 2018.1
– PASMO , Suica

実装

Windows PCにPaSoRiを繋いで、
ICカードをPasoriにタッチしたら情報を閲覧できるシステムをUnityで作ります。
そして、PASMOやSuicaのIDm(FeliCaチップの製造番号)と、残高を出力します。

1. PaSoRiのセットアップ

> 参考:かんたんセットアップガイド

2. コードを書く

文頭にも書いた通り、PC/SC APIを用いてSuicaカードの利用履歴情報の読み取りという素晴らしい記事を参考にさせていただきました。

主に、NfcMain.cs をUnityのUpdate()で動作するように書き換えます。
NfcApi.csNfcConstant.csに関しては、ほぼそのまま引用させていただきました。

NfcApi.cs

NfcConstant.cs

NfcMain.cs

説明
NfcApi.cs
– winscard.dllのラッパー

NfcConstant.cs
– 定数の定義

以上2つのスクリプトに関しては、上記に記載している引用ページの説明をご覧ください。

NfcMain.cs
– Update()の中でPC/SC APIを呼び出しています。

PC/SCでの操作の流れは以下のようになります.

SCardEstablishContext スマートカードリソースマネージャへの接続
   ↓
SCardListReaders カードリーダーの列挙
   ↓
SCardGetStatusChange カードリーダーの状態の取得
   ↓
SCardConnect カードへの接続
   ↓
SCardTransmit カードとの通信
   ↓
SCardDisconnect カードへから切断
   ↓
SCardReleaseContext スマートカードリソースマネージャからの切断

また今回は例として、PASMOおよびSuicaの残高を出力しています。
SendCommand関数のSCardTransmit によって、カードの利用履歴情報を受け取ります。

こちらによると、残高を示すのは10-11バイト目なので、以下のように残高を取得しています。
(今回は、電子マネー以外をタッチした際、エラー出力などはせず、残高0円 と出力するようにしています。)

また、以下例のように記述すると、外部からリーダーやカード情報にアクセスすることができます。

3. 実行

3.1 NfcMain.csを適当に作成したGameObjectにアタッチしてリーダーを接続した状態で実行

nfc_unity_1

3.2 Suicaをリーダーにタッチし、一定時間後に離してみた結果です。IDと残高が表示されています。

42011926-c023c774-7ad0-11e8-9fc4-b8683902a729

3.3 続いてPASMOをタッチして、一定時間後に離してみた結果です。続けて処理ができます。

42011924-bea8adc4-7ad0-11e8-8ec4-5b449b73b4d3

まとめ

ICカードをPaSoRiにタッチしたらカードIDと電子マネーの残高を閲覧できるシステムをUnityで作りました。
PC/SC とUnityの連携の記事はあまり見かけないため、今回記事にしました。
Unityで作ることによって、単にNFCの情報を閲覧するだけでなく、サイネージやゲームとの連携などの応用に繋げることができます。

●この記事を書いた人