[Windows Phone 8] NFC y Bluetooth (1 de N)

Hoy vamos a ver una de las novedades incluidas en Windows Phone 8 que tenía pendiente de diseccionar en el blog: NFC.

nfc-logo

Siglas de Near Field Communications. Esta tecnología nos permite interconectar dos dispositivos tan solo con hacer que se toquen entre sí. De esta forma, no tenemos que introducir claves para emparejar dos dispositivos, ni debemos preocuparnos por que cualquiera que esté cerca de nuestro dispositivo pueda acceder a él, la comunicación solo se establece entre dos dispositivos a una distancia máxima de 4cm. Por esto es por lo que se considera una tecnología de contacto. A diferencia del bluetooth, que permite distancias mucho mayores.

NFC permite transferir a datos a una velocidad de hasta 424Kbps, con lo que intentar traspasar grandes cantidades de información puede ser muy costoso. Por esto, se puede usar en conjunción con otras tecnologías como el Bluetooth. En Windows Phone 8 podemos emparejar dos dispositivos mediante NFC y automáticamente enlazar sus respectivos bluetooths para usarlos como canal de transferencia de datos más pesados, como por ejemplo imágenes. De la misma forma, mediante NFC podemos acceder a datos almacenados en tarjetas, etiquetas o stickers NFC sin energía.

Windows Phone 8 nos aporta dos clases principales para trabajar con NFC: PeerFinder y Proximity Device. Cada una de ellas está especializada en un tipo de comunicación.

PeerFinder

PeerFinder nos permite descubrir otras instancias de nuestra aplicación en un dispositivo cercano y crear una conexión entre ambas instancias usando el gesto de tocar los dispositivos entre ellos o mediante browsing. Si el dispositivo con el que nos emparejamos no dispone de nuestra aplicación, el propio sistema le ofrecerá obtenerla de la tienda, con lo que puede ser una gran forma de que un usuario contento le pase nuestra app a otro. Si por el contrario la aplicación está instalada pero no iniciada, el sistema la iniciará automáticamente. Para realizar esto, solo deberemos llamar al método Start de la clase PeerFinder:

   1: public void FindPeerApp()

   2: {

   3:     Windows.Networking.Proximity.PeerFinder.Start();

   4: }

Realmente fácil!! Si unimos dos dispositivos y en uno de ellos ejecutamos este código, en el otro veremos lo siguiente (en el caso de no tener nuestra app):

image

Podemos ir un paso más allá, controlando el estado de la conexión con el evento TriggeredConnectionStateChanged. Este evento nos informará sobre el progreso de la conexión, mediante seis estados diferentes:

   1: public void FindPeerApp()

   2: {

   3:     PeerFinder.TriggeredConnectionStateChanged += PeerFinder_TriggeredConnectionStateChanged;

   4:     PeerFinder.Start();

   5: }

   6:  

   7: async void PeerFinder_TriggeredConnectionStateChanged(object sender, TriggeredConnectionStateChangedEventArgs args)

   8: {

   9:     switch (args.State)

  10:     { 

  11:         case TriggeredConnectState.Listening:

  12:             break;

  13:         case TriggeredConnectState.PeerFound:

  14:             break;

  15:         case TriggeredConnectState.Connecting:

  16:             break;

  17:         case TriggeredConnectState.Completed:

  18:             break;

  19:         case TriggeredConnectState.Canceled:

  20:             break;

  21:         case TriggeredConnectState.Failed:

  22:             PeerFinder.Stop();

  23:             break;

  24:     }

  25: }

Listening nos indica que nuestra aplicación ha iniciado la comunicación y estamos esperando que el otro dispositivo finalice la conexión.

PeerFound nos indica que existe otro dispositivo cerca.

Connecting indica que hemos recibido una solicitud de conexión, sin haberla iniciado nosotros.

Completed nos indica que hemos completado la conexión. A partir de este momento podremos usar la clase StreamSocket para comunicarnos con el otro dispositivo.

Canceled indica que la conexión ha sido cancelada.

Failed indica que un error evitó llevar a cabo la conexión.

Nos queda por mencionar que podemos usar nuestra aplicación Windows Phone 8 para anunciarnos a una aplicación Windows 8, simplemente indicando la propiedad AlternateIdentities de la clase PeerFinder:

   1: public void FindPeerApp()

   2: {

   3:     PeerFinder.AlternateIdentities.Clear();

   4:     PeerFinder.TriggeredConnectionStateChanged += PeerFinder_TriggeredConnectionStateChanged;

   5:     PeerFinder.ConnectionRequested += PeerFinder_ConnectionRequested;

   6:     PeerFinder.Start();

   7: }

