プログラムの流れ
「SDK for NFC」用、正確には「NFCアクセスライブラリ」用のプログラムの流れについて説明します。
最初に必要なのは、「windows.h」と「felica_nfc_library.h」のインクルードです。
#include <windows.h> #include "felica_nfc_library.h"
このとき、プロジェクトのプロパティで、「追加のインクルードディレクトリ」として「felica_nfc_library.h」の場所を指定しておいてください。
「felica_nfc_library.lib」のリンクも、ソースに明示しておくとよいでしょう。
#pragma comment(lib ,"felica_nfc_library.lib")
こちらも、プロジェクトのプロパティで、「追加のライブラリディレクトリ」として「felica_nfc_library.lib」の場所を指定しておく必要があります。
プログラム本体では、最初にライブラリを初期化します。
// ライブラリの初期化 bool bSuccess; bSuccess = felicalib_nfc_initialize(); if (! bSuccess) { // エラー処理 ... }
続いて、ポートをオープンします。
// ポートのオープン char szPort[16] = ""; bSuccess = felicalib_nfc_open(szPort); if (! bSuccess) { // エラー処理 ... } printf("port=%s\n", szPort);
felicalib_nfc_open関数の引数には、"USB0"など、PaSoRiの接続先ポート名を指定します。長さ0の文字列を指定した場合は、自動的にポートが検索され、見つかったポートの名前が配列に格納されます。
ポートをオープンしたら、デバイス(カード)の捕捉とアクセス権の取得を行います。
// デバイスの捕捉とアクセス権の取得 DEVICE_INFO *pInfo; bSuccess = felicalib_nfc_poll_and_start_dev_access( DEVICE_TYPE_NFC_18092_212K // FeliCa 212kbps | DEVICE_TYPE_NFC_18092_424K, // FeliCa 424kbps 3000, // タイムアウト ms &pInfo); if (! bSuccess) { // エラー処理 ... }
この引数の場合、3秒以内にFeliCaカードをかざすと正常終了します。
正常終了時には、第3引数にカード情報へのポインタが格納されます。カード情報にはFeliCaのIDm(製造ID,Manufacture ID)が含まれており、この値は一意でかつ変更不可能なため、カードの識別に利用可能です。
// IDm の表示(システム 0) DEVICE_DATA_NFC_18092_212_424K *pdevf; pdevf = (DEVICE_DATA_NFC_18092_212_424K *)pInfo->dev_info; printf("IDm="); for (int i = 0; i < 8; i++) { printf("%02x ", pdevf->NFCID2[i]); } printf("\n");
カードのアクセス権を取得すると、いよいよカード内のメモリの読み書きとなるわけですが、ここで使うfelicalib_nfc_thru関数は使い方が少々複雑なため、次項で改めて説明します。
bSuccess = felicalib_nfc_thru(......);
読み書きが終わったら、デバイス使用権の解放と捕捉処理の停止を指示します(後者は不要かもしれません)。
// デバイス使用権の解放 bSuccess = felicalib_nfc_stop_dev_access( RE_NOTIFICATION_SAME_DEVICE); if (! bSuccess) { // エラー処理 ... } // デバイス捕捉処理の停止 bSuccess = felicalib_nfc_stop_poll_mode(); if (! bSuccess) { // エラー処理 ... }
この後、再びカードにアクセスしたい場合は、felicalib_nfc_poll_and_start_dev_access関数からやり直してください。
カードの制御を終了する場合は、以下の後始末を行います。
// ポートのクローズ bSuccess = felicalib_nfc_close(); if (! bSuccess) { // エラー処理 ... } // ライブラリの終了処理 bSuccess = felicalib_nfc_uninitialize(); if (! bSuccess) { // エラー処理 ... }
エラー発生直後に、felica_nfc_get_last_error関数を呼び出すと、「カード未検出(0x80C00050)」や「シーケンス不正(0x80080000, 0x00000032)」といったエラー情報が取得できます。
各関数の詳細やエラーコードについては、SDKに付属のドキュメント「SDK for NFC ユーザーズマニュアル NFCアクセスライブラリ編(Lite)」を参照してください。