<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Button x="10" y="10" label="FeliCa を検出する" id="button1" click="buttonClick();"/> <mx:TextArea x="10" y="40" width="581" height="310" id="textArea1" editable="false"/> <mx:Script> <![CDATA[ // イベント概要,エントリー規約をご確認ください // http://wonderfl.net/event/felica // see http://wonderfl.net/event/felica for contest regulation, only in Japanese for now, sorry // copyright sony corp. all rights reserved. // copied from http://www.felicalauncher.com/sdk4air/#menu_02 with permission :-) import com.sony.jp.felica.FeliCaControl; import com.sony.jp.felica.FeliCaSessionRequest; import com.sony.jp.felica.FeliCaSessionResponse; import com.sony.jp.felica.FeliCaOpenReaderWriterAutoRequest; import com.sony.jp.felica.FeliCaOpenReaderWriterAutoResponse; import com.sony.jp.felica.FeliCaPollingAndGetCardInformationRequest; import com.sony.jp.felica.FeliCaPollingAndGetCardInformationResponse; import com.sony.jp.felica.FeliCaCloseReaderWriterRequest; import com.sony.jp.felica.FeliCaCloseReaderWriterResponse; import com.sony.jp.felica.event.OpenStatusEvent; import com.sony.jp.felica.event.FeliCaStatusEvent; import com.sony.jp.felica.error.FeliCaAccessError; // FeliCaProxy との通信を行うコントロールクラス private var fc:FeliCaControl = new FeliCaControl(); // [FeliCa を検出する] ボタンクリック時 private function buttonClick():void { // リスナー登録 fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete); fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure); fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete); fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure); fc.addEventListener(FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERROR, onFeliCaAccessParameterError); // FeliCaProxy の認証 // wonderflの中ではこのキーをお使いください wonderfl外では使用できません // use this Standard key in wonderfl, it doesn't work outside wonderfl fc.open(10250,"__FELICA_STANDARD_KEY__", ""); } // FeliCaProxy との認証完了時 private function onOpenComplete(evt:OpenStatusEvent):void { displayMessage("FeliCaProxy との認証に成功しました。"); // リーダ/ライタの専有 RwLock(); } // FeliCaProxy との認証処理でエラー発生時 private function onOpenFailure(evt:OpenStatusEvent):void { var error:Error = evt.object as Error; displayMessage( "FeliCaProxy との相互認証に失敗しました。\n" + " ERROR : (" + error.errorID + ") " + error.message); } // FeliCa アクセス成功時 private function onFeliCaAccessComplete(evt:FeliCaStatusEvent):void { if (evt.object is FeliCaSessionResponse) { var session:FeliCaSessionResponse = evt.object as FeliCaSessionResponse; // リーダ/ライタの専有 if (session.type == FeliCaSessionResponse.HOLD) { displayMessage("リーダ/ライタの専有しました。"); // リーダ/ライタのオープンを実行 RwOpen(); } // リーダ/ライタの開放 else { displayMessage("リーダ/ライタの専有を開放しました。"); // FeliCaProxy の切断 FeliCaProxyClose(); } } else if (evt.object is FeliCaOpenReaderWriterAutoResponse) { displayMessage("リーダ/ライタのオープンに成功しました。"); // FeliCa を検出するために、Polling の実行 Polling(); } else if (evt.object is FeliCaPollingAndGetCardInformationResponse) { var response:FeliCaPollingAndGetCardInformationResponse = evt.object as FeliCaPollingAndGetCardInformationResponse; // 検出した FeliCa の情報を表示 displayMessage( "FeliCa を検出しました。\n" + " idm = " + response.idm + "\n" + " pmm = " + response.pmm); // リーダ/ライタのクローズを実行 RwClose(); } else if (evt.object is FeliCaCloseReaderWriterResponse) { displayMessage("リーダ/ライタのクローズに成功しました。"); // リーダ/ライタ専有の開放 RwUnlock(); } } // FeliCa アクセス失敗時 private function onFeliCaAccessFailure(evt:FeliCaStatusEvent):void { var errorMsg:String; if (evt.object is FeliCaAccessError) { var error1:FeliCaAccessError = evt.object as FeliCaAccessError; errorMsg = " ERROR: (" + error1.errorID + ")" + error1.message + "\n" + " FeliCa Error Code (" + error1.felicaError + ")\n" + " RW Error Code (" + error1.rwError + ")\n" + " FeliCaProxy Error Code (" + error1.felicaProxyError + ")"; } else if (evt.object is Error) { var error2:Error = evt.object as Error; errorMsg = " ERROR : (" + error2.errorID + ") " + error2.message; } displayMessage("FeliCa アクセスに失敗しました\n" + errorMsg); // FeliCaProxy の切断 FeliCaProxyClose(); } // FeliCa アクセスパラメータ設定エラー発生時 private function onFeliCaAccessParameterError(evt:FeliCaStatusEvent):void { var error:Error = evt.object as Error; displayMessage( "FeliCa アクセスでパラメータエラーが発生しました。\n" + " ERROR: (" + error.errorID + ")" + error.message); // FeliCaProxy の切断 FeliCaProxyClose(); } // FeliCaProxy の切断 private function FeliCaProxyClose():void { if (fc.close() == true) { displayMessage("FeliCaProxy との接続を切断しました。"); } else { displayMessage("FeliCaProxy との接続を切断に失敗しました。"); } } // リーダ/ライタの専有を実行 private function RwLock():void { // リーダ/ライタを専有する為の情報の設定 var request:FeliCaSessionRequest = new FeliCaSessionRequest(); request.type = FeliCaSessionRequest.HOLD; // リーダ・ライタ専有要求 request.lockTimeout = 10; // 専有(Lock)するまでのタイムアウト時間(秒) request.unlockTimeout = 60; // 専有(Lock)してから開放(Unlock)するまでの見込み時間(秒) // FeliCaProxyは、このunlockTimeout時間経過した場合自動でR/W開放を行う。 // リーダ/ライタ専有を実行 fc.access(request); } // リーダ/ライタ専有の開放を実行 private function RwUnlock():void { // リーダ/ライタ専有を開放する為の情報の設定 var request:FeliCaSessionRequest = new FeliCaSessionRequest(); request.type = FeliCaSessionRequest.RELEASE; // リーダ・ライタ開放要求 // リーダ/ライタ専有開放を実行 fc.access(request); } // リーダ/ライタのオープンを実行 private function RwOpen():void { // [open_reader_writer_auto] コマンドを実行 fc.access(new FeliCaOpenReaderWriterAutoRequest()); } // FeliCa を検出するために、Polling の実行 private function Polling():void { // [polling_and_get_card_information] コマンドを実行する為の情報の設定 var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest(); request.systemCode = "FFFF"; // ポーリングするシステムコード // [polling_and_get_card_information] コマンドを実行 fc.access(request); } // リーダ/ライタのクローズを実行 private function RwClose():void { // [close_reader_writer] コマンドを実行 fc.access(new FeliCaCloseReaderWriterRequest()); } // メッセージの表示 private function displayMessage(msg:String):void { textArea1.text += msg; textArea1.text += "\n"; this.callLater(setScroll); // 一番下にスクロールさせる } // テキストエリアを一番下にスクロールさせる private function setScroll():void { textArea1.verticalScrollPosition = textArea1.maxVerticalScrollPosition; } ]]> </mx:Script> </mx:Application> FeliCa Flash Contest - FeliCa Search sample