コラム一覧へ

2014年1月アーカイブ

 FeliCaはActiveXコントロールを利用すれば、Webシステムで扱うことが出来ます。このコラムではその概要と実装方式をご紹介します。

felica.jpg

【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メソッドが適切です。このメソッドが呼ばれたタイミングで別スレッドが終了時の処理を行うようにします。


 業務システムはシステムのライフサイクルを考慮した全てのコスト、いわゆるTCO(総所有コスト)が重要とされます。TCOには、初期費用やランニング費用といった、わかりやすいコストのほかに、隠れコストとして「将来の変更コスト」が含まれます。

 業務システムは業務ルールの変更や、使い勝手の見直しの必要性などから、長期間に渡り、変更が発生するものです。そのためこの「変更コスト」は総所有コストを大きく左右するのです。

 この将来の変更コストを抑えるにはどうしたら良いのでしょうか。

【データベース構造が変更容易性を左右する】

 業務システムは一部の例外を除き、リレーショナルデータベース(以下データベースと表記します)にデータを保存します。データベースがシステムの中心に位置する構造です。画面から入力したデータはデータベースに保存しますし、画面に表示したり帳票に印字するデータはデータベースから取り出したデータ。何か情報を検索するときの操作対象もデータベースです。

 そのため、データベース構造の変更はシステムの広い範囲に影響します。データベース構造に無理があると、データベースにアクセスする各種のプログラムにも無理が及ぶのです。

 逆に将来の変更コストを抑えるためには、データベース構造が業務ルールに対して、自然な構造になるように設計すればよいことになります。例えば、「店舗」と「販売員」の関係が1:n(販売員は1つの店舗に所属)ではなく、n:m(販売員は複数の店舗に勤務)であるなら、データベースの「店舗」と「販売員」の関係も同じように設計するのです。

【データベース設計をレビューしよう】

 業務システムの基本設計では、画面や帳票は「業務のプロ」によって細かくレビューされることが多いのですが、データベース設計は技術的な専門性が高いことからレビューの対象外にされがちです。

 しかし、暗黙の業務ルールや将来の業務ルールの変更見込みについては、業務のプロでないと理解が難しいものです。私はデータベース設計も、業務のプロの方がレビューすることを推奨します。

 データベース設計に対して、将来の変更コストを抑えるために確認すべき事項は次の2点です。

 ・データがどのような種類に分類して保存されるか。(例えると販売システムでは、店舗、販売員、商品などが該当します。)

 ・保存されるデータの関連はどうなっているか。(先ほどの「店舗と販売員はn:m」などの関連性を確認してください。)

 如何でしょうか。技術的な事項は解らなくてもかまいません。業務ルールに対して、データベース構造の想定が正しいかどうかを、ベンダーの説明を聞いたり質問しながら確認すればよいのです。この確認作業で将来の変更コストの肥大化を避ける事が出来ます。


« 2013年12月 | メインページ | 2014年2月 »

お問い合わせ

システムやアプリの開発のご相談、サービスに関するご質問など、どのようなことでもお気軽にお問い合わせください。