martes, 8 de octubre de 2013

Trabajando con Compact Framework 2.0 en el MC9090.

En este post les voy a mostrar una guía de cómo acceder a los servicios publicados en un sitio web mediante dispositivos móviles. Específicamente el dispositivo móvil MC9090 de Motorola, antes Symbol, que corre la versión 2.0 del Compact Framework de .Net y Windows CE (Compact Edition). Aunque este dispositivo lleva ya unos años en el mercado es ideal para entornos industriales como almacenes o pistas de combustibles. Gracias a las características que posee como: lector de códigos de barra, acceso a redes Wi-fi y diseño ergonómico. Además, por supuesto cuenta con la posibilidad de desarrollar aplicaciones personalizadas utilizando .Net.

Entonces nos ponemos en ello, vamos desarrollar una aplicación para este dispositivo que permita consumir los servicios publicados en una web y además utilizar su SDK para comunicarnos con el lector de códigos de barras.

Para nuestro ejemplo consumiremos un servicio de un sitio web publicado bajo la arquitectura RESTful. Les comento que REST (Representational State Transfer) es un estilo de arquitectura para la Web. Los servicios web basados en REST funcionan de manera similar al protocolo HTTP y utilizan los verbos (GET, POST, PUT, DELETE) para acceder a los recursos a través de una URL determinada. Por ejemplo, nuestro servicio utilizara como parámetro el código de barras leído en el dispositivo y de respuesta este devolverá un mensaje de notificación. Acá les muestro una URL de ejemplo para acceder al servicio pasándole el identificador ID5050 de un código de barras leído por el dispositivo:

http://localhost/rest_services/sample/bar_code/ID5050

En este caso se utiliza el verbo GET para acceder al servicio, es por ello que para cada código de barras capturado tendremos una URL diferente.

Antes de comenzar primero algunos detalles de nuestro entorno de desarrollo:

- Microsoft Visual Studio 2008: necesitamos específicamente esta versión porque aunque actualmente existen versiones más modernas de este magnífico IDE solo hasta esta versión nuestros amigos de Microsoft dieron soporte para el desarrollo en Smart Devices.

- EMDK de Motorola para .NET versión 2.8: esta es la SDK específica del proveedor para comunicarnos con las características especiales del dispositivo (ej. lector de código de barras). Incluye bibliotecas, herramientas, ejemplos y una excelente ayuda para facilitarnos nuestro trabajo. http://support.symbol.com/support/product/DEV_SW_TOOLS.html

Una vez que tenemos las herramientas instaladas en nuestra Pc estamos listo para comenzar. Primero creamos un nuevo proyecto de Smart Device en el Visual Studio:

clip_image002clip_image004

Aquí tenemos que cercioramos que seleccionamos la versión correcta de .Net Framework, en este caso 2.0. Luego en la siguiente ventana seleccionamos la plataforma de nuestro dispositivo móvil (Windows CE en nuestro caso), la versión del Compact Framework correspondiente y el tipo de aplicación, como queremos desarrollar una aplicación visual seleccionamos Device Application, y listo.

Primero vamos a acceder al lector de códigos de barras de nuestro equipo. Existen varias formas, aquí les explico la más sencilla e intuitiva con la cual podrán realizar la mayoría de las operaciones con el lector, pero si necesitan obtener más control del lector de código de barras pueden buscar en la ayuda de la EMDK. En este caso vamos a utilizar los DTC (Design Time Components) que nos proporciona la EMDK una vez instalada. Los DTC nos permitirá manejar la mayoría de las funcionalidades del lector de códigos de barras con un simple arrastrar y soltar desde nuestra Barra de Herramientas hacia nuestro formulario, análogo ha como lo hacemos con un botón o un combo box:

clip_image006clip_image008

Una vez con el componente insertado en nuestro formulario, podemos que configurar varias propiedades como los tipos de código de barras a leer y tipo de lector a utilizar. En la mayoría de los casos esta configuración podemos utilizarla por defecto así que en nuestro caso no la modificamos. Lo que si tenemos que hacer es adicionar el evento para manejar la captura del código de barras. Este DTC tiene 2 eventos asociados:

OnScan: Proporciona una notificación a la aplicación cada vez que se presiona el botón disparador del código de barras en el MC9090 y captura un código valido.

OnStatus: Proporciona una notificación a la aplicación cada vez que cambia el estado del lector de código de barras.

En nuestro caso añadimos un evento para cuando se capture el código de barras poder salvarlo y luego enviarlo a nuestro servicio web como parte de la URL:

clip_image010

Es importante tener en cuenta que para poder utilizar el lector de códigos de barras tenemos que habilitarlo en la aplicación como muestra la siguiente línea:

clip_image012

Igualmente justo antes de finalizar la aplicación tenemos que desabilitarlo para que este no cause problemas:

clip_image014

Ahora solo nos falta hacer uso del código de barras obtenido para consumir el servicio web. Si pudiéramos utilizar en este paso WCF (Windows Communication Foundation) prácticamente no tendríamos que hacer nada. Desafortunadamente WCF no está presente en la versión del Compact Framework 2.0 por lo que debemos realizar todo el trabajo por nosotros mismos. Esto se logra de la siguiente manera:

clip_image016

Aquí creamos un objeto de tipo HttpWebRequest, que es la clase de .NET que nos permite acceder a recursos webs a través del protocolo HTTP. Para esto necesitamos especificar la URL del servicio que deseamos consumir. El siguiente paso es especificar el método web que utilizaremos. Es importante aquí destacar como este es establecido mediante un string, siendo lo más lógico siguiendo el paradigma orientado a objeto, que existiera un Enum con todos los métodos web disponibles. Finalmente en la última línea el servicio es consumido y su respuesta almacenada en un objeto de tipo HttpWebResponse.

¿Pero, como accedemos a la información si esta se encuentra almacenada en un flujo de datos? Pues esto se logra de una manera bastante sencilla:

clip_image018

Como ven bastante sencillo. Aquí creamos un XmlReader pasándole el flujo de respuesta, luego obtenemos un XmlDocument a partir del XmlReader creado. En este punto el flujo de datos será transformado en un documento XML. Y voila, ya tenemos almacenado en el XmlDocument la respuesta del servicio, solo es cuestión ahora de pasearla en dependencia de lo que necesitemos leer. Para esto XmlDocument provee las utilidades necesarias. En WCF podríamos establecer mediante contratos el formato de los datos que recibiremos, pero como ya dijimos anteriormente aquí no contamos con esa posibilidad por lo que debemos conocer de antemano la naturaleza de estos. Hemos asumido que la respuesta viene en formato XML, para leer por ejemplo texto plano, como JSON, pueden hacer uso de la clase StreamReader.

Espero que le haya resultado útil el post, cualquier duda puede dejarnos un comentario.


¿Te ha gustado este Post? Compártelo con tus amigos.

1 comentario:

IconIconIcon