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_idとsenderは使われていません。NULL_KEYと空文字が入ります。
idataとsdataは、外部から呼び出されたときに渡されたデータが格納されています。外部のアプリケーションは、XML-RPCの呼び出しで整数と文字列データをXMLで送信することができます。
スクリプトは、XML-RPCを呼び出したクライアントに対してllRemoteDataReply関数から文字列型と整数型のデータの組み合わせを返すことができます。これらのパラメータをどのように使うかは自由です。
llRemoteDataReply(key channel,
key message_id,
string sdata,
integer idata)
この関数は、remote_dataイベント内でXML-RPCの結果を返すために用います。channelとmessage_idには、remote_dataイベントで受け取ったchannelとmessage_idパラメータをそのまま渡します。sdataとidataには、クライアントに返す任意の文字列と整数を指定してください。
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リクエストメソッドで送信してください。
<?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イベントのidataとsdataパラメータにそれぞれ渡されます。
サーバが返した結果は、次のような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の弱点は、極度にパフォーマンスが低いことです。連続で呼び出すことは難しく、場合によっては完全な結果を得るまでに数秒を要します。
