felicaのIDMとEDY番号をブラウザで表示する

IEのFeliCaブラウザエクステンションを入れると、felicaの拡張タグが使える
IDMとEDY番号を表示してみる

<html><head></head><body>
</script>
<span id="FeliCa">
<!--
<form method="get" action="felica.php" style="margin: 0px; text-align: center;">
<READ TARGET="cTafzB6PR9ZGl7MmdfBDm37wfzoBABhLg6mKuzDiXFAH" NAME="edy"  ENCODING="binary"/>
<polling target="cTafzB6PR9ZGl7MmdfBDm37wfzoBABhLg6mKuzDiXFAH" name="idm" />
<input type="submit" value="send" />
</form>
-->
<a href=http://www.sony.co.jp/Products/felica/pcrw/toolbar.html>Felica web extensionが有効ではありません</a>
</span>
</body></html>


felica.phpは
<?PHP
print "idm:";
for ($k=0;$k<16;$k=$k+4) {
print substr($_GET['idm'],$k,4)."-";
}
print "<br>edy:";
for ($k=4;$k<20;$k=$k+4) {
print substr($_GET["edy"],$k,4)."-";
}

出力は
idm:yyyy-yyyy-yyyy-yyyy-
edy:xxxx-xxxx-xxxx-xxxx-

SDKforFeliCa&Adobe_AIR_Flashをflashdevelopで動かした

flashでfelicaがアクセスできるSDKがsonyからでたの、早速、フリーの開発環境flashdevelopとflash sdkをインストールして見た
今まではfelicaSDKがないとオフィシャルに開発ができないのが、無料でfelicaアプリが開発できるのは朗報だ。

idmを表示するスクリプトを書いてみた。

初めてなので最初は戸惑ったが何とかできた。
SDKforFeliCa&Adobe_AIR_Flash開発手引書.pdfを参考にして行った。
下記にソースを載せます
実行するとIDMを表示するだけですが!

package 
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Bitmap;

import com.sony.jp.felica.event.OpenStatusEvent;
import com.sony.jp.felica.FeliCaControl;

import com.sony.jp.felica.MobileFeliCaRequest;
import com.sony.jp.felica.MobileFeliCaResponse;
import com.sony.jp.felica.event.FeliCaStatusEvent;
import com.sony.jp.felica.error.FeliCaAccessError;
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 flash.text.TextField;
/**
* ...
* @author sn
*/
public class Main extends Sprite 
{
private var fc:FeliCaControl = new FeliCaControl();
private var textField:TextField = new TextField() ;
private var idmtext:TextField =new TextField() ;

public function Main():void 
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

fc.open(10250);
fc.addEventListener(OpenStatusEvent.OPEN_COMPLETE, onOpenComplete);
fc.addEventListener(OpenStatusEvent.OPEN_FAILURE, onOpenFailure);


textField.x = 5;
textField.y = 5;
addChild(textField); 
textField.text = "init....";

idmtext.x = 5;
idmtext.y = 20;
addChild(idmtext); 
idmtext.text = "000000000";

var request:FeliCaPollingAndGetCardInformationRequest = new FeliCaPollingAndGetCardInformationRequest;
request.systemCode = "FFFF";
fc.access(request);

}
private function onFeliCaPollingAndGetCardInformationResponce(evt:FeliCaStatusEvent):void {
var response:FeliCaPollingAndGetCardInformationResponse =evt.object as FeliCaPollingAndGetCardInformationResponse;
textField.text = "acc";
trace("IDm : " + response.idm);
textField.text=response.idm;
trace("PMm : " + response.pmm);
//RwClose(); // この関数については「uR 

}
private function onOpenComplete(evt:OpenStatusEvent):void { 
textField.text = "complete"; 
fc.addEventListener (FeliCaStatusEvent.FELICA_ACCESS_COMPLETE, onFeliCaAccessComplete);
//fc.addEventListener (FeliCaStatusEvent.FELICA_ACCESS_FAILURE, onFeliCaAccessFailure);
//fc.addEventListener (FeliCaStatusEvent.FELICA_ACCESS_PARAMETER_ERRORFELICA_ACCESS_PARAMETER, onFeliCaAccessParameter);
RwOpen();
}
private function onOpenFailure(evt:OpenStatusEvent):void { 
textField.text = "err";
}
private function init(e:Event = null):void 
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
}
// リーダ/ライタの専有
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 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);
textField.text = "lock";
}
private function RwOpen():void
{
// [open_reader_writer_auto] コマンドを実行
fc.access(new FeliCaOpenReaderWriterAutoRequest());
}
// R/W のクローズを実行
private function RwClose():void
{
// [close_reader_writer] コマンドを実行
fc.access(new FeliCaCloseReaderWriterRequest());
}
// FeliCa アクセス成功時 (イベントハンドラ)
private function onFeliCaAccessComplete(evt:FeliCaStatusEvent):void
{
textField.text="felica complete"
if (evt.object is FeliCaSessionResponse)
{
var session:FeliCaSessionResponse = evt.object as FeliCaSessionResponse;
if (session.type == FeliCaSessionResponse.HOLD)
{
// リーダ/ライタの専有成功時の処理を記述する
// ここでは、次の処理にあたるR/W をオープンする処理を行なう
RwOpen(); // この関数については「R/W をオープンする」を参照
}
}

if (evt.object is FeliCaOpenReaderWriterAutoResponse)
{
// R/W オープン成功時の処理を記述する
// ここでは、次の処理にあたるPolling 処理を行なう
Polling(); // この関数については「Polling を実行する」を参照
}

if (evt.object is FeliCaPollingAndGetCardInformationResponse)
{
var response:FeliCaPollingAndGetCardInformationResponse =
evt.object as FeliCaPollingAndGetCardInformationResponse;
// polling_and_get_card_information 成功時の処理を記述する 
// ここでは、次の処理にあたるR/W クローズ処理を行なう
// ※ 検出したFeliCa の情報(IDm,PMm)はそれぞれ、
// [idm][pmm]プロパティに設定されている
trace("IDm : " + response.idm);
trace("PMm : " + response.pmm);
idmtext.text = response.idm;
RwClose(); // この関数については「R/W をクローズする」を参照
}
idmtext.text = response.idm;
}
}
}