Simplemente sustituyendo “Win8AppId” por el id de nuestra aplicación Windows 8, obtendremos el mismo resultado que entre dos Windows Phone. Si la aplicación está instalada en Windows 8, se lanzará. Si no está instalada, el usuario será llevado a la tienda para que pueda descargarla.

Hasta ahora hemos visto como “anunciar” nuestra aplicación al mundo exterior. Pero si queremos realizar una conexión punto a punto entre dos dispositivos, necesitamos primero obtener la lista de dispositivos a los que podemos acceder. Esto podemos hacerlo usando el método FindAllPeersAsync de la clase PeerFinder, que nos devolverá una lista con los dispositivos disponibles:

   1: public async Task<IReadOnlyCollection<PeerInformation>> FindPeers()

   2: {

   3:     return await PeerFinder.FindAllPeersAsync();

   4: }

Una vez que tengamos una lista de dispositivos, podremos conectar con uno en concreto usando el método ConnectAsync, que recibe un parámetro PeerInformation que hemos obtenido previamente con el método FindAllPeersAsync:

   1: public async Task<StreamSocket> ConnectToPeer(PeerInformation peer)

   2: {

   3:     return await PeerFinder.ConnectAsync(peer);

   4: }

En el dispositivo remoto, se lanzará el evento ConnectionRequested para que podamos identificar el dispositivo que se está conectando. Al mismo tiempo se lanzará el evento TriggeredConnectionStateChanged con el estado Completed. En este paso podremos obtener el SocketStream que se ha creado con la conexión.

Si la llamada a ConnectAsync tiene éxito, nos devolverá una instancia válida de la clase StreamSocket, que usaremos para recibir y enviar datos entre los dispositivos. Esta clase tiene tres propiedades importantes:

Information, nos ofrece información, como su nombre indica, sobre la conexión activa: la clave de sesión (SessionKey), estadísticas de ancho de banda, ip local y remota…

InputStream, contendrá la información enviada por el dispositivo remoto al que nos hemos conectado. Podremos obtener estos datos mediante el método ReadAsync del que dispone.

OutputStream, es donde escribiremos la información que queramos enviar al dispositivo remoto, usando el método WriteAsync.

NOTA: A la hora de conectar dos dispositivos con la clase PeerFinder es muy importante que el dispositivo que está escuchando, maneje el evento ConnectionRequested, de lo contrario la conexión se rechazará automáticamente.

Aunque el emparejamiento se lleva a cabo mediante NFC, cabe destacar que al invocar el método FindAllPeersAsync, se pasará a usar el bluetooth entre ambos terminales para llevar a cabo el envío y recepción de datos.

¿Como podemos probar todo esto?

Bien, la respuesta rápida: con dos dispositivos Windows Phone 8. Da igual si tienes un 920 y un 8X, un 620 y un Samsung Ativ S, o un 820 y un 920. Todos salvo el Lumia 520, incluyen NFC. De todas formas, reconozco que lo más normal es que no todo el mundo tenga dos dispositivos en su casa para probar alegremente. Si no tienes un par de Windows Phone 8, puedes probar parte de las conexiones, las que se realizan mediante NFC, haciendo uso de los emuladores y una aplicación llamada Proximity Tapper. Simplemente tendrás que instalar esta aplicación, asegurarte de que el firewall no la bloquea y dejarla iniciada. La pantalla se parece a esta:

image

*Al iniciar la aplicación, puede dar un error de UDP, le damos a aceptar y funciona correctamente. Aunque es ciertamente preocupante, el proyecto lleva sin actividad hace tiempo.

Entonces, despliega tu aplicación en dos emuladores de Windows Phone 8, por ejemplo el  WVGA y el WXGA, cuando los emuladores arranquen, se añadirán a la pantalla de proximity tapper sus IPs y nombre de dispositivo.

image

Y ya lo tenemos listo. Solo tenemos que seleccionar los dispositivos de la lista y presionar el botón Tap Selected Devices. Voila! los emuladores se emparejarán por NFC y si ejecutamos el método PeerFinder.Start en uno de ellos, el otro mostrará el aviso de la aplicación.

Lamentablemente, no he conseguido que funcione con el bluetooth, por lo que la llamada a FindAllPeersAsync o ConnectAsync, falla en los emuladores. Pero por lo menos podremos probar escenarios de emparejamiento con NFC, en el siguiente artículo hablaremos de ProximityDevice y como enviar mensajes sencillos usando solo NFC, sin Bluetooth o Wifi Direct y para eso nos vendrá de perlas este “emulador de NFC”.

Y Fin… Por ahora!!

Con esto, llegamos al fin del primer artículo sobre NFC. En próximos artículos hablaremos de como conectarnos a otros dispositivos, como usar la clase ProximityDevice y sobre el standard NDEF. Hasta entonces, os dejo el código fuente de la aplicación de ejemplo, integrando PeerFinder con MVVM.

Como siempre, un saludo y Happy Coding!!

[MATERIALES] Evento Mobility Day Madrid 2013

El pasado miercoles 22 de mayo estuve junto a mis compañeros de Plain Concepts Alfredo Fernandez, Javier Cantón y Rodrigo Díaz, en la Universidad Rey Juan Carlos de Móstoles. La idea del evento era contar un poco las novedades en desarrollo nativo para Windows Phone 8, de lo que me ocupé yo, desarrollo multiplataforma en PhoneGap, gracias a Alfredo, y desarrollo multiplataforma con Xamarin, de la mano de Javier y Rodrigo. Para terminar la mañana contamos con Oscar Gutierrez de Nokia Spain y Tiina Mutilainen de AppCampus Finland, que nos hablaron de los nuevos terminales y como conseguir financiación mediante AppCampus.

Después de comer nos pusimos manos a la obra con tres Workshops de 3 horas, en paralelo, sobre los temas de los que habíamos hablado por la mañana. Yo hice un workshop de Windows Phone 8, donde pudimos ver el entorno y los emuladores de Windows Phone, como implementar MVVM y como usar el GPS y los mapas. Alfredo hizo lo propio con PhoneGap y Javier y Rodrigo se hicieron un juego en vivo y en directo con Wave Engine, el motor de juegos multiplataforma que han hecho in house.

Fue un gran día, en compañía de buenos amigos, @alejacma, @tracker086, @gk_8, @tenientealdo o @jc_quijano se pasaron a visitarnos, con mucho networking y con muchas cosas que aprender. A continuación os dejo las Slides de mi charla sobre las novedades de Windows Phone 8:

También os dejo aquí el código fuente de los ejemplos que usé para que podáis trastear con ellos y usarlos para lo que necesitéis…

Y esto fue todo en el Mobility Day Madrid… a ver si nos vemos pronto en alguna otra ciudad.

Un saludo y Happy Coding!

Windows Phone Tip: Problemas al publicar para Windows Phone 7 y para Windows Phone 8

Hola a todos!

Hoy quiero hablar un poco de la publicación de aplicaciones para Windows Phone 7 y 8. Básicamente tendremos que tener dos XAP distintos, uno para cada plataforma. La teoría nos dice que el XAP que hayamos compilado para Windows Phone 7, se desplegará a dispositivos 7.X, mientras que el XAP que hayamos compilado para Windows Phone 8 se desplegará a dispositivos 8.X. Pero como todos sabemos, a veces la teoría falla y he visto muchas confusiones en este aspecto.

Existen dos cosas en particular que debemos tener muy en cuenta a la hora de publicar nuestros XAP: La versión del mismo y los idiomas soportados.

Versión del XAP

Para que un usuario con Windows Phone 8 reciba la versión adecuada, tenemos que indicar en el XAP compilado para Windows Phone 8 una versión superior a la del XAP de Windows Phone 7. En este aspecto debemos ser un poco cautos, si la versión de Windows Phone 7 es, por ejemplo, 1.5.0.42, no pongamos la versión de Windows Phone 8 1.5.0.43, porque si tenemos que desplegar una nueva versión del XAP para Windows Phone 7, pisaremos la versión y nos obligaremos a publicar ambas versiones. En este sentido creo que lo mejor es diferenciar muy claramente los números, por ejemplo teniendo la serie 1.X.X.X para Windows Phone 7 y 2.X.X.X para Windows Phone 8. De esta forma ambas aplicaciones podrán crecer y actualizarse sin pisar la una a la otra.

Idiomas Soportados

