SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

セカンドライフの世界に外部Webアプリケーションから乗り込む

HTTPとXML-RPCを使ったセカンドライフ外部アプリケーション連係


XML-RPC

 HTTPリクエストはWebに何らかの情報を送信したり、サーバから結果を取得できますが、要求は常にセカンドライフの世界から能動的に行われなければなりません。セカンドライフのスクリプトがHTTPリクエストを発行しない限り通信することができないため、単方向です。

 セカンドライフの外の世界から、セカンドライフのスクリプトに対して情報を送信したい場合はXML-RPCを使います。XML-RPCであれば、外部からLSLのイベントを呼び出すことができるため、任意のタイミングでオブジェクトに情報を送ることができます。HTTPリクエストと組み合わせることで双方向通信も可能でしょう。

 スクリプトがXML-RPCを受けるには、最初にllOpenRemoteDataChannel関数を呼び出す必要があります。

llOpenRemoteDataChannel()

 この関数が実行されると、スクリプトはXML-RPCを受けるためのチャネルを開きます。XML-RPCを呼び出す外部のプログラムは、チャネル番号から接続するスクリプトを指定することができます。

 正しくXML-RPCのチャネルが開かれるとremote_dataイベントが発生します。このイベントで、開かれたチャネル番号や受け渡しされるデータの制御を行うことができます。

remote_data(integer event_type, 
            key channel, 
            key message_id, 
            string sender, 
            integer idata, 
            string sdata)

 event_typeには、発生したイベントの種類が格納されています。チャネルが開かれた場合はREMOTE_DATA_CHANNELが、外部から呼び出された場合はREMOTE_DATA_REQUESTが格納されています。

 channelは、event_typeがREMOTE_DATA_CHANNELの場合は開かれたチャネル、REMOTE_DATA_REQUESTの場合は外部からメッセージが送られたチャネルを表します。message_idsenderは使われていません。NULL_KEYと空文字が入ります。

 idatasdataは、外部から呼び出されたときに渡されたデータが格納されています。外部のアプリケーションは、XML-RPCの呼び出しで整数と文字列データをXMLで送信することができます。

 スクリプトは、XML-RPCを呼び出したクライアントに対してllRemoteDataReply関数から文字列型と整数型のデータの組み合わせを返すことができます。これらのパラメータをどのように使うかは自由です。

llRemoteDataReply(key channel, 
                  key message_id, 
                  string sdata, 
                  integer idata)

 この関数は、remote_dataイベント内でXML-RPCの結果を返すために用います。channelmessage_idには、remote_dataイベントで受け取ったchannelmessage_idパラメータをそのまま渡します。sdataidataには、クライアントに返す任意の文字列と整数を指定してください。

XML-RPC呼び出し

 セカンドライフ内のスクリプトがチャネルを開きXML-RPCの呼び出しを受け付けている状態であれば、外部のアプリケーションからremote_dataイベントを発生させることができます。接続には、次のURLを用います。

  • http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi

 上記のURLに対してllRemoteDataというメソッド名でリクエストを送信すると、サーバはチャネル番号から適切なスクリプトを識別してremote_dataイベントを呼び出してくれます。また、クライアントはサーバからllRemoteDataReply関数で返した結果をXMLで受け取ることができます。

 スクリプトの呼び出しには、常に次のようなXMLを上記のURLに対して送信します。Content-typeヘッダを"application/x-www-form-urlencoded"に設定し、POSTリクエストメソッドで送信してください。

コード02 XMLリクエスト
<?xml version="1.0"?>
<methodCall>
 <methodName>llRemoteData</methodName>
 <params>
  <param>
   <value>
    <struct>
     <member>
      <name>Channel</name>
      <value><string>チャネル番号</string></value>
     </member>
     <member>
      <name>IntValue</name>
      <value><int>idata パラメータに渡す値</int></value>
     </member>
     <member>
      <name>StringValue</name>
      <value><string>sdata パラメータに渡す値</string></value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodCall>

 呼び出しには、事前にスクリプトがXML-RPCを開いたときに作られたチャネル番号を知る必要があります。クライアントは、Channelメンバに接続先のスクリプトを表すチャネル番号を指定し無ければなりません。IntValueとStringValueメンバに指定した値は、remote_dataイベントのidatasdataパラメータにそれぞれ渡されます。

 サーバが返した結果は、次のようなXMLとして取得することができます。

コード 03 XMLレスポンス
<?xml version="1.0"?>
<methodResponse>
 <params>
  <param>
   <value>
    <struct>
     <member>
      <name>Channel</name>
      <value><string>チャネル番号</string></value>
     </member>
     <member>
      <name>StringValue</name>
      <value><string>sdata に指定された値</string></value>
     </member>
     <member>
      <name>IntValue</name>
      <value><int>idata に指定された値</int></value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodResponse>

 このように、Webを通じてセカンドライフの外の世界のアプリケーションと、セカンドライフのスクリプトがXMLを交換することができます。XMLは単純なテキストデータですが、クライアント側にDOMやXML-RPCのライブラリが実装されていれば、やり取りされるデータを解析して構造的に情報を得ることができます。

 XML-RPCの弱点は、極度にパフォーマンスが低いことです。連続で呼び出すことは難しく、場合によっては完全な結果を得るまでに数秒を要します。

次のページ
オブジェクトの遠隔操作

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

赤坂 玲音(アカサカ レオン)

平成13年度「全国高校生・専門学校生プログラミングコンテスト 高校生プログラミングの部」にて最優秀賞を受賞。2005 年度~ Microsoft Most Variable Professional Visual Developer - Visual C++。プログラミング入門サイト WisdomSoft の管理人。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1763 2008/09/26 16:42

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー