NFC 入門


この記事では、PaSoRi RC-S380PC/SC (Personal Computer/Smart Card) で制御し、NFC タグの ID を取得する方法を説明します。Windows に標準で付属している WinSCard.dll のメソッド経由で制御するため、SDK などを購入する必要はありません。

PaSoRi RC-S380 は TypeA(Mifare), TypeB, FeliCa に対応しています。ISO15693 には対応していません。


← PaSoRi RC-S380 は 2500円ぐらいで購入できます!
   ↓

ヨドバシ.com – ソニー SONY RC-S380 P
価格.com – SONY パソリ RC-S380 価格比較

業務用途には、PaSoRi RC-S380/S が提供されています。
PaSoRi RC-S380/S <業務用途専用モデル> – スイッチサイエンス
↓特約店からまとめて買うとリーズナブルです。
Sony Japan | FeliCa | 法人のお客様 | 製品のご購入・お問い合わせ1

準備

PaSoRi RC-S380 を利用するには、あらかじめ 「NFCポートソフトウェア」 をインストールしておく必要があります。

Sony Japan | FeliCa | 個人のお客様 | ダウンロード | NFCポートソフトウェア

開発・評価用の無償版SDK (ICS-D010/20J SDK for NFC Starter Kit Ver.2.0) にもドライバ (NFCポートソフトウェア) が含まれています。

Sony Japan | FeliCa | 法人のお客様 | 製品情報 | ICS-D010・D004・D002・D003

ドキュメント

PC/SC の仕様書は以下からダウンロードできます。

PC/SC を Linux 向けにオープンソースで実装した PC/SC-Lite のドキュメントも役立ちます。

MSDN からも詳細な情報が得られます。

PaSoRi RC-S380 の独自定義(拡張)コマンドを使用すると、かざされたカードの種類を取得することなどが可能です。 独自定義(拡張)コマンドの詳細は SDK for NFC Starter Kit 同梱のドキュメントに記載されています。
(SDK for NFC Starter Kit の中の /doc/NFC_and_PCSC/M579_PC_SC_2.2j.pdf)

FeliCa Lite-S のカードはまとめ買いすると 1枚200円以下で入手でき、充実したセキュリティー機能や200バイトぐらいの読み書き可能なメモリを備えていて便利です。
FeliCa Lite-S に関する詳細は Sony のサイトからダウンロードできます。

Sony Japan | FeliCa | 法人のお客様 | 技術情報

概要

NFC カードの ID を取得するには、PC/SC (WinSCard.dll) で提供されている関数を以下の順に実行すれば良いです。

  1. SCardEstablishContext
  2. SCardGetStatusChange
  3. SCardConnect
  4. SCardTransmit
  5. SCardDisconnect
  6. SCardReleaseContext

<解説>
PC/SC を利用する時は最初に、1. SCardEstablishContext を実行し、最後に、6. SCardReleaseContext を実行します。

2. SCardGetStatusChange はカードリーダーとカードの状態、および、その変化を検出できます。 ここでは、カードがかざされたことを検出するために使います。

カードと通信するためには、まず 3. SCardConnect でカードと接続する必要があります。 通信が終わったら、5. SCardDisconnect で切断します。

データの送受信は、4. SCardTransmit で行います。
この関数で APDU (Application Protocol Data Unit) として規定されているバイナリデータを送受信することでデータの読み書きなどを行うことが出来ます。 参考1 参考2

例えばカードの UID を問い合わせるには以下の5バイトを送ります。 (仕様書 26ページ)

0xFF, 0xCA, 0x00, 0x00, 0x00

個々の関数の詳細は MSDN, PC/SC-Lite のドキュメントや、以下の参考のところからリンクしてある EternalWindows の解説、および、以下のサンプルコードを参考にしてください。

サンプルコード

Ruby によるサンプルコードです。 処理全体の流れは、基本的に上記の6つのメソッドを順番に実行しているだけです。 ただし、再利用し易くするために独自のクラスを作成し、そのメソッドで上記の関数をラッピングしています。

pcsc_sample.zip

以下のファイルなどが入っています。

  • scard_constants.rb … 定数定義
  • WinSCard.rb … WinSCard.dll のラッパー
  • pcsc.rb … 再利用性を高めるために作ったクラスの定義
  • sample/read_id.rb … 上記のクラスを使用してカードの UID を読み取る処理

解凍し、sample/read_id.rb を実行してください。
カードがかざされるまで少し待ち、カードの ID を読み取って表示します。
TypeA(Mifare), TypeB, FeliCa の ID を読み取ることが出来ます。

Ruby のインストーラはこちら
RubyInstaller for Windows

運転免許証や住民基本台帳カードなど、TypeB のカードは PUPI (Pseudo-Unique PICC Identifier) という擬似的な ID を返すようになっていることがあります。カードをかざすたびに ID が変わります。

一台の PC に複数のカードリーダー

一台の PC に複数の PaSoRi を接続して利用することも可能です。
複数のデバイスを接続した場合には SCardListReaders で取得できる
デバイス名の末尾の数字が、接続した順番にインクリメントされるようです。
USBケーブルを抜き差ししただけで(OSの再起動無しで)この番号は変わります。
そのため、PaSoRi のシリアル番号でデバイスを識別します。

シリアル番号を取得するには SCardGetAttrib 関数に SCARD_ATTR_VENDOR_IFD_SERIAL_NO を指定して実行します。

SCardGetAttrib 関数を実行するにはあらかじめデバイスと接続して SCARDHANDLE を取得しておく必要があります。 カードがかざされていない状態でデバイスと直接接続するには、SCARD_SHARE_DIRECT と SCARD_PROTOCOL_UNDEFINED を指定して、SCardConnect を実行すれば良いです。

上のサンプルコードに入っている pcsc.rb を使うと以下の様にシリアル番号を取得できます。

# カードリーダーのシリアル番号を取得する

require_relative "pcsc.rb"

# カードリーダーの名前
READER = "Sony FeliCa Port/PaSoRi 3.0 0"

PCSC.new(READER).establish_context(SCARD_SCOPE_SYSTEM) do |pcsc|
    pcsc.connect(SCARD_SHARE_DIRECT, SCARD_PROTOCOL_UNDEFINED) do
        puts pcsc.get_attrib(SCARD_ATTR_VENDOR_IFD_SERIAL_NO)
    end
end

参考

スマートカードと PC/SC の使い方について、詳しく解説されています。

C# でカードの ID を取得するサンプルコードがあります。

C# で DLL の関数を呼び出す方法はこちら

Raspberry Pi など、Linux でも利用できるようです。

変更履歴

2015-05-31

  • FeliCa Lite-S に言及
  • サンプルコードに含まれる幾つかのファイルを最新版に更新
  • サンプルコードに FeliCa Lite-S の内部認証、外部認証、MAC_Aつき読み書きなどのスクリプトを追加

2015-05-20

  • PaSoRi RC-S380 の独自定義(拡張)コマンドに言及

2014-10-25

  • x64 でも動くようにサンプルコードを修正
カテゴリー: 記事 タグ: , パーマリンク

コメントを残す