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: 失敗
説明:ライブラリの初期化を行います.タイムアウト値やリトライカウント値等の,
ライブラリの内部で保持している設定情報は全て初期化されます.
上記の説明に使われているプログラムの例はコマンドプロンプト(又は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 プログラムを正常に終了しました。 Press any key to continue |
◎ 上記のプログラムはライブラリ関数の使い方を確認する最小限のプログラムなので
エラーが生じても対処できません。
次にエラー処理などを追加した実用的なプログラムに修正します。
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample01a
場所: D:\(ユーザ名)
[ 完了 ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
このままビルドしてもリンクエラーを生じるので以下の設定をする。
プロジェクト/FeliCaLibSample01aのプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
ビルドし、実行する。次のようにバージョン情報が表示されれば成功です。
FeliCaライブラリのバージョン情報と著作権情報を取得するプログラム バージョン情報: FeliCa Access Library Version 1.63 プログラムを正常に終了しました。 Press any key to continue |
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample02
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample02のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
リーダ・ライタの制御ライブラリファイルの名前を設定するプログラム FeliCa リーダ/ライタコントロールライブラリの名前 リーダ/ライタ制御ライブラリを以下のようにセットしました。 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()関数を使って プログラムの実行を終了します。 Press any key to continue |
プロジェクト/FeliCaLibSample04のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
暗号化モードがDisable, CBC OFFのリーダ・ライタをオープンにするプログラム USBインタフェース型リーダ・ライタを接続してください。 リーダ・ライタのオープンに成功しました。 プログラムの実行を終了します。 Press any key to continue |
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample05
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample05のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルドし実行する。
○リーダ・ライタを接続していなければ次のように表示される。
リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得 リーダ・ライタのオープンに失敗しました。 Press any key to continue |
○リーダ・ライタを接続すると次のように表示される。
リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得
リーダ・ライタの自動認識とオープン、リーダ・ライタモードの取得 port name: USB0 コントローラとリーダ/ライタ間の相互認証に使用される暗号化処理のための鍵 プログラムの実行を終了します。 Press any key to continue |
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample06
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample06のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
ポーリングとカード情報の取得(Pollingコマンド) カードの枚数: 1 プログラムの実行を終了します。 Press any key to continue |
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample07
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample07のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
ポーリングとエリア・サービスキーバージョンの取得 1008h(Random,Read/Write,鍵必要)と100ah(Random,Read Only,鍵必要)のサービス指定 エリア・サービス数 : 2 プログラムの実行を終了します。 Press any key to continue |
(ポーリングと相互認証は行いません)
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample08
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample08のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
鍵のないサービスデータへの書き込みと、鍵のないサービスデータの読み込み 書き込みを行います、Enterを押してください。 読み込みを行います、Enterを押してください。 プログラムの実行を終了します。 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を押してください。 プログラムの実行を終了します。 Press any key to continue |
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample10
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample10のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
論理カードのシステムコードのリストを取得 number of system codes: 1 プログラムの実行を終了します。 Press any key to continue |
ファイル/新規作成/プロジェクト
Visual C++プロジェクト/Win32コンソールプロジェクト
プロジェクト名: FeliCaLibSample11
場所: D:\(ユーザ名)
[ 完了 ]
プロジェクト/FeliCaLibSample11のプロパティ...をクリックする。
左側で、構成プロパティ/リンカ/入力
右側で、追加の依存ファイルの右の空欄をクリック/参照ボタンをクリック
「追加の依存ファイル」テキストボックスに次のライブラリを追加記述する。
felica.lib
[ OK ] [ OK ]
次のようにソースコードを入力する。
[ プログラムのソースコード詳細 ]
ビルド、実行する。以下のように表示されれば成功です。
サービスコードのリストを取得 number of service codes: 25 プログラムの実行を終了します。 Press any key to continue |
ファイル/新規作成/プロジェクト
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 プログラムの実行を終了します。 Press any key to continue |