FeliCa Library を使ったプログラムの制作と実行

Springfield > FeliCa Lesson

FeliCa Library を使ったプログラムの制作と実行

SDK_for_FeliCa LiteにはC言語とVisual Basic用のライブラリが用意されています。
SDK自体はVisual C++ 6.0で開発されました。
この実習ではC言語を使ってプログラムを作ります。
開発環境には実習室のパソコンにインストールされているVisual Studio .NETを使います。

● どのようにプログラムを作るのか

プログラムを作るうえで参考になる資料は次のものです。
マニュアルには情報全部記載されているが、まず概要をつかんでから
どのようにプログラムを作ればよいか細部を見るほうが理解しやすい。
次の順序で調べるとよい。

講習会資料:FeliCaLibrary入門.pdf
オンライン資料:felica.html、felica_error.html、rw.html、rw_error.html
サンプルプログラム:CD-ROM/SDK_for_FeliCa_Lite/Japanese/Document/FeliCa_Library/samplesフォルダの中にFeliCa_C、FeliCa_Script、FeliCa_VB、RW_C、RW_VBの各フォルダがあり、中にサンプルプログラムのソースがある。
マニュアル:「User's Manual」、「リーダ/ライタコマンドリファレンスマニュアル」

講習会資料:FeliCaLibrary入門.pdfにはライブラリの種類や
ライブラリインストール時の注意事項が書いてあり、
まず、これを読む必要があります。

サンプルプログラムの一部が16ページに書いてあります。
プログラムを作るうえでまず参考になります。

