SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

無料のSDK for NFC Starter Kitを使ってFeliCa ICカードを読み書きするプログラムを開発する


  • X ポスト
  • このエントリーをはてなブックマークに追加

 本記事では、FeliCa Lite-S ICカードのデータを読み書きするプログラムの開発方法について説明します。プログラム言語としてMicrosoftの「Visual C++」を、ソフトウェア開発キットとしてSONYが無料で配布している「SDK for NFC Starter Kit」を使用し、カードに"codezine.jp"という文字列を書き込むサンプルプログラムを作成します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

 このサンプルプログラムを応用すれば、ICカード内に書き込んだURLからWebページを表示するプログラムや、書き込んだメールアドレスを自動的に入力するプログラムなどが開発できることでしょう。

 ただし、認証・暗号化については扱いません。開発したプログラムは評価用・デモ用とし、データの流出や改ざんが発生しても困らない用途にのみご利用ください。

PaSoRiとICカード
PaSoRiとICカード

対象読者

  • 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を別途購入する必要があります。

SDK for NFCのページ
SDK for NFCのページ

 「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]を参照してください。

次のページ
プログラムの流れ

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

小國 健(オグニ ツヨシ)

岩国市生まれ。都内在住。(株)NTTデータ勤務。金融系システムの企画・開発を担当。写真は0歳当時の自分。デバッガの解説「WinDbg. From A to Z!」もよろしくお願いします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7402 2013/10/16 11:39

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング