Windows Phone 7: Primer Vistazo a Cloud Service SDK (Project Hawaii)

Hola a todos!

Ayer Microsoft Research Labs liberó la versión 0.5 del Cloud Service SDK para Windows Phone 7. Este SDK está pensado como una forma de trabajar de manera eficiente desde Windows Phone 7 con Azure y se enmarca dentro del proyecto Hawaii, cuyo objetivo era investigar las mejores formas de extender y complementar las aplicaciones móviles con la nube.

Podéis encontrar más información aquí y descargar el SDK en esta página.

 

Primeros pasos

Una vez que hayamos instalado el Cloud Service SDK tendremos una serie de archivos y soluciones a nuestra disposición en la ruta users<usuario>DocumentsMicrosoft ResearchHawaii SDK.5

En esta ruta podemos encontrar los dos primeros servicios que el proyecto Hawaii ha liberado para Windows Phone 7: Relay Service y Rendezvous Service.

Relay Service usa la nube para crear un endpoint que las aplicaciones pueden usar para comunicarse entre dispositivos, rodeando, de esta forma, la restricción en las conexiones móviles que existe al no disponer de una IP Pública fija, pudiendo crear aplicaciones que se comuniquen entre dispositivos de manera mucho más sencilla.

Rendezvous Service mapea nombres Human-friendly a endpoints en la nube para que sea más sencillo descubrir y conectar a estos endpoints del Relay Service.

Ojeando el nuevo juguete

Si abrimos la solución RendezvousTestClient en el directorio Samples veremos la siguiente estructura de proyecto:

image

En el proyecto RendezvousClientLibrary tenemos todo el código para conectarnos al servicio Rendezvous en Azure, la mayor parte del trabajo se realiza en la clase NameRegistration que nos permite realizar búsquedas de endpoints a partir de un nombre, en especial es interesante echar una ojeada al método Lookup:

public bool Lookup()
{
// -
// Generate name lookup request.
// -
string remainder = "Name/" + this.name;
Uri uri = new Uri(RendezvousService.ServiceUri, remainder);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
            
// -
// Get the rendezvous service's response.
// -
HttpWebResponse response = null;
HttpStatusCode status;
XmlReader reader = null;
try
{
#if SILVERLIGHT
    response = FakeSynchronous.FakeGetResponse(request);
#else
    response = (HttpWebResponse)request.GetResponse();
#endif
    status = response.StatusCode;

    // -
    // Read the returned information.
    // -
    reader = XmlReader.Create(response.GetResponseStream());
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element)
        {
            if (reader.Name.Equals(
                "TransceiverId",
                StringComparison.OrdinalIgnoreCase))
            {
                string temp = reader.ReadElementContentAsString();
                this.registrationId = Convert.ToUInt64(temp, 16);
                this.valid = true;
            }
        }
    }
}
catch
{
    return this.valid;
}
finally
{
    if (reader != null)
    {
        reader.Close();
    }

    if (response != null)
    {
        response.Close();
    }
}

return this.valid;
}

En este método podemos ver la sencillez del concepto detrás del servicio, hacemos un webrequest al servicio Rendezvous, nos devuelve un XML que procesamos y que nos informa del registrationID del endpoint que hemos pedido por nombre (si lo ha encontrado).

Por otro lado, si abrimos el proyecto RelayTestClient encontraremos la siguiente estructura:

image

En el proyecto RelayClientLibrary tenemos la clase Endpoint, encargada de gestionar (crear, eliminar y mantener) los endpoints en la nube, podemos ver el constructor de la clase que se encarga de crear el endpoint con un nombre asociado:

        public Endpoint(
            string deviceId,
            string name,
            TimeSpan ttl)
        {
            this.valid = false;
            bool gotRegistrationId = false;
            bool gotSecret = false;

            // -
            // Generate endpoint creation request.
            // -
            string remainder =
                "Endpoint?DeviceId=" + Uri.EscapeUriString(deviceId) +
                "&Name=" + Uri.EscapeUriString(name) +
                "&TTL=" + Uri.EscapeUriString(ttl.TotalSeconds.ToString());
            Uri uri = new Uri(RelayService.ServiceUri, remainder);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "POST";
#if !SILVERLIGHT
            request.ContentLength = 0;
#endif

            // -
            // Get the relay service's response.
            // Note that GetRequestStream will initiate the HTTP request and
            // may throw an exception if the request fails.
            // -
            HttpWebResponse response = null;
            HttpStatusCode status;
            XmlReader reader = null;
            try
            {
#if SILVERLIGHT
                response = FakeSynchronous.FakeGetResponse(request);
#else
                request.GetRequestStream().Close();
                response = (HttpWebResponse)request.GetResponse();
#endif
                status = response.StatusCode;

                // -
                // Read the returned information.
                // -
                reader = XmlReader.Create(response.GetResponseStream());
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (reader.Name.Equals(
                            "Endpoint",
                            StringComparison.OrdinalIgnoreCase))
                        {
                            while (reader.MoveToNextAttribute())
                            {
                                if (reader.Name.Equals(
                                    "TransceiverId",
                                    StringComparison.OrdinalIgnoreCase))
                                {
                                    this.registrationId = Convert.ToUInt64(
                                        reader.Value, 16);
                                    gotRegistrationId = true;
                                }
                            }
                        }
                        else if (reader.Name.Equals(
                            "Secret",
                            StringComparison.OrdinalIgnoreCase))
                        {
                            string temp = reader.ReadElementContentAsString();
                            this.secret = Convert.ToUInt32(temp, 16);
                            gotSecret = true;
                        }
                    }
                }
            }
            catch
            {
                return;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }

                if (response != null)
                {
                    response.Close();
                }
            }

            this.valid = (status == HttpStatusCode.Created) &&
                gotRegistrationId && gotSecret;
        }

Igual que anteriormente con el servicio Rendezvous y el método lookup, este constructor nos ofrece una implementación muy sencilla y comprensible del servicio RelayService, de nuevo enviamos una petición webrequest (POST) con 3 parámetros que identificarán nuestro endpoint, un id de dispositivo, un nombre para asignarle y el time to live para el servicio.

En respuesta a esto obtenemos un XML con el ID del endpoint creado y el código secreto para autentificar los mensajes enviados/recibidos por el endpoint.

¿Que más va a llegar?

Realmente tiene muy buena pinta el Cloud Service SDK, aunque he tenido pocas horas para jugar con el, ya se me están ocurriendo muchas aplicaciones que se podrían beneficiar de estos servicios. Pero lo mejor de todo es que esto solo es la punta del iceberg, Microsoft Research amenaza con una nueva release en febrero que nos traiga servicios tan útiles como reconocimiento de OCR en la nube (nosotros subimos una imagen y ellos nos devuelven el texto) o servicios Speech to Text (subimos un archivo de audio y nos devuelven texto de la voz).

Conclusión

Vamos a tener que estar muy atentos a Cloud Service SDK, en los próximos meses podemos ver una explosión de aplicaciones en Windows Phone 7 que hagan uso de estos servicios y de más cosas que nos tendrán reservadas los chicos de Project Hawaii.

Un gran saludo y Happy Coding!

4 comentarios sobre “Windows Phone 7: Primer Vistazo a Cloud Service SDK (Project Hawaii)”

  1. Muy bueno Yeray, es una buena noticia la salida de este proyecto y la comunicación entre dispositivos abre un gran abanico de posibilidades. No estoy tan de acuerdo con que los servicios como Speech to Text esten en la nube y no en el propio dispositivo ya que el trafico al enviar un archivo de audio puede sea bastante grande con lo caro que estaq el trafico de datos.

  2. Pues está muy bien, sobre todo porque los dispositivos móviles son ideales para beneficiarse de la potencia de cálculo cloud, y restar importancia a la capacidad del terminal. De este modo se puede procesar en servidor cosas “tochas” como el tratamiento de OCR y podría hacer que futuras ediciones de WP llegaran a terminales más asequibles y por lo tanto se extendiera más.

    Respecto a lo de las tarifas de datos que comenta Oskar, está claro: hay que tener tarifa plana.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *