Вы находитесь на странице: 1из 51

RASPBERRY PI

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).

Вам также может понравиться