ActiveXコントロールを使い、WebシステムからFeliCaへアクセスする方法

2014年1月20日
Pocket

FeliCaはActiveXコントロールを利用すれば、Webシステムで扱うことが出来ます。

felica

felica

【FeliCaについて】
FeliCaとはJRのSuicaやおサイフケータイ、nanacoなどで採用されている「非接触ICカード技術方式」でソニーの登録商標です。リーダーにかざすだけで読み書きができることから、広い範囲で応用されています。

カードにはIDmと呼ばれる16桁の数字によるIDがあり、同じ番号が流通しないように管理されています。このIDmはPaSoRi(パソリ)と呼ばれる3,000円程度のリーダーを通じてPCで読み出すことができます。

FeliCaはいろいろな分野で応用できます。例をいくつか挙げます。
1)Webシステムの認証(カードをかざすとログイン)
2)入退館の管理(カードで入館や退館を登録)
3)ポイントシステム(カードにポイントが貯まる)
4)会員システム(カードで会員であることを確認)

【セキュリティについて】
IDmは他のソフトでも簡単に読み出せますので、セキュリティは目に見えるバーコードを読み込むときと同程度です。一定以上のセキュリティが必要な場合は、他の方式と組み合わせるなどの方法をとることになります。簡単な例は以下のとおりです。
1)初回はユーザーIDとパスワードでログインする。
2)ログイン後にFeliCaから読み出したIDmをサーバーに登録し、シークレットキーをサーバーで発行する。IDmとシークレットキーはサーバーで管理する。
3)シークレットキーはブラウザのクッキーに保存する。
4)次回以降のログインでは、FeliCaをかざすことをトリガーに、読み出したIDmとクッキーのシークレットキーをサーバーに送信して認証を行う。

【FeliCaをWebシステムで扱う方法】
システムの管理の事を考えると、FeliCaもWebシステムで扱えると便利です。ActiveXコントロールを開発することで、これを実現できます。

実行時に必要な物
1)リーダー
SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) USB対応 RC-S380(3,000円程度)

2)ソフトウェア開発キットに含まれるドライバ(無償)
SONY SDK for NFC Starter Kit Ver.2.0「ICS-D010/20J」
こちらはソニーのサイトからダウンロードできます。

使い方のイメージは以下のとおりです。
1)リーダーのPaSoRi(パソリ)をPCに接続します。
2)あらかじめドライバをインストールしておきます。
3)Webシステムを利用します。初めて当該のActiveXコントロールが含まれるWebページにアクセスした時に、そのActiveXコントロールがWebサイトからインストールされます。

【HTMLとJavaScript】
ActiveXコントロールはHTML上に配置したJavaScriptから行います。htmlのコードのサンプルは以下のとおりです。シンプルで簡単です。

<OBJECT ID=”FelicaCom” CLASSID=”CLSID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx” CODEBASE=”http://xxx.xxx.com/feactx.dll#version=1,0,0,0″></OBJECT>

<script language=”javascript” type=”text/javascript”>
function StartScan() {
FelicaCom.StartScan(); // FeliCaのスキャンを開始するために、ActiveXのメソッドStartScan()を呼び出します。
}
</script>

<script language=”javascript” type=”text/javascript” for=”FelicaCom” event=”FindIDm(idm)”>
// IDmが読み込めたときのイベント処理(ActiveXから呼び出されます。)

// ここにIDmを使った処理を記述します。

alert(idm); // 例えばこの1行でIDmをアラート表示できます。
</script>

【ActiveXコントロール】
ActiveXコントロールを開発するために利用する開発環境、言語はVisual Studio、C++です。ライブラリはMFCではなく、ATLを利用することでコンパクトなモジュールを作成できます。以下に概要だけ説明します。専門的な内容になりますので、興味がある方のみお読みください。

ActiveXコントロールは非表示のコントロールとし、イベントを送出するために接続ポイントを実装します。接続ポイントはイベントを送出するために必要です。また、スキャンを開始するためのStartScanメソッドを実装します。このメソッドではスキャンのために別スレッドを起動します。イベントの送出は別スレッドから行いますので、この接続ポイントを別スレッドに引き渡す必要があります。スレッド間の接続ポイントの引き渡しはマーシャリングが必要です。渡す側でCoMarshalInterThreadInterfaceInStreamを使い、受け取り側でCoGetInterfaceAndReleaseStreamを使います。

別スレッドではFeliCaポートを監視します。監視はループ処理内でFeliCaポートのポーリングを繰り返すことで実現します。このポーリングには数百ミリ秒程度のスリープ処理を入れておくべきです。IDmの読み取りに成功したらイベントの送出を行います。イベントの送出コードは、ATLが自動生成してくれるFire_xxxxメソッドを参考に記述します。

FeliCaのアクセスは、FeliCaの開発キットのサンプル通りにinitialize_library、open_reader_writer_autoを呼び出し、polling_and_get_card_informationで読み出すことができます。IDmが読み取れない時と、同じIDmが連続して読み出される時は通知をせずに、新たなIDmを読み取れたときのみ、イベントの送出を行うようにします。

別スレッドを破棄するタイミングはATLが生成したFinalReleaseメソッドが適切です。このメソッドが呼ばれたタイミングで別スレッドが終了時の処理を行うようにします。

弊社ではActiveXコントロールの開発を承ります。お気軽にご相談ください。<<お問い合わせはこちら>>

Pocket