初級
FeliCa(フェリカ)は、ソニーが開発した非接触ICカード技術方式です。国内の様々な電子マネーのベースとなっている技術で、馴染みのある方も多いかもしれません。今回は、FeliCaの機能を使って携帯電話のブラウザを起動するFlashアプリケーションをFlexで作成します。
FeliCaポートが内蔵されたPCか、パソリが必要です。また、FeliCaチップを搭載した携帯電話(おサイフケータイ)が必要です。
携帯電話がFeliCa対応かどうかは「FeliCaプラットフォーム」のロゴの有無で判別できます。ロゴが刻印されている箇所がちょうどアンテナがある位置なので、FeliCaポート/パソリにかざす際はそこが中心となるようにします。
FeliCaポート/パソリを利用するアプリケーションの開発と実行にはソニーから公開されているFeliCaポートソフトウェアと専用のSDKが必要です。これらは以下のサイトからダウンロードすることができます。
現在のバージョンではFeliCaポートソフトウェアはWindowsにのみ対応しています。Windows以外の環境ではFeliCaポート/パソリを使用するアプリケーションを実行することはできません。
ダウンロードしたFeliCaポートソフトウェアインストーラーを実行し、PCにインストールしてください。SDKは自己解凍形式で、swcファイル、ドキュメント、サンプルが含まれています。適当な場所に解凍してください。解凍されたSDKforAIR_Flash_Basic.swcファイルはアプリケーションとリンクするので、Flexプロジェクトのライブラリパス内にコピーしてください。
USBマイクやカメラと異なり、FeliCaポート/パソリをFlash/AIRアプリケーションから直接コントロールすることはできません。そこで、『SDK for FeliCa & Adobe AIR / Adobe Flash』はFeliCa Proxy Service というFeliCaポート/パソリを操作するための別プロセスと非同期通信を行うことで、これを可能にしています。FeliCa Proxy Service はFeliCaポートソフトウェアに含まれており、インストールするとWindowsサービスとして起動します。
まず、このアプリケーションのデザインを定義しましょう。必要なのは、ユーザーがURLを入力するためのTextAreaと送信を開始するためのButtonです。Applicationは初期化が完了するまで無効にしておき、ユーザーの入力を受け付けないようにしておきます。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="409" height="153"
creationComplete="init()" enabled = "false">
<mx:Button x="164.5" y="121" label="携帯へ送る" click="onClick()" id="button"/>
<mx:TextArea x="10" y="10" width="389" height="103" id="inputURL"/>
アプリケーション生成後に呼び出されるinit()と、ボタンを押したときに呼ばれるonClick()というメソッドを定義する必要があります。まず、init()を実装しましょう。init()はFeliCaポート/パソリを操作するための準備として、アプリケーションとFeliCa Proxy Serviceとの通信を確立します。
import com.sony.jp.felica.*;
import com.sony.jp.felica.event.*;
private var fc:FeliCaControl = new FeliCaControl();
private function init():void
{
fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
fc.open(10250);
}
private function onOpenComplete(evt:OpenStatusEvent):void
{
fc.removeEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
fc.removeEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);
fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onAccessComplete);
fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onAccessFailure);
fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onParameterError);
this.enabled = true;
}
private function onOpenFailure(evt:OpenStatusEvent):void
{
mx.controls.Alert.show("オープンに失敗しました。");
}
FeliCa Proxy Serviceと通信をするのはFeliCaControlオブジェクトです。open()メソッドはアプリケーションとFeliCa Proxy Service との通信を確立するために呼ばれます。引数には通信に使用するTCPポート番号を指定します。ここには必ず10250を指定してください。open()の結果はOPEN_COMPLETEイベントもしくはOPEN_FAILUREイベントによって非同期に通知されるので、open()を呼び出す前にこれらのイベントリスナーをaddEventListener()で登録します。
成功したあとはこれらのイベントリスナーは不要になるので、onOpenComplete()メソッド内で削除しています。また、onOpenComplete()ではFELICA_ACCESS_COMPLETE、FELICA_ACCESS_FAILURE、FELICA_ACCESS_PARAMETER_ERRORという3つのイベントに対してaddEventListener()でイベントリスナーを登録していますが、これらのイベントについては後述します。最後に、初期化が完了しFeliCaポート/パソリと通信可能になったのでアプリケーションを有効にしてユーザー入力を受け付けられるようにします。
次に、ユーザーがボタンを押したときに呼び出されるonClick()メソッドを実装しましょう。ここでは実際に携帯電話のブラウザ起動を要求する処理を行います。
private function onClick(): void
{
button.enabled = false;
var request:MobileFeliCaRequest = new MobileFeliCaRequest();
request.type = MobileFeliCaRequest.WEBTO;
request.url = this.inputURL.text;
fc.access(request);
}
MobileFeliCaRequestクラスは携帯電話内の特定機能を起動させるリクエストを定義します。今回は携帯電話のブラウザを起動させるためにWEBTOをtypeプロパティに指定します。urlプロパティはブラウザで表示するURLです。ここにはユーザーがTextAreaに入力した文字列を指定します。リクエストはFeliCaControlクラスのaccess()メソッドでFeliCa Proxy Service に送信され、FeliCaポート/パソリを経由し最終的に携帯電話に届きます。この結果はopen()と同様にイベントによって非同期に通知されます。以下の3つのイベントが通知されます。
FELICA_ACCESS_PARAMETER_ERRORは引数の不正があった場合にのみ通知されます。それ以外のエラー(例えば、おサイフケータイがパソリ上に置かれていなかった)ではFELICA_ACCESS_FAILUREが通知されます。
これらのイベントに対するイベントリスナーはonOpenComplete()内で登録済みです。今回はイベントリスナーを以下のような単純な実装にします。
private function onAccessComplete(evt:FeliCaStatusEvent):void
{
button.enabled = true;
}
private function onAccessFailure(evt:FeliCaStatusEvent):void
{
mx.controls.Alert.show("FeliCaカード/おサイフケータイへのアクセスに失敗しました。");
button.enabled = true;
}
private function onParameterError(evt:FeliCaStatusEvent):void
{
mx.controls.Alert.show("パラメータエラーが発生しました。");
button.enabled = true;
}
エラーが発生した場合にはメッセージを表示させることにしました。また、いずれの場合もボタンを有効に戻してユーザーの次のボタン入力を受け付けられるようにします。
これでアプリケーションは完成です。TextAreaにURLを入力し、おサイフケータイをFeliCaポート/パソリの乗せた状態でボタンを押してください。携帯電話の画面上に以下のようなメッセージが表示されたら成功です。(メッセージの内容は携帯電話の機種によって異なります。)
完成したFlashアプリケーションを以下のURLで利用可能です。FeliCaポート/パソリとおサイフケータイをお持ちの方は試してみてください。
http://blog.felicalauncher.com/sdk_for_air/?p=365