Ads by Google
新しい記事を書く事で広告が消せます。
PlaceEngineをFlexから使う2
PlaceEngineをflex(flash)から叩けるようにするコードを書くも、うまくいかない件。
ローカル環境(デバッグビルド)で動かす分には動くが、リリースビルドにするとダメな理由を細かく調べた結果、以下のことがわかった。(すでに知ってたこともあるけど改めて書いておく。)
・swfで外部ドメインにアクセスしてデータを取得する仕組みを作る場合には、
- アクセスされる(情報提供側)サーバ側はcrossdomain.xmlを返せるようにする必要がある。
- アクセスするswfは、crossdomain.xmlを取得するようコードを変更する必要がある。
つまりこんな感じのコードを書く必要がある。
・swfにおいてURLRequest/URLLoaderを使用してサーバにアクセスする場合には、サーバは本来のサービスポート(例えば80)と同じポート(同じサーバプログラム)でcrossdomain.xmlを返さなければならない。843番ポートで返すことはできない。
ここをなんとかできないかと思って、こんなコードを書いてみたけどまるでダメ。
・swfにおいてSocket.connect等を使用してサーバにアクセスする場合には、サーバは本来のサービスポート(例えば7777)と同じポート(同じサーバプログラム)か、もしくは843番ポートでcrossdomain.xmlを返す必要がある。
・つまり、843番ポートが使えるのは生でソケット通信している場合だけ。
PlaceEngine的に具体的に言うと、PlaceEngineのクライアント機能(電測)はlocalhost:5448で待ち受けているけど動作としてはhttpサーバと同じ。なので自作コードではURLRequest/URLLoaderでアクセスしている。ということは、クライアント機能は5448番ポートでcrossdomain.xmlを返す動作が必須ってことだ。これはつまりクライアント機能の機能追加(バージョンアップ)が必要ってことだねえ...。
843番ポートで応答すればいいのだったらローカルマシンだけの処置で対処できるので何とかなりそうだけど。これはつまり、swfをURLRequest/URLLoaderではなくSocket使うように書き換えるってことかあ...。それはちょっと大変そうだ。
#それに、いずれにしても、PlaceEngineサーバ側の対処は必須だもんなあ。
やはりクウジットに連絡とってみるしかないかな...。
ローカル環境(デバッグビルド)で動かす分には動くが、リリースビルドにするとダメな理由を細かく調べた結果、以下のことがわかった。(すでに知ってたこともあるけど改めて書いておく。)
・swfで外部ドメインにアクセスしてデータを取得する仕組みを作る場合には、
- アクセスされる(情報提供側)サーバ側はcrossdomain.xmlを返せるようにする必要がある。
- アクセスするswfは、crossdomain.xmlを取得するようコードを変更する必要がある。
つまりこんな感じのコードを書く必要がある。
//crossdomain.xmlを取得
Security.loadPolicyFile("http://localhost:5448/crossdomain.xml");
//URL文字列を作成
var URL:String = "http://localhost:5448/rtagjs?t=";
URL += timeStamp.milliseconds + "&appk=";
URL += appk;
var request:URLRequest = new URLRequest(URL);
var loader:URLLoader = new URLLoader();
・swfにおいてURLRequest/URLLoaderを使用してサーバにアクセスする場合には、サーバは本来のサービスポート(例えば80)と同じポート(同じサーバプログラム)でcrossdomain.xmlを返さなければならない。843番ポートで返すことはできない。
ここをなんとかできないかと思って、こんなコードを書いてみたけどまるでダメ。
//crossdomain.xmlを取得
Security.loadPolicyFile("xmlSocket://localhost:843");
//URL文字列を作成
var URL:String = "http://localhost:5448/rtagjs?t=";
URL += timeStamp.milliseconds + "&appk=";
URL += appk;
var request:URLRequest = new URLRequest(URL);
var loader:URLLoader = new URLLoader();
・swfにおいてSocket.connect等を使用してサーバにアクセスする場合には、サーバは本来のサービスポート(例えば7777)と同じポート(同じサーバプログラム)か、もしくは843番ポートでcrossdomain.xmlを返す必要がある。
・つまり、843番ポートが使えるのは生でソケット通信している場合だけ。
PlaceEngine的に具体的に言うと、PlaceEngineのクライアント機能(電測)はlocalhost:5448で待ち受けているけど動作としてはhttpサーバと同じ。なので自作コードではURLRequest/URLLoaderでアクセスしている。ということは、クライアント機能は5448番ポートでcrossdomain.xmlを返す動作が必須ってことだ。これはつまりクライアント機能の機能追加(バージョンアップ)が必要ってことだねえ...。
843番ポートで応答すればいいのだったらローカルマシンだけの処置で対処できるので何とかなりそうだけど。これはつまり、swfをURLRequest/URLLoaderではなくSocket使うように書き換えるってことかあ...。それはちょっと大変そうだ。
#それに、いずれにしても、PlaceEngineサーバ側の対処は必須だもんなあ。
やはりクウジットに連絡とってみるしかないかな...。
PlaceEngineをFlexから使う1
PlaceEngineはWi-Fi電波でおおまかな位置を調べる、面白いサービスだ。APIが公開されていて自作ツールで位置が取得できるので、Flexからアクセスするコードを書いてみた。
GoogleMapもFlashでアクセスできるようになったらしいし、組み合わせたら面白そう。
というわけで出来たのがこれ。画面は超適当。
PlaceEngine接続テスト(PETest.swf)
動かすのは結構めんどい。
1.ローカルマシンにPlaceEngineをインストールして動作させておく必要がある。これは普通にインストールするだけ。(ここから)
2.APIをたたくための「アプリケーションキー」をPlaceEngineのサイトで取得する必要がある。(こちら)
取得したら上記を動かして、アプリケーションキーを入れて、「位置を取得」!
すると、動かない!
そうか、crossdomain問題をすっかり忘れていたYo! だからflashからPlaceEngineにアクセスする例を見かけなかったのか...。
動くようになるまでもう少しやってみよう。続く。
追記。
とりあえずローカルでは動くので、動いているイメージくらいは出してみる。具体的な場所情報は隠した(##や***の部分)。

GoogleMapもFlashでアクセスできるようになったらしいし、組み合わせたら面白そう。
というわけで出来たのがこれ。画面は超適当。
PlaceEngine接続テスト(PETest.swf)
動かすのは結構めんどい。
1.ローカルマシンにPlaceEngineをインストールして動作させておく必要がある。これは普通にインストールするだけ。(ここから)
2.APIをたたくための「アプリケーションキー」をPlaceEngineのサイトで取得する必要がある。(こちら)
取得したら上記を動かして、アプリケーションキーを入れて、「位置を取得」!
すると、動かない!
そうか、crossdomain問題をすっかり忘れていたYo! だからflashからPlaceEngineにアクセスする例を見かけなかったのか...。
動くようになるまでもう少しやってみよう。続く。
追記。
とりあえずローカルでは動くので、動いているイメージくらいは出してみる。具体的な場所情報は隠した(##や***の部分)。

swfコンテンツを設置するテスト
まずは、作成したコンテンツをblog上に設置できるか確認しないと。
というわけで、超簡単なサンプルを作った。
Sample.swf
よく他のblogでやっているように、別窓を開くのではなくここに直接埋め込むのはどうしたらいいんだろう...。
あと、swfを置くというのは画像を置くのと同じ扱いで、単発ファイルしか置けないようなので、swfを作るときに指定する「ソースを表示」を機能させるのは面倒そう。別途ここにソースを貼った方が良さそうだ。
というわけで、上記サンプルのソースはこちら。
なお、ソースコードの整形には、ソースコードHTML化コンバーター「唐辛子」を利用した。
#ありがとうございます。
というわけで、超簡単なサンプルを作った。
Sample.swf
よく他のblogでやっているように、別窓を開くのではなくここに直接埋め込むのはどうしたらいいんだろう...。
あと、swfを置くというのは画像を置くのと同じ扱いで、単発ファイルしか置けないようなので、swfを作るときに指定する「ソースを表示」を機能させるのは面倒そう。別途ここにソースを貼った方が良さそうだ。
というわけで、上記サンプルのソースはこちら。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
private function putButton():void{
labelID.text = "ボタンを押した!";
}
]]>
</mx:Script>
<mx:Button x="10" y="10" label="ボタン" click="putButton()"/>
<mx:Label x="10" y="40" id="labelID"/>
</mx:Application>
なお、ソースコードの整形には、ソースコードHTML化コンバーター「唐辛子」を利用した。
#ありがとうございます。
