Resistance is Futile

LSL XML-RPC en OpenSimulator

Una forma para realizar comunicacion entre los prims internos de OpenSimulator y el mundo externo es a traves del uso de XML-RPC el cual permite enviar mensajes a un objeto dentro de una region, siempre y cuando este se haya registrado para recibir dicha comunicacion.

Habilitar Modulo XMLRPC :

Aunque el modulo de XMLRPC se carga al ejecutar el servidor es posible que el numero del puerto remoto no este presente en la configuracion del servidor.

  • Editar el archivo OpenSim.ini y cambiar el motor de los scripts
    vi OpenSim.ini
  • Buscar la seccion de red [Network]
    Buscar la llave remoteDataPort
    Si esta presente identifique el puerto,
    si no, adicione la linea con el puerto donde quiere ejecutar el servidor
    remoteDataPort=20800
  • Ejecutar de nuevo el servidor
    ./OpenSim.exe

Crear Script para Recibir Datos :

  • Abrir nuestro visor favorito y entrar al servidor
  • Crear un objeto
  • Adicionar un Script
  • Abrir el script
  • Colocar el siguiente codigo :
     
    default {
       state_entry()
       {
          llOpenRemoteDataChannel();
       }
     
       remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) {
          if(type == REMOTE_DATA_CHANNEL) {
             llOwnerSay("Canal : " + (string) channel + "");
          }
          else if(type == REMOTE_DATA_REQUEST) {
             llRemoteDataReply(channel,NULL_KEY,"Exito",1221);
             llOwnerSay("Cadena : " + sval + "nNumero: " + (string) ival);
          }
          else {
             llOwnerSay("Error");
          }
       }
    }
  • Guardar
  • En este momento el servidor debe compilar el script y muestra en el chat :
    [11:54]  Compile successful
    [11:54]  Primitive: Canal : 61b5e9ca-9378-4254-af36-d78d6ed839de
  • La cadena : 61b5e9ca-9378-4254-af36-d78d6ed839de es el identificador del canal por el cual escucha el prim, es diferente para cada prim

Enviar Datos :

Se pueden enviar datos al prim utilizando cualquier lenguaje de programacion que soporte XML-RPC. En nuestro caso utilizaremos Java con una libreria para soporte de RPC

  • Descargar la libreria para soporte de XML-RPC

    http://www.perisic.com/xmlrpc/cis69mc.jar

  • Crear el Archivo SLClient.java y adicionar el siguiente codigo :
     
    import java.util.*;
    import org.apache.xmlrpc.*;
     
    public class SLClient {
       public static void main (String [] args) {
          try {
             Hashtable theData = new Hashtable();
             theData.put("Channel",args[2]);
             theData.put("IntValue",2483);
             theData.put("StringValue","La fecha es: "+ (new Date()).toString() );
     
             Vector params = new Vector();
             params.add(theData);
     
             XmlRpcClient server = new XmlRpcClient("http://" + args[0] + ":" + args[1]
                 + "/cgi-bin/xmlrpc.cgi");
             Object result = server.execute("llRemoteData", params);
             System.out.println(result);
          }
          catch (Exception e) {
             e.printStackTrace();
          }
       }
    }
     
  • Compilar
    javac -cp cis69mc.jar;. SLClient.java
  • Ejecutar
    java -cp cis69mc.jar;. SLClient <IpServidor> <Puerto> <canal>
    Ejemplo
    java -cp cis69mc.jar;. SLClient 192.168.1.3 20800 61b5e9ca-9378-4254-af36-d78d6ed839de
    Debe mostrar en pantalla
    [{StringValue=Exito, IntValue=1221}]
  • Mienstras tanto en OpenSimulator debe aparecer en el chat la informacion enviada
    [12:09]  Primitive: Cadena : La fecha es: Wed Dec 03 15:09:33 COT 2008
    Numero: 2483

Nota :

Esta es la forma en que una aplicacion externa puede enviar un mensaje a un objeto dentro del mundo virtual, haciendo que este realice cierta accion dentro del mundo. Una de las limitantes de este mecanismo es que solo se provee un metodo llamado llRemoteData que recibe una cadena y un entero, no se pueden crear metodos propios, lo mismo sucede con la respuesta del prim.

No hay entradas relacionadas.

One Response to “LSL XML-RPC en OpenSimulator”

  1. Sonia says:

    Hola! En primer lugar, darte las gracias por toda la información que das en tu blog. Es muy interesante y ayuda mucho.

    Me gustaría hacerte una consulta. Estoy tratando de comunicar OS con el exterior. Los scripts lsl y java funcionan correctamente. Pero el problema que me encuentro, es que cada vez que salgo de OS y vuelvo a entrar, me cambia el canal de comunicación con el objeto, y tengo que cambiarlo manualmente en mi clase Client.java. Hay alguna forma de hacer esto de forma automática? Es decir, es posible que el script lsl del objeto, le diga a la clase Client.java cuál es su canal de comunicación? O es posible hacer que el canal sea siempre el mismo, que no se modifique?

    Muchisimas gracias por adelantado. Agradezco cualquier tipo de ayuda.

Leave a Reply

Powered by WordPress | Designed by Elegant Themes