ソラマメブログ
QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 2人
オーナーへメッセージ

2009年07月19日

HTTP-INを使ってみた。

サーバー1.27からサポートされた、「HTTP-IN」と言う機能を使って、「ペンちゃん地蔵」を改良したのですが、その内容を簡単にご紹介しておきます。

やりたかった事は以下の図のような内容です。

HTTP-INを使ってみた。

要は、お賽銭箱とお地蔵さんを、天神福岡と小笠原に置いて、当たりが出たら、メインランドにあるGonbeの土地に置いてあるコンテンツBOXから配布すると言うものです。

従来は、各お地蔵さんに景品を入れておいてと言う事になりますが、それだと景品を入れ替えるたびに、アチコチと飛び回って入れ替えないと行けません。
今回の方式なら、景品はGonbeの土地のコンテンツBOX内だけ入れ替えればすみます。^^

まあ、これはテスト的に行っているので、一般的には自動アップデート・システム等で使う事が多いでしょう。
7Seasの釣り竿とかは、アタッチした時とか、使用中のバージョンより新しい物が出ていると、自動で新バージョンが送られてくると思いますが、そう言う類で使う事が多いと思います。

尚、HTTP-INに関しては、まだ使えるようになったばかりで、関連記事も少ないのですが、以下の記事が色々と関連ページへのリンクもあって、便利と思うので紹介しておきますね。

http://blog.innx.co.jp/vw/secondlife/lsl/2009-07-11-http-in-comes-main-grid-1-27

一応簡単なサンプルは以下に書いておきます。
お時間があればご覧下さい。
<スクリプトサンプル>
これはオブジェクトA(受信BOX)とオブジェクトB(送信BOX)の2つでHTTP通信をするものです。

HTTP-INを使ってみた。

図のようにBにタッチすると、タッチした人の名前をAへ送信します。
AはありがとうメッセージをBへ返します。
Bは戻ったメッセージを話します。

それだけですね。^^;

では、AとBのスクリプトサンプルを以下に書いておきます。
<Aのスクリプト>

default
{
state_entry() {
llRequestURL();
}

http_request(key id, string method, string body) {
if ((method == URL_REQUEST_GRANTED)){
llSay(0,"Obtained URL: " + body);
}
else if (method == "POST") {
llHTTPResponse(id,200,"Thank you for calling. "+body);
}
}
}

これは最初にllRequestURL();と言う関数を実行しています。
llRequestURL()を実行すると、自動的にURLが発行されます。
その結果は、http_requestイベントで取得できます。
method == URL_REQUEST_GRANTEDの時のbodyに格納されている内容が、AオブジェクトのURLになります。
それを通常のチャットで話すようにしてますので、チャットに出たURLをコピーしておいて、Bのスクリプトで使います。

method == "POST"の部分は、Bから送信があった場合に対応する部分です。今回はBからメソッドPOSTで送信します。
受信すると、
llHTTPResponse(id,200,"Thank you for calling. "+body);
でメッセージを送り返しています。
ステータス200と言うのは、HTTPでやり取りする時の正常値として使われます。実際に返信されるメッセージは"Thank you for calling. "+bodyの部分ですね。
bodyはBから送られてきたメッセージ内容で、タッチした人の名前が入っていますから、そのまま名前を後ろに着けて返信しています。

これでA側は終わりですね。

<Bのスクリプト>

string SL_URL="http://sim2381.agni.lindenlab.com:12046/cap/e534385b-ac37-ce23-084f-e265945ed102";
string AV_name;
key requestid;

default
{
touch_start(integer total_number)
{
AV_name = llKey2Name(llDetectedKey(0));
state http_proc;
}
}
state http_proc
{
state_entry(){
requestid = llHTTPRequest(SL_URL,[HTTP_METHOD,"POST",HTTP_MIMETYPE, "application/x-www-form-urlencoded"], AV_name);
}

http_response(key request_id, integer status, list metadata, string body)
{
if (request_id == requestid){
if ( status==200 ){
llSay(0,"Answer:"+body);
}
}
state default;
}
}

B側ですが、最初にSL_URLと言う値に、先ほどのAをコンパイルした時に発言されたURLを控えておいて、ここに入れます。
これがAのアドレスになりますので。

タッチすると、タッチした人のUUIDから名前を取得して、AV_nameと言う変数に格納しています。
そしてState http_procへと遷移させています。

http_procでは、最初にllHTTPRequestを実行しています。
最初のSL_URLと言う部分が、AのURLであて先になります。
次のHTTP_METHODでPOSTを指定しています。
後は、最後にAV_nameが入っていますが、ここが実際の送信データ部分になります。
途中の部分は固定的にそのまま書いておけば良いでしょう。

その辺の扱いに関しては、HTTP関連の解説書を読んでください。Gonbeも詳しくありません。^^;

次にhttp_responseイベントが書いてあります。
ここがllHTTPRequestで送信した結果、Aからの返信を受け取る部分です。
statusが200だったら正常に返信されたと判断して、返信内容をチャットに発言しています。
そして完了したら、state defaultへと戻しています。

こんな感じですね。
ポイントはAのURLの部分です。
先に紹介したページ等に詳しく書いてありますが、けっこう勝手に変動とかもしてしまうようです。
例えば、Aを置いてあるSIMがローリング・リスタートされたら、その時点でAのURLは無効になってしまいます。
再度設定しなおさないと、通信できません。

この点はけっこう厄介な問題です。
「ペンちゃん地蔵」に関しても、コンテンツBOXのあて先が変わってしまったら、せっかくお賽銭をくれて、当たりが出ても配布できません。
また、その都度お地蔵さん側のスクリプトを修正しに行かないといけなくなってしまいます。
これではかえって手間が増えるだけです。

結局、GonbeはコンテンツBOXの最新URLを外部のWEBサーバへ退避させる方式にしました。
SIMがリスタートされた場合も、Changeイベントで把握できるそうなので、その際に再度URLを取得して、その結果を外部サーバへと退避させておきます。

お地蔵さん側はコンテンツBOXへメッセージを送る前に、外部サーバを参照して、有効なURLを取得して、その内容をあて先として送るようにしました。
これなら、WEBサーバ側のアドレスは変わらないから、安定して利用できると思います。

結局外部サーバが必要なら・・・

と思うかもしれませんが、少なくとも以前は、この仕組みを実現するには、必ず外部サーバが必要でしたし、もっと面倒でした。
Gonbeとしては、この程度で実現できると言うのは、非常に嬉しい事です。
これから、色々と研究して、面白い物を考えて見たいと思います。^^


同じカテゴリー(スクリプトのお勉強メモ)の記事画像
llDetectedTouchST
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
オブジェクトへの指示
ペットを作るには(6)
ペットを作るには(5)
同じカテゴリー(スクリプトのお勉強メモ)の記事
 llDetectedTouchST (2009-07-24 14:05)
 llAddToLandPassList (2009-07-24 10:23)
 【注意】Bulk Permissions機能は使っては駄目! (2009-07-21 12:15)
 オブジェクトへの指示 (2008-10-22 12:42)
 ペットを作るには(6) (2008-09-25 10:38)
 ペットを作るには(5) (2008-09-07 21:52)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。