Este es uno de los temas más escabrosos y que más problemas a generado a la hora de mantener dos versiones para diferentes sistemas operativos. El marketplace de Windows Phone escoge la versión del XAP para nuestro dispositivo dándole mucha importancia a los idiomas soportados. En ambas versiones, 7.X y 8.X, debemos soportar exactamente los mismos idiomas. Si no coincide la lista de idiomas soportados, por ejemplo porque tengamos más idiomas en la aplicación Windows Phone 8, se enviará la versión de Windows Phone 7, aunque el idioma del dispositivo que se está instalando la app esté soportado en el XAP de Windows Phone 8. Debido a esto tenemos que ser muy cuidadosos con este punto. Antes de añadir un nuevo idioma a cualquiera de las dos versiones, estar seguros de que lo vamos a soportar en ambas y actualizar los dos XAP para evitar cualquier tipo de problema.

Esta forma de dar importancia a los idiomas se ha reportado a Microsoft como un punto importante de mejora. Independientemente de los idiomas soportados, debería pesar más la versión del sistema operativo que los idiomas soportados. En todo caso prefiero obtener la versión de Windows Phone 8 en inglés, que la versión de Windows Phone 7 en español ¿Nos harán caso? Tiempo al tiempo…

¿No tienes tu app publicada para ambas versiones?

¿De verdad? No me lo puedo creer. En Windows Phone 8 tienes acceso a nuevas APIs y controles, en algunos casos mejorando mucho la experiencia del usuario. No es tan difícil mantener dos versiones de tu aplicación si haces las cosas bien, aplicando el patrón MVVM correctamente, como enseño en este artículo.

Concluyendo…

Cuando te plantees soportar ambos sistemas, ten en cuenta estas dos reglas:

  • El número de versión del XAP de Windows Phone 8 siempre debe ser mayor que el de Windows Phone 7, usa series distintas: 1.X.X.X / 2.X.X.X.
  • Hasta que lo arreglen, si es que lo hacen, tienes que soportar los mismos idiomas exactos en ambas versiones, de lo contrario se enviará al usuario la versión de Windows Phone 7.

Observando estos dos puntos, no deberías tener ningún problema al publicar tu app y que tus usuarios reciban la versión correcta en su dispositivo.

Un saludo y Happy Coding!!

[EVENTO] Mobility Day Madrid el 22 de mayo

Hola a todos!

En Plain Concepts estamos preparando un gran evento sobre desarrollo para Windows Phone 8 que tendrá lugar el 22 de mayo en la Escuela técnica superior de ingeniería informática de la Universidad Rey Juan Carlos, en el campus de Móstoles. El evento durará todo el día, desde las 9 de la mañana a las 6 de la tarde.

Por la mañana, de 9:15 a 13:30 tendremos cuatro charlas (http://mobilityday.eventbrite.com/):

  • Desarrollo móvil nativo en Windows Phone 8, donde podremos ver las principales novedades de la plataforma y como implementarlas usando el patrón MVVM
  • Desarrollo móvil multiplataforma con PhoneGap, en la que repasaremos los fundamentos de la plataforma PhoneGap y como construir aplicaciones SPA con HTML5 y CSS3
  • Desarrollo móvil multiplataforma con C#, mostraremos como hacer uso de herramientas como Xamarin Studio para desarrollar nuestra aplicación para varias plataformas al mismo tiempo.
  • Nokia & AppCampus, recientemente la primera aplicación desarrollada en España ha sido aprobada en AppCampus y financiada con 50.000€ de inversión. Tendremos con nosotros a Tiina Muttilainen, responsable de AppCampus para España, que nos contará como podemos conseguirlo también nosotros con nuestras apps.

Después de ver todas las charlas, gracias a Nokia Spain y al programa Nokia Developer Champion, os invitaremos a comer y coger fuerzas para empezar con los Workshops que tendremos por la tarde.

Realizaremos tres workshops paralelos, desde las 15:00 hasta las 18:00:

NOTA: Tenéis que registraros de forma independiente a las charlas y al workshop al que queráis asistir. Podéis ir solo a las charlas o solo a un workshop, eso queda a vuestra elección.

Espero veros por allí a todos y que no desperdiciéis la oportunidad de ver de primera mano lo que Windows Phone 8 tiene que ofrecer y como aprovecharnos del desarrollo multiplataforma para crear nuestras aplicaciones y juegos.

Un saludo y Happy Coding!!