100%(1)100% au considerat acest document util (1 vot)
335 vizualizări51 pagini
Este documento explica cómo configurar una Raspberry Pi para su uso. Primero se debe preparar una tarjeta SD con el sistema operativo Raspbian usando el programa Win32 Disk Imager. Luego se conecta la tarjeta SD a la Raspberry Pi y se accede a ella de forma remota a través de SSH usando la dirección IP. Finalmente, se realizan ajustes básicos como actualización, expansión del sistema de archivos y zona horaria a través del programa raspi-config.
Este documento explica cómo configurar una Raspberry Pi para su uso. Primero se debe preparar una tarjeta SD con el sistema operativo Raspbian usando el programa Win32 Disk Imager. Luego se conecta la tarjeta SD a la Raspberry Pi y se accede a ella de forma remota a través de SSH usando la dirección IP. Finalmente, se realizan ajustes básicos como actualización, expansión del sistema de archivos y zona horaria a través del programa raspi-config.
Este documento explica cómo configurar una Raspberry Pi para su uso. Primero se debe preparar una tarjeta SD con el sistema operativo Raspbian usando el programa Win32 Disk Imager. Luego se conecta la tarjeta SD a la Raspberry Pi y se accede a ella de forma remota a través de SSH usando la dirección IP. Finalmente, se realizan ajustes básicos como actualización, expansión del sistema de archivos y zona horaria a través del programa raspi-config.
Lo primero es aprender a configurar nuestra Raspberry Pi, y para eso
necesitaremos, adems, un cable RJ45 y una SD Card de minimo 4GB y se recomienda de clase 4 para garantizar una buena funcionalidad.
Una vez tengamos todo lo necesario, el siguiente paso es instalarle un sistema operativo para poder empezar a trabajar.
Antes de nada, necesitamos un programa que nos prepare la tarjeta SD con el sistema operativo que vamos a instalar a nuestra Raspberry Pi.
Descargamos el programa Win32 Disk Imager.
Lo siguiente es acceder al rea de descargas de Raspberry Pi y elegir un sistema operativo de los que estn disponibles. Nos recomiendan Raspbian, descargaremos entonces este sistema operativo mediante alguna de las dos formas que nos ofrecen. Insertaremos la tarjeta SD en el PC donde estamos trabajando y recordaremos la letra de unidad que el sistema le asignar.
Descomprimiremos el programa Win32 Disk Imager que no necesita instalacin.
Y lo ejecutaremos (Win32DiskImager.exe) como administrador si estamos usando Windows 7 o similar.
Este es el entorno del programa Win32 Disk Imager.
Descomprimiremos el archivo del sistema operativo y veremos que contiene un nico archivo con extensin .iso
En Win32 Disk Imager seleccionaremos la imagen del sistema operativo mediante el botn con el icono de carpeta azul. Despus, nos aseguraremos que en Device est seleccionada la unidad en la que est insertada la tarjeta SD. Para comenzar el proceso de instalacin en la tarjeta, pulsaremos el botn Write.
Se nos indicar que el contenido del dispositivo en cuestin ser eliminado. Aceptaremos pulsando el botn Yes.
Una vez terminado el progreso de instalacin ya podremos sacar la tarjeta SD de nuestro PC y ponerla en el zcalo de la Raspberry Pi.
Conectaremos el cable de Ethernet para dar acceso a Internet y alimentaremos la placa. Accederemos mediante una conexin SSH a la Raspberry Pi para seguir con la configuracin, cabe mencionar que debemos tener nuestro PC y Raspberry Pi conectados en la misma red, esto quiere decir que deben estar conectados al mismo router.
Conexin SSH
La mayora de cosas que se harn con la Raspberry Pi por lo general se hacen a travs de su Terminal (consola de comandos). SSH es un intrprete de ordenes seguras, es un protocolo que sirve para acceder a maquinas remotas a travs de una red. Nos va a permitir usar completamente un ordenador mediante una consola de comando. Es decir, tendremos acceso a la consola de comando de Raspberry Pi en cualquier ordenador.
Para saber la IP de Raspberry Pi debes acceder al router y ver que IP le asign este a nuestra Raspberry, para ello haremos clic en el botn Inicio, y en el cuadro de bsqueda escribiremos cmd. Luego, abriremos el programa cmd (Consola de comando o Terminal).
Se nos mostrar la consola de comandos. Escribiremos en la consola ipconfig y pulsaremos Enter. Nos aparecer usa serie de informacin de red. Lo que nos interesa es la direccin IP indicada como Puerta de enlace predeterminada. Con esta IP tendremos acceso a la configuracin del router. La escribiremos en la barra de direccin de nuestro navegador como si se tratara de una direccin web.
Al intentar acceder al router, en muchas ocasiones (depende del modelo o configuracin) se no pedirn unos datos de acceso y tendremos que buscar la configuracin DHCP, que nos indica que direccin IP asign el router a los dispositivos conectados a l. Y de esta manera, podremos obtener la direccin IP de Raspberry Pi para nuestro uso.
Por otra parte existe otra forma mucho mas sencilla y para ello necesitamos un telfono celular con sistema operativo android y buscar en la PlayStore la aplicacin Fing Network Tools. Conectamos nuestro celular a la red por medio del Wi-fi y ejecutaremos la aplicacin y all se nos mostrara todas las direcciones IP que nuestro rourter a asignado a cada dispositivo entre ellos nuestra Raspberry Pi.
Ahora que tenemos nuestra IP debemos instalar un programa SSH. Usaremos el programa ms conocido para Windows, PuTTy; basta con buscarlo en la web y descargarlo, tampoco requiere instalacin.
Ejecutaremos el programa como administrador y nos aparecer una pantalla como esta. Estando en la Category Session, pondremos la direccin IP de nuestra Raspberry Pi donde dice Host Name. Y para abrir la conexin le daremos al botn Open. Puede aparecernos una mensaje de alerta, tendremos que hacer clic en Si.
Recuerda que debes tener la Raspberry Pi conectada en la misma red del PC con el que ests trabajando y estos dos deben estar visibles en lo que a nivel de red se refiere.
Si la conexin est bien, nos pedir una autentificacin. Pondremos pi y pulsamos Enter. Nos pedir una contrasea, teclearemos raspberry y pulsamos Enter.
Si lo hemos hecho bien, no nos deber indicar ningn error y deber salir como en la imagen. Ya tendremos acceso a la consola de Raspberry Pi de manera remota.
Lo siguiente ser configurar nuestra Raspberry Pi tecleando el comando : sudo raspi-config Nos aparecer la siguiente pantalla.
Lo primero que tendremos que hacer es actualizarla y para ello vamos a la opcin Advanced Options, y luego en Update. Esperamos a que actualice y si nos pide reiniciar le daremos OK.
El siguiente paso es Expand Filesystem: Expande la particin instalada en la tarjeta SD si se usa una superior a 2GB. Como en nuestro caso hemos usado una de 4GB, para que el sistema operativo pueda ver toda la capacidad (por defecto 2GB), tendremos que usar esta opcin pulsando Enter sobre ella. Saldr una ventana de confirmacin para redimensionar la particin. La aceptaremos pulsando Enter.
El siguiente paso es Internationalisation Options/change_locale: Esta opcin permite seleccionar la codificacin de caracteres y otros smbolos que se muestran en la pantalla, con el fin de espaolizar lo que mas se pueda en nuestra Raspberry Pi. Seleccionaremos la codificacin que se usa para el espaol: es_ES, es_ES.UTF-8, es_ES@euro pulsando la barra espaciadora y luego presionaremos Enter. Saldra otra ventana en la cual seleccionaremos es_ES.UTF-8 y daremos Enter.
El siguiente paso es Internationalisation Options/change_timezone: Esta opcin cambia la fecha y hora del sistema. Recuerda que Raspberry Pi no tiene reloj, la hora y fecha es tomada de Internet. Cambiaremos esta opcin. Buscaremos America, damos Enter y luego Bogota y damos Enter.
Para terminar de configurar nuestra Raspberry Pi, pulsaremos en Finish.
Y aceptaremos un reinicio del sistema. Si no se reinicia, usaremos el comando sudo reboot para forzarlo nosotros.
Esta es la configuracin bsica de Raspberry Pi, si quieres saber ms sobre las dems configuraciones puedes revisar en la web al respecto del tema.
Escritorio remoto (VNC)
El escritorio remoto, o tambien llamdo VNC (Computacin Virtual en Red), nos permite usar el entorno grafico de Raspberry Pi desde otro ordenador. Tendremos acceso total a todo el contenido de Raspberry Pi de forma visual, como si estuviramos viendo directamente el monitor de Raspberry Pi.
Para lograr esto, necesitamos instalar un paquete en nuestra Raspberry Pi, y lo haremos as:
Abriremos una conexin SSH. Escribiremos: 1. sudo apt-get update 2. sudo apt-get upgrade 3. sudo apt-get update 4. sudo apt-get install xrdp Las tres primeras instrucciones son para instalar las ltimas actualizaciones en nuestra Raspberry Pi. Siempre es bien importante tenerla actualizada. Y la ultima instruccin es para instalar el paquete que nos permitir conectarnos al escritorio remoto. En caso de pedir confirmacin en alguno de los tem teclearemos Y o S segn sea el caso y luego Enter.
Comenzar a instalarse el paquete xrdp y si la instalacin fue correcta ya podremos conectarnos a nuestra Raspberry Pi por escritorio remoto.
En Windows, le daremos a Inicio y en el cuadro de bsqueda pondremos Escritorio. Nos deber aparecer el programa Conexin a Escritorio remoto. Haremos clic en l.
Nos aparecer una ventana como la de la imagen. Donde pone Equipo, escribiremos la IP de Raspberry Pi y haremos clic en el botn Conectar. Se nos mostrar un mensaje de alerta, marcaremos la casilla No volver a preguntarme y haremos clic en el botn S.
Nos deber aparecer la siguiente ventana si todo est correcto. Rellenaremos los datos username: pi; y password: raspberry; y haremos clic en OK. Ya podremos acceder de manera remota y visual a nuestro Raspberry Pi.
WI-FI
Hay una manera muy elegante de poder conectar nuestra Raspberry Pi a internet por medio un modulo wi-fi. Entre los compatibles se encuentran:
Periferico Marca Modelo Adaptador Wifi USB Tp-Link TL-WN721N 150n USB Adaptador Wifi USB Tp-Link TL-WN722N 150n USB Adaptador Wifi USB Generico, Importado de China g623, 802.11N (150n),
La configuracin de estos mdulos por lo general es un poco tediosa si se hace desde la consola, pero existe un programa WICD que nos permite de manera muy sencilla configurar el modulo en la Raspberry Pi y para ello solo hay que teclear en la consola sudo aptitude install wicd, esperamos a que instale y si pide confirmacin daremos Y o S segn sea el caso y luego Enter.
Una vez instalado el programa iremos a la ruta donde quedo inicio/internet/Wicd Network Manager de la siguiente manera:
Una vez abierto el programa veremos las diferentes redes disponibles que nuestro modulo wi-fi detecta. Damos click en propiedades de la red a la cual queremos conectarnos y una vez all basta con ingresar la clave de la red y luego click en aceptar, de esta manera guardamos la configuracin de la red y el resto lo hara WICD por nosotros. Quitamos la alimentacin de la Raspberry Pi y desconectamos el cable RJ45, luego alimentamos la tarjeta nuevamente y si todo quedo bien configurado deber conectarse automticamente a la red que acabamos de ingresar desde el modulo wi-fi. En el caso de haber mas redes a las cuales podramos conectarnos basta con seguir el mismo procedimiento y automticamente WICD nos conectara con la que este disponible en ese momento y la que muestre mejor seal.
GPIO
La importancia de la Raspberry pi en su gran mayora de aplicaciones radica en sus pines GPIO y la flexibilidad que admiten para programarlos.
GPIO son las siglas en ingles de General Purpose Inputs and Ouputs que significa Entradas y Salidas de Propsito General. La Raspberry Pi posee 26 pines GPIO con funciones definidas para SPI o I2C, sin embargo, nosotros los podemos reconfigurar para que todos sean puertos digitales de entrada/salida. Nosotros podremos utilizar 17 de estos pines y configurar cada uno de ellos ya sea como puerto de entrada o de salida, los nueve pines restantes son pines que entregan voltaje ya sea a 3.3V (2 pines), 5V (2 pines) o conexin a tierra (5 pines).
Los pines GPIO no tienen ningn propsito especial definido, y no se utilizan de forma predeterminada, aunque para algunas funciones especficas solo pueden ser usados ciertos pines del GPIO como muestra la figura. La idea es que a veces, para el diseo de un sistema completo que utiliza el chip podra ser til contar con un puado de lneas digitales de control adicionales, y tenerlas a disposicin, esto ahorra el tiempo de tener que organizar circuitos adicionales para proporcionarlos.
I2C
I2C es un bus de comunicaciones en serie. Su nombre viene de Inter-Integrated Circuit (Inter-Circuitos Integrados). Es un bus muy usado en la industria, principalmente para comunicar microcontroladores y sus perifricos en sistemas integrados (Embedded Systems) y generalizando ms para comunicar circuitos integrados entre si que normalmente residen en un mismo circuito impreso.
La principal caracterstica de I2C es que utiliza dos lneas para transmitir la informacin: una para los datos y por otra la seal de reloj. Tambin es necesaria una tercera lnea, pero esta slo es la referencia (masa). Como suelen comunicarse circuitos en una misma placa que comparten una misma masa esta tercera lnea no suele ser necesaria. Las lneas se llaman: SDA: datos SCL: reloj GND: tierra
Las dos primeras lneas son drenador abierto, por lo que necesitan resistencias de pull-up. En el caso de la Raspberry Pi esta resistencia ya viene incluida.
Los dispositivos conectados al bus I2C tienen una direccin nica para cada uno. Tambin pueden ser maestros o esclavos. El dispositivo maestro inicia la transferencia de datos y adems genera la seal de reloj, pero no es necesario que el maestro sea siempre el mismo dispositivo, esta caracterstica se la pueden ir pasando los dispositivos que tengan esa capacidad. Esta caracterstica hace que al bus I2C se le denomine bus multimaestro.
Este bus tiene una topologa maestro-esclavo. En este caso el maestro es nuestro Raspberry pi (y los esclavos una multitud de dispositivos y sensores).
Las transferencias de datos se llevan a cabo mediante la lnea serie de datos SDA. La lnea SCL lleva la seal de reloj que sincroniza los datos de la lnea SDA.
El dispositivo maestro (microcontrolador, en nuestro caso Raspberry pi) es quien siempre tiene la iniciativa de la comunicacin. El maestro genera la seal de reloj y controla cuando se transmiten o reciben los datos.
Puede haber varios esclavos en la red I2C, pero el maestro solo se comunica con uno a la vez con un protocolo de pregunta/respuesta. Para poder localizar a cada dispositivo es necesario que cada uno tenga una direccin nica dentro del bus.
En terminologa I2C los datos se organizan en transferencias. Las transferencias comienzan con una seal de START y termina con otra de STOP. Los datos tienen una longitud de 1 byte y terminan con bit de ACK (o NACK).
Una condicin START es una transicin de Alto a Bajo en la lnea SDA cuando SCL est en Alto. Despus de Start el bus se considera ocupado.
Una condicin STOP es una transicin de Bajo a Alto en la lnea SDA mientras SCL est en Alto. Despus de Stop las dos lneas estn en Alto y el bus se considera libre.
Siendo una comunicacin serie donde cada dato por la lnea SDA est sincronizado con el reloj, es este ltimo quien marca la velocidad de transmisin. Una velocidad de 100 kbits/s implica que cada bit se transmite en 1s/100k = 10s. Estos datos se detallan en el Estndar I2C y tambin suelen ir indicados en los datasheets de los dispositivos I2C.
El estndar del bus I2C soporta cuatro modos de operacin:
Standard Mode, con una velocidad de hasta 100 kbit/s. Fast mode, con una velocidad de hasta 400 kbit/s. Fast mode plus, con una velocidad de hasta 1 Mbit/s. High-speed mode, con una velocidad de hasta 3.4 Mbit/s.
UART
UART son las siglas de "Universal Asynchronous Receiver-Transmitter" ( en espaol, Transmisor-Receptor Asncrono Universal ). ste controla los puertos y dispositivos serie. Se encuentra integrado en la placa base o en la tarjeta adaptadora del dispositivo. Generalmente se conocen como TxD y RxD.
Las funciones principales de chip UART son de manejar las interrupciones de los dispositivos conectados al puerto serie y de convertir los datos en formato paralelo, transmitidos al bus de sistema, a datos en formato serie, para que puedan ser transmitidos a travs de los puertos y viceversa.
SPI
El Bus SPI (del ingls Serial Peripheral Interface) es un estndar de comunicaciones, usado principalmente para la transferencia de informacin entre circuitos integrados en equipos electrnicos. El bus de interfaz de perifricos serie o bus SPI es un estndar para controlar casi cualquier dispositivo electrnico digital que acepte un flujo de bits serie regulado por un reloj.
Incluye una lnea de reloj, dato entrante, dato saliente y un pin de chip select, que conecta o desconecta la operacin del dispositivo con el que uno desea comunicarse. De esta forma, este estndar permite multiplexar las lneas de reloj.
Muchos sistemas digitales tienen perifricos que necesitan existir pero no ser rpidos. La ventajas de un bus serie es que minimiza el nmero de conductores, pines y el tamao del circuito integrado. Esto reduce el coste de fabricar montar y probar la electrnica. Un bus de perifricos serie es la opcin ms flexible cuando se tiene tipos diferentes de perifricos serie. El hardware consiste en seales de reloj, data in, data out y chip select para cada circuito integrado que tiene que ser controlado. Casi cualquier dispositivo digital puede ser controlado con esta combinacin de seales. Los dispositivos se diferencian en un nmero predecible de formas. Unos leen el dato cuando el reloj sube otros cuando el reloj baja.
Algunos lo leen en el flanco de subida del reloj y otros en el flanco de bajada. Escribir es casi siempre en la direccin opuesta de la direccin de movimiento del reloj. Algunos dispositivos tienen dos relojes. Uno para capturar o mostrar los datos y el otro para el dispositivo interno.
El SPI es un protocolo sncrono. La sincronizacin y la transmisin de datos se realizan por medio de 4 seales:
SCLK (Clock): Es el pulso que marca la sincronizacin. Con cada pulso de este reloj, se lee o se enva un bit. Tambin llamado TAKT (en Alemn). MOSI (Master Output Slave Input): Salida de datos del Master y entrada de datos al Slave. Tambin llamada SIMO. MISO (Master Input Slave Output): Salida de datos del Slave y entrada al Master. Tambin conocida por SOMI. SS/Select(CE0, CE1): Para seleccionar un Slave, o para que el Master le diga al Slave que se active. Tambin llamada SSTE.
La Cadena de bits es enviada de manera sncrona con los pulsos del reloj, es decir con cada pulso, el Master enva un bit. Para que empiece la transmisin el Master baja la seal SSTE SS/Select a cero, con esto el Slave se activa y empieza la transmisin, con un pulso de reloj al mismo tiempo que el primer bit es ledo. Ntese que los pulsos de reloj pueden estar programados de manera que la transmisin del bit se realice en 4 modos diferentes, a esto se llama polaridad y fase de la transmisin:
1. Con el flanco de subida sin retraso. 2. Con el flanco de subida con retraso. 3. Con el flanco de bajada sin retraso. 4. Con el flanco de bajada con retraso.
PWM
La modulacin por ancho de pulsos (tambin conocida como PWM, siglas en ingls de pulse-width modulation) de una seal o fuente de energa es una tcnica en la que se modifica el ciclo de trabajo de una seal peridica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir informacin a travs de un canal de comunicaciones o para controlar la cantidad de energa que se enva a una carga.
El ciclo de trabajo de una seal peridica es el ancho relativo de su parte positiva en relacin con el perodo. Expresado matemticamente:
D es el ciclo de trabajo es el tiempo en que la funcin es positiva (ancho del pulso) T es el perodo de la funcin La construccin tpica de un circuito PWM se lleva a cabo mediante un comparador con dos entradas y una salida. Una de las entradas se conecta a un oscilador de onda dientes de sierra, mientras que la otra queda disponible para la seal moduladora. En la salida la frecuencia es generalmente igual a la de la seal dientes de sierra y el ciclo de trabajo est en funcin de la portadora.
La principal desventaja que presentan los circuitos PWM es la posibilidad de que haya interferencias generadas por radiofrecuencia. stas pueden minimizarse ubicando el controlador cerca de la carga y realizando un filtrado de la fuente de alimentacin.
Todas y cada una de estas funciones son las que se pueden realizar desde los pines GPIO de nuestra Raspberry Pi. Esta es una linea que aun esta en investigacion asi que sera necesario actualizarse para ver que nevos proyectos, usos y aplicaciones entan teniendo lugar con la Raspberry Pi, usando los GPIO.
ANDROID Y ECLIPSE
Android es la primera plataforma mvil completamente abierta y libre que adems ofrece a desarrolladores un kit de poderosas herramientas para la creacin de aplicaciones.
Para poder desarrollar una aplicacin android ser necesario contar con un software que nos permita tener todas las herramientas necesarias para ello.
Instalar y configurar el kit de desarrollo de java apropiado, el JDK, el entorno de desarrollo integrado IDE, Eclipse y el kit de desarrollo de software android, SDK. Y dependiendo de los mviles que se quieran manejar habr que instalar algunos drivers. Todo este entorno de desarrollo puede instalarse es diversos sistemas operativos pero este proyecto se centrara en Windows, en todo caso hay bastante documentacin en la pagina oficial de android en cuanto a requerimientos de hardware y software en los diferentes sistemas operativos soportados.
Para la instalacin y configuracin del entorno de desarrollo se siguieron los siguientes pasos:
1. Descargar e instalar Java SE Development Kit 7u45. Elegimos el sistema operativo de nuestro ordenador donde vamos a trabajar. 2. Descargar el SDK de android desde su pagina oficial. En el paquete descargado se incluye el IDE de Eclipse por lo que no ser necesario descargarlo de su web oficial. El SDK de android y el IDE de Eclipse no requieren instalacin, solo descomprimimos en el directorio de nuestra preferencia y listo.
Teniendo todo lo anterior listo ya podremos empezar a desarrollar una aplicacin android y para abrir el entorno de desarrollo hay que ejecutar eclipse.exe. En caso de presentar problemas o errores a la hora de abrir el eclipse tendremos que incluir la ruta del SDK en las variables path del sistema operativo que estemos utilizando y para ello habr que seguir los siguientes pasos:
1. Ir a Inicio, click derecho sobre Equipo/propiedades.
2. Luego ir a configuracin avanzada del sistema y luego click en variables de entorno.
3. Buscamos la varible CLASSPATH y en caso de no tenerla la incluimos, dando click en Nueva.
En nombre de variable escribimos CLASSPATH y en valor de variable la ruta en la que se encuentra el SDK Manager.exe de android. Por ejemplo, C:\android-sdk\SDK Manger.exe
En caso de existir otras variables basta con colocar un punto y coma (;) y luego incluir la ruta del SDK.
4. Por ltimo ser necesario actualizar el software y para ello abrimos eclipse y vamos a Windows/SDK Manager. All aparecer una lista de las actualizaciones disponibles y se debe elegir solo las que se necesiten ya que actualizar todo seria innecesario y requerira de mucho tiempo.
El ADT Plug-in de android para eclipse ofrece funcionalidades para desarrollar, compilar, empaquetar y usar aplicaciones android. Especficamente el ADT provee en primer lugar un Android Project Wizard que genera todos los archivos que requiere el proyecto, en segundo lugar un Editor De Recursos que incluye un editor de diseo grfico para disear interfaces grficas de usuario, en tercer lugar el Android Manager que incluye el SDK (software development kit) y el AVD (Android Virtual Device), en cuarto lugar la Perspectiva DDMS para monitorear y depurar aplicaciones android, en quinto lugar la Integracion Con Utilidades como LogCat, en sexto lugar la Construccin Automatizada de aplicaciones para emuladores y microtelefonos y en sptimo lugar un Soporte ProGuard que incluye un paquete de aplicaciones y herramientas de firma de cdigo para la publicacin de aplicaciones.
Para empezar a realizar la aplicacin abrimos eclipse y vamos a New/Android Application Project.
All daremos nombre a nuestra aplicacin, al proyecto y al package que es donde estarn todas las activity y las clases que contendr nuestro proyecto.
Adems hay otras opciones como Minimun Required SDK que hace mencin la versin de android mnima que requerir tener el celular que ejecutara la app, Target SDK y Compile SDK que nos permite elegir con que versin se quiere compilar, lo dems va por defecto. Damos Next. Aqu hay otras opciones que no es necesario mencionamos la dejamos por defecto y damos Next
Aqu seleccionamos el icono con el cual queremos que se vea nuestra app una vez terminada; las imgenes deben tener extensin png. Ahora android cuenta con una herramienta que se llama draw9patch y nos ayudar a generar archivos 9-patch a partir de imgenes PNG.
Draw9patch
Un grfico 9-patch es bsicamente una imagen de mapa de bits extensible, es decir, un tipo de imagen que Android puede cambiar de tamao automticamente para ajustarse a la vista a la que se le ha sido asignado como background.
Para crear estas imgenes ser necesario abrir la herramienta Draw9Patch que se encuentra en el directorio tools dentro de la carpeta del SDK de Android. Se trata de un archivo .bat. Lo ejecutas y enseguida vers la siguiente pantalla:
El primer paso es cargar la imagen que queremos convertir. Para ello, podemos arrastrar y soltar la imagen dentro de la ventana o bien ir a la opcin File/Open9-patch y elegir la imagen deseada. Esta imagen debe tener extensin png. Si la imagen que se desea no tiene esta extensin tendremos que abrirla con Paint y luego ir a Archivo/Guardar Como y elegir la opcin de extensin png.
Cuando carguemos la imagen la pantalla se nos mostrar como sigue:
En la parte principal tenemos nuestra imagen y nuestra rea de trabajo donde aplicaremos los cambios necesarios. En la parte derecha se nos muestra la vista previa de cmo reaccionar nuestra imagen cuando el elemento se estire a lo ancho o a lo largo de la pantalla. Esta imgenes pueden ser el fondo de un TextView o de un botn o de cualquier otro elemento. En la parte inferior tenemos algunas herramientas como el zoom que nos permitirn tener mayor precisin al trabajar la imagen que hemos cargado.
Ahora debemos marcar lneas fuera del elemento y sobre un espacio que necesitemos que se expanda para ayudar a que la imagen no se vea pixelada.
Cada vez que agreguemos una lnea sobre la imagen podemos ver el resultado en la vista previa de la herramienta. Por ejemplo:
En este caso he agregado cuatro lneas que representan el espacio que se repetir para que las esquinas no se tengan que pixelear cuando el fondo se estire en un componente. Para poder visualizar las zonas que estar repitiendo Android cuando redimensione la imagen bastar con presionar el botn Show bad patches/Hide bad patches y se vera asi:
Cabe mencionar que las lneas negras que dibujamos son de un pixel, cuando queramos borrar alguna presionamos Shift y damos clic sobre la porcin de la lnea a borrar que se representa por cada uno de los cuadros que conforman nuestra rea de trabajo. Cuando ya estemos satisfechos con el resultado que se muestra en la vista previa podemos pasar a guardar la imagen con la opcin File/Save 9-patch.
Cuando ya tengamos la imagen habr que agregarlas al proyecto. Para ello, debers eliminar primero las imgenes que tienes actualmente en la carpeta drawable, esta carpeta se encuetra en el workspace de eclipse dentro de la carpeta donde esta nuestro proyecto. El workspace esta por defecto en Mis Documentos la ruta sera as por ejemplo: C:\Users\AJ\workspace\TesisUFPS_CRP\res\drawabley posteriormente agregar las imgenes 9-patch.
Este es el funcionamiento bsico del uso de esta herramienta y que podemos utilizar en escenarios mucho ms complejos para lidiar con el rollo de las resoluciones de pantalla y tambin cuando tenemos elementos que variarn su tamao segn el contenido que tengan.
All adems hay unas opciones adicionales sobre el incono y se nos mostrara como quedara cuando estemos satisfechos damos click en Next.
En esta ventana se nos da la opcin de elegir el entorno de la interfaz grfica. La primera opcin Blank Activity es para crear una actividad completamente en blanco donde podemos empezar a disear desde cero nuestra app. La segunda opcin es Fullscreen Activity que crea una nueva actividad que alterna la visibilidad de la interfaz de usuario del sistema (estado y las barras de navegacin) y la barra de accin sobre la interaccin del usuario y por ultimo Master/Detail Flow crea un nuevo maestro que permite a los usuarios ver una coleccin de objetos, as como los detalles de cada objeto. Este flujo se presenta con dos columnas en las pantallas de la tableta de tamao y una columna en dispositivos y pantallas ms pequeas. Esta plantilla crea dos actividades, un fragmento principal, y un fragmento detalle. Para proyectos sencillos y donde no se requiera un comportamiento especial de la interfaz elegimos la primera opcin y pulsamos Next.
Aqu debemos elegir el nombre para nuestra primera actividad y el nombre del layout o interfaz que ira asociada a esa actividad lo dems va por defecto y damos click en Finish.
Para un mayor entendimiento de todo lo realizado anteriormente y para que podamos desarrollar una aplicacin que funcione correctamente es indispensable entender que es una Activity (actividad) en android.
ACTIVITY
Una Activity en una ventana que contiene la interface de usuario de nuestra aplicacin, es un componente de la aplicacin que provee al usuario de una interfaz grfica para interactuar con ella y realizar una accin especfica, en comparacin con una aplicacin de escritorio, sera como una ventana. Una aplicacin puede tener cero o ms activities. El objetivo principal de una activity es interactuar con el usuario. Desde el momento que una activity aparece en la pantalla hasta el momento que se oculta, pasa por varias etapas, conocido como el ciclo de vida de una activity. Entender el ciclo de vida de una activity es vital para asegurar que tu aplicacin funcione correctamente.
La clase Activity define una serie de eventos que controlan el ciclo de vida de una actividad. La clase activity define los siguientes eventos:
Estados de la actividad:
Activa (Running): Est la primera en la pila de ejecucin, el usuario ve la actividad y puede interactuar con ella.
Pausada (Paused): Ha pasado a segundo plano pero aun est visible porque otra actividad se coloca sobre ella pero no la tapa del todo. En este caso, la actividad tapada puede ser cerrada por el sistema si necesita liberar recursos para la nueva actividad.
Parada (Stopped): Ha pasado a segundo plano y est completamente tapada por la nueva actividad, en ese caso el sistema tambin puede optar por cerrarla si necesita liberar recursos.
Destruida (Destroyed): ya no est disponible, se han liberado todos sus recursos y en caso de ser llamada, necesitara comenzar un nuevo ciclo de vida.
Mtodos para la gestin del ciclo:
onCreate(): Se llama al crear la actividad. Es donde se prepara la interfaz grfica de la pantalla. Tras esta funcin, el proceso sobre el que se ejecuta la Actividad no puede ser destruido por el sistema. El siguiente mtodo que se llama es onStart().
onStart(): Se ejecuta justo antes de que la aplicacin sea visible al usuario. El siguiente mtodo de ciclo de vida llamado ser onStop() u onResume(), dependiendo de la situacin.
onRestoreInstanceState(): Se invoca para recuperar el estado guardado por onSaveInstanceState().
onSaveInstanceState(): Se invoca para permitir a la actividad guardar su estado, pero si hay muy poca memoria es posible que la actividad se destruya sin llamar a este mtodo.
onResume(): Se ejecuta en el momento en que la actividad se encuentra en la parte superior de la pila, justo antes de que el usuario pueda interactuar con ella. El siguiente mtodo ser onPause().
onRestart(): Se llama cuando una actividad que se haba parado vuelve a estar activa, justo antes de que comience de nuevo. Tras ella se llama a onStart() y su proceso no puede ser destruido ni durante ni tras su ejecucin.
onPause(): Se llama cuando la actividad va a ser tapada por otra, por tanto se llama cuando se llame al onRestart() de otra. En este mtodo debemos aprovechar para liberar todo aquello que consume recursos (para msica, detener procesos) o guardar datos de manera persistente. No podr contener tareas lentas ya que hasta que no termine este mtodo no podr ejecutarse el onResume de la nueva actividad. El mtodo siguiente ser onResume() u onStop().
onStop(): Se ejecuta cuando la actividad se hace invisible al usuario. Puede ser porque otra actividad la tape y entonces el siguiente mtodo ser onRestart() o porque la actividad haya sido destruida, llamado a continuacin a onDestroy().
onDestroy(): Se llama antes de destruir la actividad. Durante la destruccin de la actividad se perdern todos los datos asociados a ella por lo que en este mtodo podr ser utilizado para controlar la persistencia de datos. Se llamar cuando se ejecuta el mtodo de finalizacin finish() sobre la actividad o porque el sistema elimina la actividad para conseguir ms recursos.
La Activity es destruida cuando se presiona botn BACK, esto es crucial saberlo, en cualquier estado que se encuentre la activity ser destruido; por lo tanto, es necesario escribir cdigo adicional para preservar el estado cuando fu destruda la activity. Hasta este punto, observe que el evento OnPause() es llamado en 2 escenarios, cuando una activity es enviada a background, tambin cuando la activity es eliminada cuando el usuario presiona el boton BACK.
Cuando una activity es iniciada, el evento onStart() y onResume() son siempre llamados, independientemente de si la activity es restaurada desde el background o creada nuevamente. Incluso si una aplicacin tiene una sola activity y la activity es finalizada (killed),la aplicacin seguir ejecutndose en memoria. Ficheros Y Partes De Un Proyecto Android
Carpetas de un proyecto Android
Carpeta Nombre Androidmanifest.xml Fichero XML que describe cmo se va a construir la aplicacin y de que partes se compone: servicios, actividades, ... Adems especificaremos los permisos que necesitamos en nuestra aplicacin. bin/ Contiene la aplicacin compilada libs/ Contiene bibliotecas externas para nuestra aplicacin. Por ejemplo, componentes desarrollados por otros y que queremos incorporar a nuestros proyectos res/ Carpeta para almacenar los recursos de nuestra aplicacin. Por ejemplo, los grficos, iconos, cadenas en varios idiomas, ... src/ Cdigo fuente Java de la aplicacin. assets/ Otros ficheros que se empaquetan con la aplicacin para instalarse en el dispositivo. Por ejemplo, archivos de bases de datos, HTML, ficheros de texto gen/ Carpeta donde se va colocando el cdigo generado. Contiene un fichero "R.java" generado automticamente y que hace referencia a los recursos de nuestro proyecto. No debemos modificar este fichero. build.xml y *.properties Ficheros para generar los proyectos si no utilizamos Eclipse proguard.cfg Archivo para "ofuscar" el cdigo Android. Un ofuscador es un proceso para ocultar el cdigo y as evitar que se puede "decompilar" un programa y podamos acceder al cdigo fuente.
Cuando creamos un proyecto, le hemos proporcionado el nombre de una actividad para la aplicacin. Si vemos el rbol de ficheros de la rama "src":
"src" o "source" es la carpeta donde escribiremos nuestro cdigo Java para la aplicacin Android. Ah recogeremos todos los elementos creados en la zona "res", donde se ubican las pantallas definidas por el usuario, y las presentaremos con el cdigo adecuado. En este caso, el asistente de creacin del proyecto me solicit si queramos crear tambin la actividad. Al indicar que si, nos puso, a modo de ejemplo, este cdigo vlido de inicio.
Dentro de la carpeta "gen" se encuentra el cdigo generado creado cuando ejecutamos el proyecto. No debemos modificar nunca estos ficheros:
El fichero que genera, llamado "R" es el que contiene los recursos del programa: pantallas, grficos, ... vemos por ejemplo que dentro de "string" estn las dos cadenas de ejemplo y dentro de "layout" la pantalla donde estn insertados estos y que se llama, por defecto, "main".
Si seleccionamos alguno de ellos, podemos ver su cdigo fuente a la derecha, donde se indica que es un fichero generado automticamente y que no debemos modificarlo:
La carpeta de recursos /res: Si nos fijamos en lo que tenemos por defecto, podemos ver el icono de la aplicacin en tres resoluciones distintas (hdpi, ldpi, mdpi):
Sern iconos para los distintos formatos o resoluciones de los dispositivos. Las subcarpetas de esta zona de recursos son:
res/drawable: para imgenes. Por ejemplo de formato JPEG o PNG. res/layout: para especificaciones de formato de pantallas basadas en XML. res/menu: para definir mens en formato XML. res/raw: de propsito general, por ejemplo vdeos o ficheros de texto. res/values: para cadenas de caracteres. res/xml: para otro tipo de ficheros XML que queremos empaquetar con el proyecto.
Adems estos archivos pueden llevar los sufijos dependiendo de la resolucin de la pantalla.
Cuando creamos un proyecto tenemos estos tres iconos de ejemplo, una disposicin de pantalla o "layout" sencilla en el main.xml y un fichero de recursos llamado "strings.xml". Vamos a detenernos un momento en este fichero de recursos. Observemos el siguiente cdigo.
Esto da como resultado una salida en pantalla de una cadenas de caracteres basada en una variable "@string/hello". Esta ltima definicin "@" indica que se trata de una cadena de este fichero de recursos:
En principio parece que todo esto nos complica la aplicacin ya que tendramos que definir todos los literales que queremos poner en las pantallas. Pero a la hora de querer hacer multi idioma nuestra aplicacin bastara con indicar los literales correctos del archivo de recursos en lugar de tener que definir una pantalla para cada idioma con sus textos traducidos.
AVD
Las AVD (Android Virtual Devices) son unas herramientas imprescindibles para los desarrolladores ya que nos permiten emular en una computadora un entorno mvil a los que apuntar nuestra aplicacin Android. Para crear un AVD ser necesario seguir los siguientes pasos:
1. Abrimos el AVD Manager desde la opcin Window > Android Virtual Device Manager o desde el siguiente icono que puedes encontrar en la barra de herramientas de Eclipse: 2. Elegimos la opcin Virtual devices del panel, situado a la izquierda y damos clic sobre el botn New
3. En la ventana Create new Android Device (AVD) llenaremos los siguientes campos: Name: El nombre que recibir el dispositivo virtual y el que aparecer en la bandeja de dispositivos disponibles. Device: Aqu seleccionamos el tipo de dispositivo que queremos emular. Se recomienda usa la opcin QVGA por referenciar un telfono mvil de tamao normal. Target: Es la versin de Android que correr en el dispositivo virtual. Esta versin deber ser como mnimo la que utilices para crear tus proyectos. De igual forma, puedes crear tantos dispositivos virtuales como versiones de la plataforma tengas instaladas en Eclipse. CPU/ABI: El tipo de procesador y arquitectura de hardware que poseera el emulador (el mas comn es ARM). Keyboard: Esta opcin es para que nos permita usar el teclado del computador. Skin: Para que nos permita contar con botones fsicos emulados. Front Camera: Si deseamos cmara frontal. Back Camera: Si deseamos cmara trasera. Momory Options: Sera la memoria de procesamiento de nuestro AVD, se recomiendan valores de RAM:512 y VmHeap:16. VmHeap es la memoria en tiempo real de ejecucin. Internal Storage: El espacio de disco duro que poseer el emulador. SD Card: Aqu configuramos lo relacionado con la SD Card. Se puede seleccionar el tamao o cargar el archivo de una SD Card existente. Snapshot: Si se chequea esta opcin cuando el emulador cargue luego de su primera vez (aun cuando se haya cerrado) cargara mucho ms rpido; ya que no cargara todo el sistema operativo sino desde un estado previamente guardado, aunque cuando lo cierres tardara un momento porque es en ese momento en que la instantnea es creada. Use Host GPU: Esta opcin har ms rpido el emulador pues utilizara el GPU de la PC para acelerar las operaciones de dibujo. Cuando cargue ser igual de lento pero, cuando se navegue por las aplicaciones ser todo ms fluido.
Estas dos ltimas opciones son excluyentes, solo se puede utilizar una de ellas a la vez.
4. Da clic en el botn OK y automticamente aparecer esta AVD en el panel principal. Para probarla, slo da clic sobre el botn Start.
5. En la siguiente ventana da clic sobre el botn Launch y podrs ver tu ADV corriendo.
La primera vez que ejecutas una AVD puede resultar tardado el proceso, pero luego se normaliza la velocidad y el rendimiento de acuerdo a las especificaciones que se le hayan dando.
El FRAMEWORK WebIOPi
En el desarrollo de software, un framework o infraestructura digital, es una estructura conceptual y tecnolgica de soporte definido, normalmente con artefactos o mdulos de software concretos, que puede servir de base para la organizacin y desarrollo de software. Tpicamente, puede incluir soporte de programas, bibliotecas, y un lenguaje interpretado, entre otras herramientas, para as ayudar a desarrollar y unir los diferentes componentes de un proyecto.
Aunque las libreras mencionadas anteriormente trabajan muy bien existe un framework llamado WebIOPi diseado para la Raspberry Pi, escrito principalmente en lenguaje python, el cual permite controlar los pines GPIO de manera local y remota y permite controlar los dispositivos que estn conectados a los GPIO.
Una de las grandes funcionalidades que posee WebIOPi son sus distintas libreras que permiten control, depuracin y utilizacin del GPIO de la Raspberry Pi localmente o de forma remota, desde un navegador o cualquier aplicacin.
Posee adems un API REST a travs de HTTP y COAP (draft-14) con soporte multicast, servidor escrito en Python con cero dependencia, soporta GPIO, Serial, I2C, SPI; extensible y altamente personalizable, usuario y clave de proteccin, compatible con dispositivos mviles, incluye aplicaciones web de depuracin como son GPIO Header, Lista GPIO, serial Monitor, monitor de dispositivos. Tiene adems una biblioteca cliente Javascript construido en la cima de jQuery, una biblioteca cliente Python con HTTP y soporte COAP.
Sus diferentes bibliotecas permiten una amplia gama de aplicaciones como es la biblioteca webiopi.GPIO para controlar GPIO en los scripts de Python, los controladores de dispositivos para interactuar con DAC, ADC, sensores y ms en las secuencias de comandos de Python, clases en los scrpts de Python para conexin serie, I2C y SPI, un monitor serie web-app para depurar dispositivos serial, dispositivos de supervisin de la web-app para depurar dispositivos como DAC, ADC, sensores y ms, tambin permite crear una aplicacin Web con la biblioteca Javascript para controles remotos conectados a los GPIO, un cliente de Python para la comunicacin Pi-Pi-2 a travs de la API REST, un cliente Multicast Python para controlar mltiples Raspberry Pis con una sola llamada REST y por ultimo un cliente de Java para utilizar la API REST desde una aplicacin Java, incluyendo Android que es la librera que mas nos importa debido a la naturaleza de este proyecto.
Ahora bien para poder utilizar WebIOPi ser necesario instalarlo en la Raspberry Pi y para ello seguiremos los siguientes pasos:
1. Descargar el framework y para ello tecleamos en al consola: wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz 2. Descomprimimos el archivo descargardo: tar xvzf WebIOPi-0.6.0.tar.gz 3. Ingresamos al directorio para poder instalarlo: cd WebIOPi-0.6.0 4. Instalamos: sudo ./setup.sh 5. Lo configuramos para que se ejecute al iniciar la Raspberry Pi sudo update-rc.d webiopi defaults 6. Y ejecutamos sudo /etc/init.d/webiopi start
Una vez hecho todo lo anterior ya podremos controlar los pines GPIO de la Raspberry Pi desde cualquier computador o mvil a travs de un navegador web ingresando como URL la direccin IP de la Raspberry Pi y el puerto que por defecto es 8000, asi: http://IpRaspberryPi:8000/ donde IpRaspberryPi ser la IP asignada por nuestro rourter. Se nos pedir usuario: webiopi y constrasea: raspberry.
Si todo se hizo correctamente al ingresar la URL deber verse como la siguiente imagen:
WebIOPi tiene cuatro opciones de trabajo, la primera GPIO Header que nos permite ver la distribucin fsica el GPIO y controlarlos cambiando el estado de sus pines, ya sea como entradas/salidas y 1/0. Siendo el estado amarillo un 1 y el negro un 0.
GPIO List que nos permite controlar los pines GPIO pero mostrados en orden como una lista.
Serial Monitor que nos permite por medio de la UART conectar un monitor y as poder ver lo que recibimos y podremos enviar datos.
Y por ltimo esta Devices Monitor que nos permite ver dispositivos y circuitos de control y de depuracin conectados a la Raspberry Pi y configurados en WebIOPi.
Este ser el framework con el que estaremos trabajando en nuestra aplicacin android por medio de la API REST de java incluida en el paquete de WebIOPi.
API REST
REST, Representational State Transfer, es un tipo de arquitectura de desarrollo web que se apoya totalmente en el estndar HTTP. REST nos permite crear servicios y aplicaciones que pueden ser usadas por cualquier dispositivo o cliente que entienda HTTP, por lo que es increblemente ms simple y convencional que otras alternativas que se han usado en los ltimos diez aos como SOAP y XML- RPC. Podramos considerar REST como un framework para construir aplicaciones web respetando HTTP.
Por lo tanto REST es el tipo de arquitectura ms natural y estndar para crear APIs para servicios orientados a Internet.
Existen tres niveles de calidad a la hora de aplicar REST en el desarrollo de una aplicacin web y ms concretamente una API que se recogen en un modelo llamado Richardson Maturity Model en honor al tipo que lo estableci, Leonard Richardson padre de la arquitectura orientada a recursos. Estos niveles son: 1. Uso correcto de URIs 2. Uso correcto de HTTP. 3. Implementar Hypermedia.
Adems de estas tres reglas, nunca se debe guardar estado en el servidor, toda la informacin que se requiere para mostrar la informacin que se solicita debe estar en la consulta por parte del cliente.
Nivel 1: Uso correcto de URIs Cuando desarrollamos una web o una aplicacin web, las URLs nos permiten acceder a cada uno de las pginas, secciones o documentos del sitio web. Cada pgina es informacin en una seccin y cada archivo, cuando hablamos de REST, los nombramos como recursos.
El recurso por lo tanto es la informacin a la que queremos acceder o que queremos modificar o borrar, independientemente de su formato.
Las URL, Uniform Resource Locator, son un tipo de URI, Uniform Resource Identifier, que adems de permitir identificar de forma nica el recurso, nos permite localizarlo para poder acceder a l o compartir su ubicacin.
Una URL se estructura de la siguiente forma: {protocolo}://{dominio o hostname}[:puerto (opcional)]/{ruta del recurso}?{consulta de filtrado}
Existen varias reglas bsicas para ponerle nombre a la URI de un recurso: Los nombres de URI no deben implicar una accin, por lo tanto debe evitarse usar verbos en ellos. Deben ser nicas, no debemos tener ms de una URI para identificar un mismo recurso. Deben ser independiente de formato. Deben mantener una jerarqua lgica. Los filtrados de informacin de un recurso no se hacen en la URI.
Las URIs no deben implicar acciones y deben ser nicas: Por ejemplo, la URI /facturas/234/editar sera incorrecta ya que tenemos el verbo editar en la misma. Para el recurso factura con el identificador 234, la siguiente URI sera la correcta, independientemente de que vayamos a editarla, borrarla, consultarla o leer slo uno de de sus conceptos: /facturas/234 Las URIs deben ser independientes de formato: Por ejemplo, la URI /facturas/234.pdf no sera una URI correcta, ya que estamos indicando la extensin pdf en la misma. Para el recurso factura con el identificador 234, la siguiente URI sera la correcta, independientemente de que vayamos a consultarla en formato pdf, epub, txt, xml o json: /facturas/234 Las URIs deben mantener una jerarqua lgica: Por ejemplo, la URI /facturas/234/cliente/007 no sera una URI correcta, ya que no sigue una jerarqua lgica. Para el recurso factura con el identificador 234 del cliente 007, la siguiente URI sera la correcta: /clientes/007/facturas/234 Filtrados y otras operaciones: Para filtrar, ordenar, paginar o buscar informacin en un recurso, debemos hacer una consulta sobre la URI, utilizando parmetros HTTP en lugar de incluirlos en la misma. Por ejemplo, la URI /facturas/orden/desc/fecha-desde/2007/pagina/2 sera incorrecta ya que el recurso de listado de facturas sera el mismo pero utilizaramos una URI distinta para filtrarlo, ordenarlo o paginarlo. La URI correcta en este caso sera: /facturas?fecha-desde=2007&orden=DESC&pagina=2
Nivel 2: HTTP Para desarrollar APIs REST los aspectos claves que hay que dominar y tener claros son: Mtodos HTTP Cdigos de estado Aceptacin de tipos de contenido
Mtodos: Como hemos visto en el anterior nivel, a la hora de crear URIs no debemos poner verbos que impliquen accin, aunque queramos manipular el recurso. Para manipular los recursos, HTTP nos dota de los siguientes mtodos con los cuales debemos operar: GET: Para consultar y leer recursos POST: Para crear recursos PUT: Para editar recursos DELETE: Para eliminar recursos. PATCH: Para editar partes concretas de un recurso. Por ejemplo para un recurso de facturas. GET /facturas Nos permite acceder al listado de facturas POST /facturas Nos permite crear una factura nueva GET /facturas/123 Nos permite acceder al detalle de una factura PUT /facturas/123 Nos permite editar la factura, sustituyendo la totalidad de la informacin anterior por la nueva. DELETE /facturas/123 Nos permite eliminar la factura PATCH /facturas/123 Nos permite modificar cierta informacin de la factura, como el nmero o la fecha de la misma.
Cdigos de estado: Uno de los errores ms frecuentes a la hora de construir una API suele ser el reinventar la rueda creando nuestras propias herramientas en lugar de utilizar las que ya han sido creadas, pensadas y testadas. La rueda ms reinventada en el desarrollo de APIs son los cdigos de error y cdigos de estado.
Cuando realizamos una operacin, es vital saber si dicha operacin se ha realizado con xito o en caso contrario, por qu ha fallado. Un error comn sera por ejemplo:
En este ejemplo se devuelve un cdigo de estado 200, que significa que la peticin se ha realizado correctamente, sin embargo, estamos devolviendo en el cuerpo de la respuesta un error y no el recurso solicitado en la URL. Este es un error comn que tiene varios inconvenientes: No es REST ni es estndar. El cliente que acceda a este API debe conocer el funcionamiento especial y cmo tratar los errores de la misma, por lo que requiere un esfuerzo adicional importante para trabajar con nosotros. Tenemos que preocuparnos por mantener nuestros propios cdigos o mensajes de error, con todo lo que eso supone. HTTP tiene un abanico muy amplio que cubre todas las posibles indicaciones que vamos a tener que aadir en nuestras respuestas cuando las operaciones han ido bien o mal. Es imperativo conocerlos y saber cundo utilizarlos, independientemente de que desarrolles siguiendo REST. El siguiente ejemplo sera correcto de la siguiente forma:
Tipos y formatos de contenido: HTTP nos permite especificar en qu formato queremos recibir el recurso, pudiendo indicar varios en orden de preferencia, para ello utilizamos el header Accept. Nuestra API devolver el recurso en el primer formato disponible y, de no poder mostrar el recurso en ninguno de los formatos indicados por el cliente mediante el header Accept, devolver el cdigo de estado HTTP 406. En la respuesta, se devolver el header Content-Type, para que el cliente sepa qu formato se devuelve, por ejemplo:
En este caso, el cliente solicita la factura en un comprimido con ZIP y de no tenerlo, en pdf o json por orden de preferencia. El servidor le devuelve finalmente la factura en pdf.
Nivel 3: Hypermedia. Nos Permite conectar mediante vnculos las aplicaciones clientes con las APIs, permitiendo a dichos clientes despreocuparse por conocer de antemano del cmo acceder a los recursos.
Con Hypermedia bsicamente aadimos informacin extra al recurso sobre su conexin a otros recursos relacionados con l. Aqu tenemos un ejemplo:
En este ejemplo vemos cmo indicar en un xml que representa un pedido, el enlace al recurso de la factura relacionada con el mismo. Sin embargo, necesitamos que el cliente que accede a nuestra API entienda que esa informacin no es propia del recurso, sino que es informacin aadida que puede utilizar para enlazar el pedido con la factura. Para ello conseguir esto, debemos utilizar las cabeceras Accept y Content-Type, para que tanto el cliente como la API, sepan que estn hablando hypermedia. Por ejemplo:
Como vemos, el cliente solicita el formato application/nuestra_api+xml de forma preferente al formato text/xml. De esta forma, le indica al servicio web, que entiende su formato hypermedia y puede aprovecharlo.
El servicio web por lo tanto, como implementa hypermedia, le devuelve la informacin de recurso y la informacin de hypermedia que puede utilizar el cliente.
Hypermedia es til por ejemplo para que el cliente no tenga que conocer las URLs de los recursos, evitando tener que hacer mantenimientos en cada uno de los mismos si en un futuro dichas URLs cambian. Tambin es til para automatizar procesos entre APIs sin que haya interaccin humana.
API REST WebIOPi
La API REST incluida en WebIOPi le permite hacer su propio cliente, utilizando las llamadas REST HTTP. Usted puede usarlo para realizar varias tareas:
Get GPIO function Set GPIO function Get GPIO value Set GPIO value Output a single pulse Output bit sequence Output PWM with a duty cycle ratio Output PWM with an angle for servos Call a macro on the server Get full GPIO state/configuration
Los errores devueltos por el WebAPI son comprensibles cuando la llamada HTTP no es vlido:
400 Bad Request (path incomplete) 403 GPIO # Not Available 403 GPIO # Disabled 404 [something] Not Found
Get GPIO function HTTP GET /GPIO/(gpioNumber)/function Devuelve "in" o "out" Ejemplo: Para obtener la funcionalidad del GPIO 0: HTTP GET /GPIO/0/function
Set GPIO function HTTP POST /GPIO/(gpioNumber)/function/("in" o "out" o "pwm") Devoluciones de la nueva configuracin: "in" o "out" o "pwm" Ejemplo: Para establecer GPIO 0 como entrada: HTTP POST /GPIO/0/function/in Para establecer GPIO 1 como salida: HTTP POST /GPIO/1/function/out
Get GPIO value HTTP GET /GPIO/(gpioNumber)/value Devuelve 0 o 1 Ejemplo: Para obtener el valor de GPIO 0: HTTP GET /GPIO/0/value
Set GPIO value HTTP POST /GPIO/(gpioNumber)/value/(0 or 1) Devuelve el nuevo valor: 0 o 1 Ejemplo: Para poner un uno al GPIO 0: HTTP POST /GPIO/0/value/1 Para poner un cero al GPIO 1: HTTP POST /GPIO/1/value/0
Output a single pulse HTTP POST /GPIO/(gpioNumber)/pulse/ Devuelve el ltimo bit. Ejemplo: Para emitir un solo pulso en GPIO 0: HTTP POST /GPIO/0/pulse/
Output bit sequence HTTP POST /GPIO/(gpioNumber)/sequence/(delay),(sequence) Devuelve el ltimo bit Ejemplo: Para emitir un pulso en GPIO 0 con un retraso de 10ms: HTTP POST /GPIO/0/sequence/10,010
Output PWM with a duty cycle ratio HTTP POST /GPIO/(gpioNumber)/pulseRatio/(ratio) Devuelve un valor Ejemplo: Para emitir un PWM con una relacin de 50%: HTTP POST /GPIO/0/pulseRatio/0.5
Output PWM with an angle for servos HTTP POST /GPIO/(gpioNumber)/pulseAngle/(angle) Devuelve un valor Ejemplo: Para emitir un PWM con un ngulo de 0: HTTP POST /GPIO/0/pulseAngle/0
Call a macro on the server HTTP POST /macros/(macro)/(args) Devuelve el valor devuelto por la funcin macro.
Get full GPIO state/configuration HTTP GET /* Devuelve el estado de todo el GPIO en JSON: "UART0": 1, "I2C0": 0, "I2C1": 1, "SPI0": 0 significa que ambos UART0 y I2C1 estn habilitados, mientras que tanto I2C0 y SPI0 estn inactivos. As GPIOs utilizados por UART0 (14 y 15) y I2C1 (2 y 3) son inactivos y no utilizables.
libGPIO
Hoy da existe una librera creada especialmente para trabajar desde android con la WebIOPi, librera desarrollada por Mario Gmez, se encuentra empaquetada en un archivo .jar en el sitio oficial http://dev.teubi.co/downloads/. Esta librera cuenta con todas las funcionalidades de WebIOPi y su forma de comunicacin con la Raspberry Pi es a travs de la APIREST. Para entender el funcionamiento de esta librera es necesario conocer algunos conceptos entre los cuales el ms importante es JSON.
JSON JSON es un formato ligero de intercambio de datos que desde hace algn tiempo ha comenzado a usarse de una forma tan popular como se uso en su tiempo el XML. JSON es la abreviacin de JavaScript Object Notacin Notacin de Objetos de JavaScript El formato de JSON es ampliamente reconocido por una gran variedad de lenguajes como Java, PHP, JavaScript, C++, C# entre otros, la lista completa se puede consultar desde el sitio web de JSON. Y sirve para modelar y presentar datos, as que se puede combinar con todo tipo de aplicaciones.
La librera libGPIO hace uso de diferentes clases JSON en java y estn disponibles en el sitio web de JSON (www.json.org), entre ellas tenemos:
CDL: Esto proporciona mtodos estticos para convertir texto delimitado por comas en una lista JSONArray, y para convertir una lista JSONArray en texto delimitado por comas. Una lista es un formato muy popular para el intercambio de datos. Se entiende por la mayora de bases de datos, hojas de clculo, y programas de organizacin. Cookie: Convierte especificacin de cookies de un navegador web en un objeto JSON y viceversa. CookieList: Convierte una lista de cookies de un navegador web en un objeto JSON y viceversa. HTTP: Convierte un encabezado HTTP en un objeto JSON y viceversa. HTTPTokener: Extiende el JSONTokener para proporcionar mtodos adicionales para el anlisis de encabezados HTTP. JSONArray: Un JSONArray es una secuencia ordenada de valores. Su forma externa es una cadena envuelta entre corchetes con comas entre los valores. La forma interna es un objeto que tiene mtodos get () y opt () para acceder a los valores de ndice y put () para agregar o cambiar los valores. Los valores pueden ser cualquiera de los siguientes tipos: Boolean, JSONArray, JSONObject, nmeros y String , o un objeto JSONObject.NULL. JSONException: Se produce cuando se detecta un error de sintaxis o de procedimiento. JSONML: Esto proporciona mtodos estticos para convertir un texto XML en un JSONArray o JSONObject , y viceversa. JSONObject: Es una coleccin no ordenada de pares nombre/valor. Su forma externa es una cadena envuelta en llaves con dos puntos entre los nombres y los valores, y las comas entre los valores y nombres. La forma interna es un objeto que tiene mtodos get () y opt () para acceder a los valores por su nombre y put () para aadir o sustituir los valores por su nombre. Los valores pueden ser cualquiera de los siguientes tipos: Boolean, JSONArray, JSONObject, nmero y String, o la JSONObject.NULL. JSONString: Es una interfaz que permite a las clases implementar su serializacin JSON. JSONStringer: Es una herramienta para producir rpidamente texto JSON. JSONTokener: Toma una cadena de origen y extractos de personajes y fichas de la misma. Es utilizado por los constructores JsonObject y JSONArray para analizar cadenas de cdigo JSON. JSONWriter: Es una herramienta para la rpida escritura de texto JSON. XML: Esto proporciona mtodos estticos para convertir un texto XML en un JSONObject , y viceversa. XMLTokener: Se extiende la JSONTokener proporcionando mtodos adicionales para el anlisis de textos XML.
Por ltimo est la clase JSONParser que est disponible en el foro http://www.androidhive.info/. Esta clase se encarga de parsear lo escrito en JSON, es decir, analizar una secuencia de smbolos a fin de determinar su estructura gramatical con respecto a una gramtica formal dada. Normalmente es llamado anlisis de sintaxis. Un parseador (parser) es un programa de computacin que lleva a cabo esta tarea. En nuestro caso es una clase java. El parseo transforma una entrada de texto en una estructura de datos (usualmente un rbol) que es apropiada para ser procesada. Generalmente los parseadores primero identifican los smbolos de la entrada y luego construyen el rbol de parseo para esos smbolos. En otras palabras esta clase nos permite tomar los datos JSON y transformarlos en simples String para ser ledos desde cualquier API.
La librera libGPIO consta de cinco clases y 3 enum que facilitan la lectura y escritura de los estados del GPIO de la Raspberry Pi utilizando como puente el framework WebIOPi. Las clases son:
GPIO: Esta es la clase principal y en donde ocurre toda la transformacin y transferencia de datos utilizando los mtodos de la APIREST. GPIOPin: Permite la organizacin de los pines del GPIO dentro de la clase principal y el orden en que irn los mtodos que permite implementar cada pin. GPIOPort: Permite enumerar los pines del GPIO y colocar valores por defecto. GPIOPortChangeListener: Crea un interfaz para llamar un mtodo que permita actualizar la lectura de los pines del GPIO. GPIOStatus: Permite definir el uso de las funciones especiales de algunos pines del GPIO, como son UART, SPI, I2C.
Los enum son:
PORTFUNCTION: Permite definir las diferentes funciones que permiten los pines del GPIO, como son INPUT, OUTPUT, GND, PWM, entre otras. PORTVALUE: Permite definir los estados de cada pin del GPIO dependiendo de la funcin en que fue programado. RASPBERRYREV: Permite elegir la revisin de Raspberry Pi que estemos usando. Esto se hace necesario debido a que existen dos revisiones de la Raspberry y difieren en el orden de sus pines GPIO.
La clase principal GPIO Inicializa el objeto GPIO que le permite conectarse a WebIOPi. Este objeto proporciona una serie de funciones de utilidad que le ayudan a controlar WebIOPi mediante llamadas REST. Esta clase requiere de cuatro parmetros necesarios para iniciar la conexin: GPIO.ConnectionInfo(host, port, user, pass) Host: La IP de la Raspberry Pi. Port: El Puerto de conexin. (22 por defecto). User: El usuario para la conexin con WebIOPi. (webiopi por defecto). Pass: La contrasea para la conexin con WebIOPi. (raspberry por defecto).
GPIO implementa dos Interfaces: GPIO.ConnectionEventListener: que requiere el mtodo onConnectionFailed y permite determinar cundo se ha perdido la conexin con WebIOPi. GPIO.PortUpdateListener: que requiere el mtodo onPortUpdate y permite actualizar toda la informacin del estado del GPIO.
GPIO tiene los siguientes mtodos: addPortConnectionListener: Adjunta una nueva lista de Listeners. addPortUpdateListener: Aade la lista actualizada de Listeners a la conexin GPIO actual. getFunction: Devuelve la funcin de puerto actual. getPinmap: Devuelve la asignacin actual del GPIO. getPinNum: Devuelve el nmero fsico del pin menos uno. getValue: Devuelve el valor actual del puerto. isConnected: Devuelve un valor dependiendo si GPIO est conectado actualmente a WebIOPi. outputPulse: Enva un nico pulso al puerto GPIO especificado. outputPWMDutyCycle: Emite una seal PWM al puerto GPIO especificado mediante la relacin de ciclo de servicio especificado. outputPWMServoAngle: Da salida a una seal PWM al puerto GPIO especificado utilizando el ngulo del motor servo especificado. outputSequence: enva una secuencia de bits para el puerto GPIO especificado con el retardo especificado. removePortConnectionListener: Elimina el Listener en la conexin de la lista actual de Listeners de conexin. removePortUpdateListener: Elimina un detector de actualizacin de la lista actual de los Listeners actuales. run: Ejecuta la tarea principal GPIO. Est diseado para funcionar en segundo plano. setFunction: Cambia la funcin de puerto especificado. setPinmap: Fuerza el cambio de asignacin de pin actual. setValue: Cambia el valor en el puerto GPIO.
Se decidi hacerlo as porque se cuenta con la ventaja de poder acceder por web para controlar y observar el estado de los GPIO. Adems de esto WebIOPi facilita la opcin de querer hacer una aplicacin web propia que permita visualizar de forma especfica el proceso que se quiere controlar.
La Conexin SSH Desde Android
Bajo la tutora de Mario Gmez se ha implementado y empaquetado en un archivo .jar una librera a la cual llamamos AndroidSSH y es la que nos permitir establecer la conexin desde cualquier dispositivo android y un servidor que en nuestro caso es la Raspberry Pi. Esta librera hace uso de una de una biblioteca externa llamada JSch (Java Secure Channel).
JSch utiliza los conceptos de "sesin" y "canal", la sesin podemos decir que es nuestro medio seguro de comunicacin con el servidor remoto. El "canal" en cambio es una va de comunicacin que nos permite acceder a la funcionalidad en el host que deseamos acceder. Esta biblioteca incluye por defecto varios canales para realizar por ejemplo ejecucin de comandos remotos, consola remota, FTP seguro, conexiones TCP-IP, entre otras funciones. Toda la documentacin completa se encuentra en el sitio oficial.
La librera AndroidSSH funciona con expectativas sobre las salidas que generan los comandos en la consola. AndroidSSH consta de cuatro clases y un interface:
Expectation: Esta clase es la encargada de guardar las expectativas que esperamos en la consola. Expectator: Este es el interface, y es el encargado de sobreescribir dos mtodos, fulfill que ser llamado cada vez que una expectativa se cumpla y onFailed que es llamado cuando las expectativas no son cumplidas. Expected: Esta clase se encarga de implementar un ArrayList de expectativas en el caso de haber ms de una expectativa en nuestra comunicacin. InputStreamExpectation: Esta clase es la encargada de traducirle a android la lectura y escritura en la consola. SSHClient: Esta es la clase principal donde ocurre la comunicacin mediante la librera JSch. Esta clase implementa los siguientes mtodos: o fulfill: Para incluir las expectativas que esperamos se cumplan. o onFailed: Para mostrar el mensaje que queramos cuando no se cumple la expectativa. o getExpectations: Para leer las expectativas. o getExpectator: Para leer lo expectado. o queueCommand: Para enviar los comandos en la consola. o setExpectations: Para cargar la clase Expectation con un Array de expectativas. o setExpectator: Para definir el entorno. (Puede ser la clase principal o una clase auxiliar). o setWatchdogTimeout: Para definir el tiempo que espera en ms el programa para el cumplimiento de las expectativas. Una vez cumplido el tiempo, si la expectativa no se cumple ser llamado el mtodo onFailed. o run: Para iniciar el hilo de ejecucin. o cancel: Para detener el hilo de ejecucin.
Hilos de ejecucin en Android (Threads)
Cada vez que se lanza una nueva aplicacin en Android el sistema crea un nuevo proceso Linux para ella y la ejecuta en su propia mquina virtual Dalvik (Por supuesto si est programada en Java, si lo estuviera en cdigo nativo no hara falta la mquina virtual). Trabajar en procesos diferentes nos garantiza que desde una aplicacin no se pueda acceder a la memoria (cdigo o variables) de otras aplicaciones.
Los S.O. modernos incorporan el concepto de hilo de ejecucin (thread). En un sistema multihilo un proceso va a poder realizar varias tareas a la vez, cada una en un hilo diferente. Los diferentes hilos de un proceso lo comparten todo: variables, cdigo, permisos, ficheros abiertos, etc.
Cuando trabajamos con varios hilos, estos pueden acceder a las variables de forma simultnea. Hay que tener cuidado de que un hilo no modifique el valor de una variable mientras otro hilo est leyndola. Este problema se resuelve en Java definiendo secciones crticas mediante la palabra reservada synchronized.
Con cada proceso el sistema crea un nuevo hilo de ejecucin (thread) para esta aplicacin conocida como hilo principal. Este hilo es muy importante dado que se encarga de atender los eventos de los distintos componentes. Es decir, este hilo ejecuta los mtodos onCreate(), onDraw(), onKeyDown(). Por esta razn al hilo principal tambin se le conoce como hilo del interfaz de usuario.
El sistema no crea un hilo independiente cada vez que se crea un nuevo componente. Es decir, todas las actividades y servicios de una aplicacin son ejecutados por el hilo principal.
Cuando tu aplicacin ha de realizar trabajo intensivo como respuesta a una interaccin de usuario, hay que tener cuidado porque es posible que la aplicacin no responda de forma adecuada. Por ejemplo, si se desea descargar unos datos de Internet, si se hace en el hilo de ejecucin principal este quedar bloqueado a la espera de que termine la descarga. Por lo tanto, no se podr redibujar la vista (onDraw()) o atender eventos del usuario (onKeyDown()). Desde el punto de vista del usuario se tendr la impresin de que la aplicacin se ha colgado. Ms todava, si el hilo principal es bloqueado ms de cinco segundos (este tiempo esta establecido por defecto por los desarrolladores de Android), el sistema mostrar un cuadro de dialogo al usuario La aplicacin no responde para que el usuario decida si quieres esperar o detener la aplicacin.
La solucin en estos casos es crear un nuevo hilo de ejecucin, para que realice este trabajo intensivo. De esta forma no bloqueamos el hilo principal, que puede seguir atendiendo los eventos de usuario. Es decir, cuando se esta implementando un mtodo del hilo principal nunca se debe realizar una accin que pueda bloquear este hilo, como clculos largos o que requieran esperar mucho tiempo. En estos casos hay que crear un nuevo hilo de ejecucin y encomendarle esta tarea.
Las herramientas del interfaz de usuario de Android han sido diseadas para ser ejecutadas desde un nico hilo de ejecucin, el hilo principal. Por lo tanto no se permite manipular el interfaz de usuario desde otros hilos de ejecucin.
Existen principalmente dos alternativas a la hora de ejecutar tareas en segundo plano en Android:
Crear nosotros mismos de forma explcita un nuevo hilo para ejecutar nuestra tarea. Utilizar la clase auxiliar AsyncTask proporcionada por Android.
Para crea nosotros mismo el hilo de ejecucin basta con instanciar un objeto de la clase Thread. El constructor de la clase Thread recibe como parmetro un nuevo objeto Runnable que debemos construir implementando su mtodo run(), dentro del cual vamos a realizar nuestra tarea de larga duracin. Hecho esto, debemos llamar al mtodo start() del objeto Thread definido para comenzar la ejecucin de la tarea en segundo plano.
Los problemas con este tipo de escritura aparecen cuando nos damos cuenta que desde este hilo secundario que hemos creado no podemos hacer referencia directa a componentes que se ejecuten en el hilo principal, entre ellos los controles que forman nuestra interfaz de usuario, es decir, que desde el mtodo run() no podramos ir actualizando directamente una barra de progreso por ejemplo. Para solucionar esto, Android proporciona varias alternativas, entre ellas la utilizacin del mtodo post() para actuar sobre cada control de la interfaz, o la llamada al mtodo runOnUiThread() para enviar operaciones al hilo principal desde el hilo secundario. Ambas opciones requieren como parmetro un nuevo objeto Runnable del que nuevamente habr que implementar su mtodo run() donde se acte sobre los elementos de la interfaz. En la imagen se ve el mtodo post() para actuar sobre el control ProgressBar, y el mtodo runOnUiThread() para mostrar el mensaje toast.
Otra forma de hacerlo es mediante un controlador (handler), que es un objeto de la clase Handler. Un controlador reside en el hilo principal y puede recibir mensajes de otro hilo y ejecutar instrucciones en consecuencia, por ejemplo, escribir en pantalla.
Para enviar un mensaje a un controlador handler desde un hilo: Se obtiene el mensaje asociado al controlador: Message msg=handler.obtainMessage (); Se contruye un objeto de tipo Bundle para empaquetar los datos: Bundle b = new Bundle(); Insertamos los datos en el bundle mediante parejas (etiqueta, dato), por ejemplo para insertar un entero y una cadena en el bundle: b.putInt(etiqueta1, entero); b.putString(etiqueta 2, cadena); Finalmente se inserta el bundle en el mensaje y se enva al controlador: msg.setData(b); handler.sendMessage(msg);
En cuanto se enva un mensaje al controlador, el sistema ejecuta el mtodo handler.handleMessage() de la clase Handler, que se habr reecrito para aceptar el mensaje enviado y ejecutar otras instrucciones. Hay que definir el controlador handler en el hilo principal:
Para leer el contenido del mensaje se usa el mtodo msg.getData(), que extrae el objeto bundle, de donde podemos leer los datos usando getInt(etiqueta1) y getString(etiqueta2). En otras instrucciones podemos ejecutar otras tareas que se realizaran en el hilo principal.
AsyncTask. Consiste en crear una nueva clase que extienda de ella y sobrescribir varios de sus mtodos entre los que repartiremos la funcionalidad de nuestra tarea. Estos mtodos son los siguientes: onPreExecute(): Se ejecutar antes del cdigo principal de nuestra tarea. Se suele utilizar para preparar la ejecucin de la tarea, inicializar la interfaz, etc. doInBackground(): Contendr el cdigo principal de nuestra tarea. onProgressUpdate(): Se ejecutar cada vez que llamemos al mtodo publishProgress() desde el mtodo doInBackground(). onPostExecute(): Se ejecutar cuando finalice nuestra tarea, o dicho de otra forma, tras la finalizacin del mtodo doInBackground(). onCancelled(). Se ejecutar cuando se cancele la ejecucin de la tarea antes de su finalizacin normal.
Estos mtodos tienen una particularidad esencial que sern de nuestro inters. El mtodo doInBackground() se ejecuta en un hilo secundario (por tanto no podremos interactuar con la interfaz), pero sin embargo todos los dems se ejecutan en el hilo principal, lo que quiere decir que dentro de ellos podremos hacer referencia directa a nuestros controles de usuario para actualizar la interfaz.
Por su parte, dentro de doInBackground() tendremos la posibilidad de llamar peridicamente al mtodo publishProgress() para que automticamente desde el mtodo onProgressUpdate() se actualice la interfaz si es necesario. Al extender una nueva clase de AsyncTask indicaremos tres parmetros:
1. El tipo de datos que recibiremos como entrada de la tarea en el mtodo doInBackground(). 2. El tipo de datos con el que actualizaremos el progreso de la tarea, y que recibiremos como parmetro del mtodo onProgressUpdate() y que a su vez tendremos que incluir como parmetro del mtodo publishProgress(). 3. El tipo de datos que devolveremos como resultado de nuestra tarea, que ser el tipo de retorno del mtodo doInBackground() y el tipo del parmetro recibido en el mtodo onPostExecute().
Manejando la rotacin de pantalla en Android
Uno de los temas ms importantes que hay que conocer es cmo Android gestiona la rotacin de la interfaz de usuario dependiendo de la posicin que adquiera el telfono al rotarlo. La mayora de los telfonos de hoy en da son touch y se encuentran dotados por sensores como el acelermetro que nos permite saber cuando un telfono cambia entre los estados portrait (vertical) y landscape (horizontal).
Tambin debemos asegurarnos de que nuestras interfaces se visualizarn de una forma adecuada en cualquiera de estos dos estados.
Por default, cuando ocurre un cambio en la configuracin del telfono que repercute en la seleccin de los recursos en una aplicacin, Android destruye y reconstruye todas las actividades que se estn ejecutando o aquellas que se encontraban pausadas con el fin de prepararlas para el momento en el que el usuario interacte nuevamente con ellas. La rotacin es uno de estos escenarios ya que provoca que nuevos recursos de layout sean cargados con la finalidad de ofrecerle una vista ms cmoda al usuario segn la posicin del telfono que est utilizando en ese momento. Este cambio no se da solo a nivel visual, no hay que olvidar que el usuario pudo haber introducido datos en una pantalla o pudo haber estado enfocando algn tem a la mitad de un ListView o haber afectado cualquier otra variable; en estos casos, la rotacin de pantalla no tiene que truncar estas acciones y por el contrario, debemos hacer todo lo posible para que el usuario visualice esos mismos datos o ese mismo tem en la nueva vista que ha sido llamada.
En estos casos, resulta til el uso del mtodo onSaveInstanceState() que debemos implementar dentro de nuestra actividad y llenar el objeto Bundle suministrado como parmetro con la informacin suficiente para regresar a la nueva actividad al estado actual de la actividad cuya orientacin acaba de cambiar.
Posteriormente, con el mtodo onRestoreInstanceState() recuperamos toda esta informacin del objeto Bundle y la utilizamos para que la actividad se muestre con la informacin tal y como estaba en la actividad anterior.
Estos mtodos son tiles pero slo en el manejo de variables y layouts, pero a la hora de manejar hilos de ejecucin se har necesario utilizar otro mtodo para guardar el estado de dicho hilo (onRetainNonConfigurationInstance()) y posteriormente restaurarlo (getLastNonConfigurationInstance()) en la nueva configuracin. NOTA: Este mtodo est deprecated desde Honeycomb (versin android 3.0), desde esa versin lo recomendado es usar Fragments y, al cambiar la orientacin, reciclarlos (se indica en el onCreate de la Activity con la sentencia setRetainInstance(true);). Debido a que todava en el mercado hay mucho telfono android con Eclari (versin 2.1) haremos uso de este mtodo porque la app debe funcionar desde esta versin en adelante. En caso de no ser necesario que la app funcione en estas versiones de android se hace necesario, y adems es lo que se recomienda, hacer uso de los Fragments.
Estos mtodos (onRetainNonConfigurationInstance() y getLastNonConfigurationInstance()) tambin pueden guardar el valor de una variable de cualquier tipo, pero son principalmente usados para guardar hilos de ejecucin, y para su uso adecuado es necesario declarar un Object siendo esta la manera correcta de garantizar su funcionamiento.
JAVA
Es un lenguaje de programacin de propsito general, concurrente, orientado a objetos y basado en clases que fue diseado especficamente para tener tan pocas dependencias de implementacin como fuera posible. Su intencin es permitir que los desarrolladores de aplicaciones escriban el programa una vez y lo ejecuten en cualquier dispositivo (conocido en ingls como WORA, o "write once, run anywhere"), lo que quiere decir que el cdigo que es ejecutado en una plataforma no tiene que ser recompilado para correr en otra. Java es, a partir del 2012, uno de los lenguajes de programacin ms populares en uso, particularmente para aplicaciones de cliente-servidor de web.
La primera caracterstica, orientado a objetos (OO), se refiere a un mtodo de programacin y al diseo del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es disear el software de forma que los distintos tipos de datos que usen estn unidos a sus operaciones. As, los datos y el cdigo (funciones o mtodos) se combinan en entidades llamadas objetos. Un objeto puede verse como un paquete que contiene el comportamiento (el cdigo) y el estado (datos). El principio es separar aquello que cambia de las cosas que permanecen inalterables. Frecuentemente, cambiar una estructura de datos implica un cambio en el cdigo que opera sobre los mismos, o viceversa. Esta separacin en objetos coherentes e independientes ofrece una base ms estable para el diseo de un sistema software. El objetivo es hacer que grandes proyectos sean fciles de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el nmero de proyectos fallidos. Otra de las grandes promesas de la programacin orientada a objetos es la creacin de entidades ms genricas (objetos) que permitan la reutilizacin del software entre proyectos, una de las premisas fundamentales de la Ingeniera del Software.
Programacin Orientada a Objetos La orientacin a objetos es un paradigma de programacin que facilita la creacin de software de calidad por sus factores que potencian el mantenimiento, la extensin y la reutilizacin del software generado bajo este paradigma.
La programacin orientada a objetos trata de amoldarse al modo de pensar del hombre y no al de la mquina. Esto es posible gracias a la forma racional con la que se manejan las abstracciones que representan las entidades del dominio del problema, y a propiedades como la jerarqua o el encapsulamiento.
El elemento bsico de este paradigma no es la funcin (elemento bsico de la programacin estructurada), sino un ente denominado objeto. Un objeto es la representacin de un concepto para un programa, y contiene toda la informacin necesaria para abstraer dicho concepto: los datos que describen su estado y las operaciones que pueden modificar dicho estado, y determinan las capacidades del objeto.
Java incorpora el uso de la orientacin a objetos como uno de los pilares bsicos de su lenguaje.
Los objetos Podemos definir objeto como el "encapsulamiento de un conjunto de operaciones (mtodos) que pueden ser invocados externamente, y de un estado que recuerda el efecto de los servicios".
Un objeto adems de un estado interno, presenta una interfaz para poder interactuar con el exterior. Es por esto por lo que se dice que en la programacin orientada a objetos "se unen datos y procesos", y no como en su predecesora, la programacin estructurada, en la que estaban separados en forma de variables y funciones.
Un objeto consta de: Tiempo de vida: La duracin de un objeto en un programa siempre est limitada en el tiempo. La mayora de los objetos slo existen durante una parte de la ejecucin del programa. Los objetos son creados mediante un mecanismo denominado instanciacin, y cuando dejan de existir se dice que son destruidos. Estado: Todo objeto posee un estado, definido por sus atributos. Con l se definen las propiedades del objeto, y el estado en que se encuentra en un momento determinado de su existencia. Comportamiento: Todo objeto ha de presentar una interfaz, definida por sus mtodos, para que el resto de objetos que componen los programas puedan interactuar con l.
El equivalente de un objeto en el paradigma estructurado sera una variable. As mismo la instanciacin de objetos equivaldra a la declaracin de variables, y el tiempo de vida de un objeto al mbito de una variable.
Las clases Las clases son abstracciones que representan a un conjunto de objetos con un comportamiento e interfaz comn. Podemos definir una clase como "un conjunto de cosas (fsicas o abstractas) que tienen el mismo comportamiento y caractersticas... Es la implementacin de un tipo de objeto (considerando los objetos como instancias de las clases)".
Una clase no es ms que una plantilla para la creacin de objetos. Cuando se crea un objeto (instanciacin) se ha de especificar de qu clase es el objeto instanciado, para que el compilador comprenda las caractersticas del objeto.
Las clases presentan el estado de los objetos a los que representan mediante variables denominadas atributos. Cuando se instancia un objeto el compilador crea en la memoria dinmica un espacio para tantas variables como atributos tenga la clase a la que pertenece el objeto.
Los mtodos son las funciones mediante las que las clases representan el comportamiento de los objetos. En dichos mtodos se modifican los valores de los atributos del objeto, y representan las capacidades del objeto (en muchos textos se les denomina servicios).
Desde el punto de vista de la programacin estructurada, una clase se asemejara a un mdulo, los atributos a las variables globales de dicho mdulo, y los mtodos a las funciones del mdulo.
Modelo de objetos Existen una serie de principios fundamentales para comprender cmo se modeliza la realidad al crear un programa bajo el paradigma de la orientacin a objetos. Estos principios son: la abstraccin, el encapsulamiento, la modularidad, la jerarqua, el paso de mensajes y el poliforfismo.
a. Principio de Abstraccin Mediante la abstraccin la mente humana modeliza la realidad en forma de objetos. Para ello busca parecidos entre la realidad y la posible implementacin de objetos del programa que simulen el funcionamiento de losobjetos reales. Los seres humanos no pensamos en las cosas como un conjunto de cosas menores; por ejemplo, no vemos un cuerpo humano como un conjunto de clulas. Los humanos entendemos la realidad como objetos con comportamientos bien definidos. No necesitamos conocer los detalles de porqu ni cmo funcionan las cosas; simplemente solicitamos determinadas acciones en espera de una respuesta; cuando una persona desea desplazarse, su cuerpo le responde comenzando a caminar.
Pero la abstraccin humana se gestiona de una manera jerrquica, dividiendo sucesivamente sistemas complejos en conjuntos de subsistemas, para as entender ms fcilmente la realidad. Esta es la forma de pensar que la orientacin a objeto intenta cubrir.
b. Principio de Encapsulamiento El encapsulamiento permite a los objetos elegir qu informacin es publicada y qu informacin es ocultada al resto de los objetos. Para ello los objetos suelen presentar sus mtodos como interfaces pblicas y sus atributos como datos privados e inaccesibles desde otros objetos.
Para permitir que otros objetos consulten o modifiquen los atributos de los objetos, las clases suelen presentar mtodos de acceso. De esta manera el acceso a los datos de los objetos es controlado por el programador, evitando efectos laterales no deseados.
Con el encapsulado de los datos se consigue que las personas que utilicen un objeto slo tengan que comprender su interfaz, olvidndose de cmo est implementada, y en definitiva, reduciendo la complejidad de utilizacin.
c. Principio de Modularidad Mediante la modularidad, se propone al programador dividir su aplicacin en varios mdulos diferentes (ya sea en forma de clases, paquetes o bibliotecas), cada uno de ellos con un sentido propio.
Esta fragmentacin disminuye el grado de dificultad del problema al que da respuesta el programa, pues se afronta el problema como un conjunto de problemas de menor dificultad, adems de facilitar la comprensin del programa.
d. Principio de J erarqua La mayora de nosotros ve de manera natural nuestro mundo como objetos que se relacionan entre s de una manera jerrquica. Por ejemplo, un perro es un mamfero, y los mamferos son animales, y los animales seres vivos.
Del mismo modo, las distintas clases de un programa se organizan mediante la jerarqua. La representacin de dicha organizacin da lugar a los denominados rboles de herencia:
Mediante la herencia una clase hija puede tomar determinadas propiedades de una clase padre. As se simplifican los diseos y se evita la duplicacin de cdigo al no tener que volver a codificar mtodos ya implementados.
Al acto de tomar propiedades de una clase padre se denomina heredar.
e. Principio del Paso de Mensajes Mediante el denominado paso de mensajes, un objeto puede solicitar de otro objeto que realice una accin determinada o que modifique su estado. El paso de mensajes se suele implementar como llamadas a los mtodos de otros objetos.
Desde el punto de vista de la programacin estructurada, esto correspondera con la llamada a funciones.
f. Principio de Polimorfismo Polimorfismo quiere decir "un objeto y muchas formas". Esta propiedad permite que un objeto presente diferentes comportamientos en funcin del contexto en que se encuentre. Por ejemplo un mtodo puede presentar diferentes implementaciones en funcin de los argumentos que recibe, recibir diferentes nmeros de parmetros para realizar una misma operacin, y realizar diferentes acciones dependiendo del nivel de abstraccin en que sea llamado.
Relaciones entre objetos Durante la ejecucin de un programa, los diversos objetos que lo componen han de interactuar entre s para lograr una serie de objetivos comunes.
Existen varios tipos de relaciones que pueden unir a los diferentes objetos, pero entre ellas destacan las relaciones de: asociacin, todo/parte, y generalizacin/especializacin.
a. Relaciones de Asociacin Seran relaciones generales, en las que un objeto realiza llamadas a los servicios (mtodos) de otro, interactuando de esta forma con l. Representan las relaciones con menos riqueza semntica.
b. Relaciones de Todo/Parte Muchas veces una determinada entidad existe como conjuncin de otras entidades, como un conglomerado de ellas. La orientacin al objeto recoge este tipo de relaciones como dos conceptos; la agregacin y la composicin.
En este tipo de relaciones un objeto componente se integra en un objeto compuesto. La diferencia entre agregacin y composicin es que mientras que la composicin se entiende que dura durante toda la vida del objeto componedor, en la agregacin no tiene por qu ser as.
Esto se puede implementar como un objeto (objeto compuesto) que cuenta entre sus atributos con otro objeto distinto (objeto componente).
c. Relaciones de Generalizacin/Especializacin A veces sucede que dos clases tiene muchas de sus partes en comn, lo que normalmente se abstrae en la creacin de una tercera clase (padre de las dos) que rene todas sus caractersticas comunes.
El ejemplo ms extendido de este tipo de relaciones es la herencia, propiedad por la que una clase (clase hija) recoge aquellos mtodos y atributos que una segunda clase (clase padre) ha especificado como "heredables".
Este tipo de relaciones es caracterstico de la programacin orientada a objetos.
En realidad, la generalizacin y la especializacin son diferentes perspectivas del mismo concepto, la generalizacin es una perspectiva ascendente (bottom-up), mientras que la especializacin es una perspectiva descendente (top-down).
Cortés, Vicenta . (1986). La escritura y lo escrito. Paleografía y diplomática de España y América en los siglos XVI y XVII. Madrid: Ediciones Cultura Hispánica Instituto de Cooperación Iberoamericana, pp. 1-59