#include <cstdio>
#include <cstdlib>
#include "rw,h"
int main(void)
{
 if (!initialize_library()) {
  fprintf(stderr, "Can't initialize library.\n");
  return EXIT_FAILURE;
 }
などと書いてあります。

オンライン資料:felica.htmlには関数一覧とそれらのプロトタイプ
(関数名、適応、引数、戻り値、説明)が簡潔に書いてあります。
上記のプログラムに出てきたinitialize_library()の項目をクリックすると
次のように書いてあり、プログラム作成に必要な情報を読み取れます。

ライブラリの初期化
関数名:initialize_library
適応:Lite 版,Professional 版,Enterprise 版
引数:なし
戻り値:bool exit_status; // true: 成功  false: 失敗
説明:ライブラリの初期化を行います.タイムアウト値やリトライカウント値等の,
    ライブラリの内部で保持している設定情報は全て初期化されます.

● Visual Studio .NETを使ったプログラム開発

上記の説明に使われているプログラムの例はコマンドプロンプト(又はMS-DOS)
で実行するものです。
開発環境としては、Windowsのコマンドプロンプト(又はMS-DOS)、
テキストエディタ、Cコンパイラがあればよいことになります。
授業では高度なプログラム開発環境であるVisual Studio .NETを使っています。
別の開発環境を使うのもかえって面倒ですからそのまま.NETを使います。

Visual Studio .NETを起動する。
◎ パスの設定
ツール/オプション
オプションダイアログの左側一番下の「プロジェクト」フォルダをクリック
「VC++ディレクトリ」に指定する。
○ ヘッダファイル・パスの登録
右上の「ディレクトリを表示するプロジェクト」コンボボックスに
「インクルード ファイル」を指定する。
すぐ下の「新しい行」ボタンをクリック
新しいパスを入力するエディットボックスを表示してインクルードファイルのパスを指定する。
D:\SDK_for_FeliCa_Library\include(実際にヘッダファイルを保存したディレクトリを指定)

○ ライブラリファイル・パスの登録
右上の「ディレクトリを表示するプロジェクト」コンボボックスに
「ライブラリ ファイル」を指定する
すぐ下の「新しい行」ボタンをクリック
新しいパスを入力するエディットボックスを表示してインクルードファイルのパスを指定する。
D:\SDK_for_FeliCa_Library\lib(実際にライブラリを保存したディレクトリを指定)
[ OK ]

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample01
場所: D:\takase(など自分用のフォルダ)
[ 完了 ]

まず、ライブラリのバージョン情報と著作権情報の取得(マニュアルp.131)を、
エラー処理など全くしないで動作させることを主目的にプログラムを作ってみます。

● ライブラリのバージョン情報と著作権情報の取得

使用するライブラリ関数は次の通りです。
initialize_library()
get_version_information(version_info)
get_copyright_information(copyright_info)
dispose_library()

次にソースコードを入力する。

#include <cstdio>
#include <cstdlib>
#include "felica.h"

int main(void)
{
 printf("バージョン情報と著作権情報を取得\n\n");

 /* ライブラリの初期化 */
 initialize_library();
 /* バージョン情報を取得して表示する */
 get_version_information(versioninfo);
 printf("バージョン情報: %s\n", versioninfo);

等のようにタイプします。プログラム全体は次のリンクを見てください。
[ プログラムのソースコード詳細 ]

入力したら、
ビルド/ソリューションのビルド
を行ってみる。
FeliCaのライブラリファイルを参照できずリンクエラーを生じるので以下の設定をする。

プロジェクト/FeliCaLibSample01のプロパティ...をクリックする。
左側で
構成プロパティ
 リンカ
  入力
右側で
追加の依存ファイルの右の空欄をクリックすると参照ボタンが表示されるのでクリックする。
「追加の依存ファイル」ダイアログのテキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ]

再度
ビルド/ソリューションのビルド
を行ってみる。
エラーが無ければ
デバッグ/デバッグなしで開始
とすると実行される。
次のようにバージョン情報が表示されれば成功です。

FeliCaライブラリのバージョン情報と著作権情報を取得するプログラム

バージョン情報: FeliCa Access Library Version 1.63
著 作 権 情 報: Copyright 2004 Sony Corporation

プログラムを正常に終了しました。

Press any key to continue

◎ 上記のプログラムはライブラリ関数の使い方を確認する最小限のプログラムなので
エラーが生じても対処できません。
次にエラー処理などを追加した実用的なプログラムに修正します。

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample01a
場所: D:\(ユーザ名)
[ 完了 ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

このままビルドしてもリンクエラーを生じるので以下の設定をする。

プロジェクト/FeliCaLibSample01aのプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

ビルドし、実行する。次のようにバージョン情報が表示されれば成功です。

FeliCaライブラリのバージョン情報と著作権情報を取得するプログラム

バージョン情報: FeliCa Access Library Version 1.63
著 作 権 情 報: Copyright 2004 Sony Corporation

プログラムを正常に終了しました。

Press any key to continue


● リーダ・ライタの制御ライブラリを実行可能になるようセット

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample02
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample02のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

リーダ・ライタの制御ライブラリファイルの名前を設定するプログラム

FeliCa リーダ/ライタコントロールライブラリの名前
(パス名を含んでも良い) を設定します
initialize_library をコールする前に呼び出して下さい。
この関数がコールされない場合は、デフォルトのライブラリ名である
rw.dll(windows版)/rw.so(linux版) でライブラリの検索を行います。

リーダ/ライタ制御ライブラリを以下のようにセットしました。

d:/SDK_for_FeliCa/FeliCa_Library/bin/rw.dll

プログラムの実行を終了します。

Press any key to continue


● リーダ・ライタの自動認識とオープン

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample03
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample03のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

リーダ・ライタを自動認識しオープンするプログラム

open_reader_writer_auto()関数を使って
リーダ・ライタの自動認識とオープンに成功しました。
走査するデバイスの名前や暗号化モード等をカスタマイズしたい場合には
set_reader_writer_mode_list() 関数で設定を行って下さい。

プログラムの実行を終了します。

Press any key to continue


● 暗号化モードがDisable, CBC OFFのリーダ・ライタのオープン

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample04
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample04のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

暗号化モードがDisable, CBC OFFのリーダ・ライタをオープンにするプログラム

USBインタフェース型リーダ・ライタを接続してください。
ポート名:USB0、ボーレイト:0と指定して
open_reader_writer_without_encryption()関数を呼びます。
Enterキーを押してください。

リーダ・ライタのオープンに成功しました。

プログラムの実行を終了します。

Press any key to continue

 

● リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample05
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample05のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルドし実行する。

○リーダ・ライタを接続していなければ次のように表示される。

リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得

リーダ・ライタのオープンに失敗しました。

Press any key to continue


○リーダ・ライタを接続すると次のように表示される。

リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得

リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得

port name: USB0
baud rate: 0
encryption mode: Disable, CBC OFF

コントローラとリーダ/ライタ間の相互認証に使用される暗号化処理のための鍵
kar: ff ff ff ff ff ff ff ff
kbr: ff ff ff ff ff ff ff ff

プログラムの実行を終了します。

Press any key to continue

 

● ポーリングとカード情報の取得(Pollingコマンド)

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample06
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample06のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

ポーリングとカード情報の取得(Pollingコマンド)

カードの枚数: 1
製造ID    (IDm): 01 01 05 01 58 07 d5 04
製造パラメータ(PMm): 03 01 4b 02 4f 49 93 ff

プログラムの実行を終了します。

Press any key to continue


● ポーリングとエリア・サービスキーバージョンの取得

ファイル/新規作成/プロジェクト

Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample07
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample07のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

ポーリングとエリア・サービスキーバージョンの取得

1008h(Random,Read/Write,鍵必要)と100ah(Random,Read Only,鍵必要)のサービス指定

エリア・サービス数 : 2
エリア・サービスキーバージョン: 08 10 0a 10

プログラムの実行を終了します。

Press any key to continue


● 鍵のないサービスデータへの書き込みと、鍵のないサービスデータの読み込み

(ポーリングと相互認証は行いません)
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample08
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample08のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

鍵のないサービスデータへの書き込みと、鍵のないサービスデータの読み込み

書き込みを行います、Enterを押してください。
書き込んだブロック数  : 1
書き込んだブロックデータ: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f

読み込みを行います、Enterを押してください。
読み込んだブロック数  : 1
読み込んだブロックデータ: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f

プログラムの実行を終了します。

Press any key to continue

上記のブロックデータはプログラムの中に書き込んでありました。実際には意味のあるデータが必要です。そのためには、次のようにデータを指定することができます。

unsigned char write_block_data[16] = { 's', 't', 'u', 'd', 'e', 'n', 't', 'I', D', ':', ' ', 'a', '0', '0', '0', '9' };

さらに、キーボードから入力したデータを書き込み、読み出してみましょう。書き込むデータを入力する場合、scanf()関数ではなく、gets()やfgets()のような単機能の関数を使うのが安全です。フォーマット機能はありませんが意図しない動作をすることはありません。ただし、事後処理はプログラムする必要があります。次のような入力処理部分を追加すればいいでしょう。

unsigned char write_block_data[16];
char str[80]; // gets()の引数用、ヌルコードの分+1のサイズを指定
size_t len;
fprintf(stdout, "書き込むデータを入力してください(16バイト以下):");
gets(str); // chrp=gets(strp)、文字列の最後はヌルコード
while (len = strlen(str) > 16) {
 fprintf(stdout, "文字数オーバー、再度入力してください:");
 gets(str);
}

for (int i = 0; str[i] != '\0'; i++)
 write_block_data[i] = str[i];

while (i < 16)
 write_block_data[i++] = ' '; // 文字数が少ない場合ごみを表示しない

input_write_block_without_encryption.block_data = write_block_data;

[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

鍵のないサービスデータへの書き込みと、鍵のないサービスデータの読み込み

書き込むデータを入力してください(16バイト以下):学生番号: a5000
書き込みを行います、Enterを押してください。
書き込んだブロック数  : 1
書き込んだブロックデータ: 8a 77 90 b6 94 d4 8d 86 3a 20 61 35 30 30 30 20

読み込みを行います、Enterを押してください。
読み込んだブロック数  : 1
読み込んだブロックデータ: 8a 77 90 b6 94 d4 8d 86 3a 20 61 35 30 30 30 20
読み込んだブロックデータ: 学生番号: a5000

プログラムの実行を終了します。

Press any key to continue


● 論理カードのシステムコードのリストを取得

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample10
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample10のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

論理カードのシステムコードのリストを取得

number of system codes: 1
system code list: 00 00

プログラムの実行を終了します。

Press any key to continue

 

● サービスコードのリストを取得

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample11
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample11のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

サービスコードのリストを取得

number of service codes: 25
service code list: 08 10 09 10 0a 10 0b 10 0c 10 0d 10 0e 10 0f 10 10 10 11 10 1
2 10 13 10 14 10 15 10 16 10 17 10 08 11 0a 11 0c 11 0e 11 10 11 12 11 14 11 16
11 09 12
number of area codes: 1
area code list: 00 00
number of end service codes: 1
end service code list: fe ff

プログラムの実行を終了します。

Press any key to continue


● ユーティリティAPI アクセスキーの生成(p.177)

USBのリーダ・ライタでは実行できない。

● コミュニケートスルーコマンド(p.175)

ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample13
場所: D:\(ユーザ名)
[ 完了 ]

プロジェクト/FeliCaLibSample13のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]

次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]

ビルド、実行する。以下のように表示されれば成功です。

コミュニケートスルーコマンド

packet data: 01 01 01 06 01 58 07 57 05 03 01 4b 02 4f 49 93 ff
packet length: 18

プログラムの実行を終了します。

Press any key to continue

 

 

Springfield > FeliCa Lesson

Copy right y.takase since 2005