SHOEISHA iD

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

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

特集記事

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


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

プログラムの流れ

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

次のページ
FeliCaコマンドの発行

修正履歴

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング