このサンプルプログラムを応用すれば、ICカード内に書き込んだURLからWebページを表示するプログラムや、書き込んだメールアドレスを自動的に入力するプログラムなどが開発できることでしょう。
ただし、認証・暗号化については扱いません。開発したプログラムは評価用・デモ用とし、データの流出や改ざんが発生しても困らない用途にのみご利用ください。
対象読者
- Visual C++でプログラムを作ったことがある方
- ICカードの読み書きに興味がある方
必要な開発環境
開発に使用するソフト、ハードを、以下に示します。バージョンは多少前後しても構いません。
- Windows 7
- Visual Studio Express 2012 for Windows Desktop
- SDK for NFC Starter Kit Ver.2.01
- PaSoRi RC-S330
- ICカード
「Visual Studio Express 2012」は、マイクロソフトのサイトから無料でダウンロードできます[1]。Visual Studioにはいくつかの言語が含まれていますが、今回はVisual C++を使用します。
「SDK for NFC Starter Kit」は、ソニーのサイトから無料でダウンロードできます[2]。ダウンロード後、「sdk4nfc_starter201J」ディレクトリ配下一式を、Cドライブのルートなど適当な場所にコピーしてください。また、「NFCPortWithDriver.exe」を実行し、「NFCポートソフトウェア」をインストールしてください。なお、商用のアプリケーションを開発する場合は、有償のSDKを別途購入する必要があります。
「PaSoRi」は、ソニーの非接触ICカードリーダー/ライターです[3]。家電量販店などで、3000円弱で購入できます。
ICカードについては、次項で説明します。
ICカードの調達
FeliCaには、「Suica」や「WAON」などで使われているFeliCa Standardのほかに、仕様がシンプルで価格が安いFeliCa Lite-Sという規格のカードがあります。自由に読み書きできる領域は224バイトであり、画像や音声を格納するには不十分ですが、URLやメールアドレスなどのちょっとしたテキストデータを扱う分には問題ありません。ここでは、FeliCa Lite-Sのカードを使います。
FeliCa Lite-Sのカードは、インターネットで購入できます。記事執筆時現在、たとえば、ステルス・ネットワークス株式会社が1枚360円(税別・送料別)で販売しています[4]。
また、株式会社オレンジタグスが、FeliCa Liteのカードを1枚499円で販売しています。[5]。FeliCa Liteは生産終了が予定されている少し古い規格のカードですが、基本的な読み書きの方法はFeliCa Lite-Sと同じです。
カードを入手したら、本記事のサンプルプログラムに含まれている「felica_lite_s_dump」ツールを利用して、カードの内容を確認してみてください。具体的には、カードをカードリーダに載せ、コマンドプロンプトから「felica_lite_s_dump.exe」を実行し、その出力結果を調べます。
筆者がステルス・ネットワークスから購入した「FeliCa Lite-Sカード[FL922]」のダンプを以下に示します。
C:\>felica_lite_s_dump port=USB0 IDm=01 2e 30 c4 d7 c7 1c 61 Block[00], S_PAD0 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[01], S_PAD1 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[02], S_PAD2 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[03], S_PAD3 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[04], S_PAD4 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[05], S_PAD5 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[06], S_PAD6 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[07], S_PAD7 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[08], S_PAD8 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[09], S_PAD9 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0a], S_PAD10=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0b], S_PAD11=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0c], S_PAD12=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0d], S_PAD13=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0e], REG =ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff Block[82], ID =01 2e 30 c4 d7 c7 1c 61 00 00 00 00 00 00 00 00 (DFC, Data Format Code=00 00) Block[83], D_ID =01 2e 30 c4 d7 c7 1c 61 00 f1 00 00 00 01 43 00 (IC種別=FeliCa Lite-S) Block[84], SER_C =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[85], SYS_C =88 b4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[86], CKV =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[87], CK =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[88], MC =ff ff ff 00 07 00 00 00 00 00 00 00 00 00 00 00 (1次発行=未, 2次発行=未, NFC=非対応) (MAC/認証=不要, 全S_PAD RW=可)
また、オレンジタグスから購入した「FeliCa Lite, TL-C1」のダンプを以下に示します。
C:\>felica_lite_s_dump port=USB0 IDm=01 27 00 68 53 e8 a2 ce Block[00], S_PAD0 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[01], S_PAD1 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[02], S_PAD2 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[03], S_PAD3 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[04], S_PAD4 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[05], S_PAD5 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[06], S_PAD6 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[07], S_PAD7 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[08], S_PAD8 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[09], S_PAD9 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0a], S_PAD10=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0b], S_PAD11=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0c], S_PAD12=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0d], S_PAD13=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[0e], REG =ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff Block[82], ID =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (DFC, Data Format Code=00 00) Block[83], D_ID =01 27 00 68 53 e8 a2 ce 00 f0 00 00 02 06 03 00 (IC種別=FeliCa Lite) Block[84], SER_C =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[85], SYS_C =88 b4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[86], CKV =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[87], CK =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[88], MC =ff ff ff 00 ff 00 00 00 00 00 00 00 00 00 00 00 (1次発行=未, 2次発行=未, NFC=非対応) (MAC/認証=不要, 全S_PAD RW=可)
メモリは16バイト単位のブロックに分かれており、「S_PAD0」「D_ID」「MC」等の名称が付けられています。
ブロック番号0x00から0x0d、名称でいうと「S_PAD0(Scratch Pad 0)」から「S_PAD13(Scratch Pad 13)」は、ユーザーが自由に利用できる領域です。この例では、すべて0x00で埋められています。
ブロック番号0x88の「MC(Media Configuration)」には、カードの設定が格納されています。後続の2行は、その内容の簡単な説明です。
ICチップは工場出荷時に「0次発行」されます。その後、カード販売業者やカード利用者が必要に応じて「1次発行」や「2次発行」という処理を行うのですが、その過程でMCブロックに設定値が書き込まれ、カードの構成が固定されます。たとえば、メモリの書き込みに認証が必須になったり、スクラッチパッドのブロックが読み書き可能から読み出し専用になったりします。この過程は不可逆です。
評価用・デモ用カードとして扱いやすいのは、「1次発行=未」「2次発行=未」「MAC/認証=不要」「全S_PAD RW=可」のカードです。それ以外のカードは、読み書きに制限がある場合があるので注意してください。たとえば、「全S_PAD RW=不可」と出力されたカードは、S_PAD0からS_PAD13のブロックの一部または全部に書き込みができません。
各ブロックの詳細については、SONYのサイトからダウンロードできる「FeliCa Lite-Sユーザーズマニュアル」[6]や「FeliCa Lite-Sスターターマニュアル」[7]を参照してください。