Vous êtes sur la page 1sur 162

ESCUELA POLITCNICA SUPERIOR UNIVERSIDAD CARLOS III DE MADRID

INGENIERA DE TELECOMUNICACIN

PROYECTO FIN DE CARRERA

TTULO: DISEO Y DESARROLLO DE UN SISTEMA DE VDEO-VIGILANCIA BASADO EN TECNOLOGA ANDROID

Autor: Ivn Alejandro Fernndez Pacheco Tutora: Iria Estvez Ayres

Junio de 2010

A mis padres, a mi hermana y a ngela, sin cuyo apoyo no habra podido sacarlo adelante.

Resumen En la actualidad, la seguridad se est convirtiendo en uno de los ejes fundamentales de la sociedad. El aumento de la violencia y la inseguridad hace que cada vez se invierta ms en este sector, investigando y desarrollando nuevos productos, cuyo n ltimo es prevenir y atajar dichas situaciones. Por otra parte, en este momento los smartphones, en concreto aquellos que soportan el sistema operativo de Google, Android, proporcionan funcionalidades antes impensables en los telfonos mviles, soportando, por ejemplo, la transmisin y recepcin de vdeo. As, el objetivo del proyecto que aqu se presenta es incluir de forma provechosa y sencilla dichos dispositivos en un sistema de videovigilancia, de tal manera que dichos smartphones puedan ser usados para visionar las cmaras del sistema o vdeos de vigilancia previamente guardados en el mismo, sin necesidad de estar en el centro de control de vigilancia, tradicionalmente el punto donde se muestra toda la informacin del sistema, para tal n. En este proyecto, en primer lugar, se ha diseado la estructura que debe tener un sistema de estas caractersticas, que contar con cmaras, servidores de transmisin de vdeo y unidades de almacenamiento de datos, adems de los dispositivos Android, as como el esquema de interaccin de los mismos. Adems, se ha implementado un prototipo de sistema para probar la viabilidad de la idea.

Abstract Today, security is becoming one of the cornerstones of society. Increased violence and insecurity makes increasingly more investment in this sector, researching and developing new products, whose ultimate goal is prevent and avoid such situations. Moreover, at this moment smartphones, specically those that support Googles operating system, Android, provide features previously unthinkable in mobile phones, supporting, for example, video transmission and reception. Thus, the aim of the project presented here is so helpful and include such simple devices in a video surveillance system, so that these smartphones can be used for viewing the cameras video surveillance system or previously stored therein, without being in the surveillance control center, traditionally the point where it shows all system information, for this purpose. In this project, rstly, we designed the structure must have a system of this kind, which will cameras, video streaming servers and data storage units, as well as Android devices as well as the scheme of interaction between them. In addition, we have implemented a prototype system to test the feasibility of the idea.

Contenidos
1. Introduccin 2. Estado del arte 2.1. Android O.S. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Caracterstiscas generales . . . . . . . . . . . . . . . . . . . . 2.1.2. Arquitectura de Android . . . . . . . . . . . . . . . . . . . . . 2.1.3. Anatoma de una aplicacin . . . . . . . . . . . . . . . . . . . 2.1.4. Herramientas de desarrollo . . . . . . . . . . . . . . . . . . . . 2.1.5. Modelo de aplicaciones de Android: aplicaciones, tareas, procesos e hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.6. Ciclo de vida de una aplicacin . . . . . . . . . . . . . . . . . 2.1.7. Implementar una interfaz de usuario . . . . . . . . . . . . . . 2.1.8. Bloques de Android . . . . . . . . . . . . . . . . . . . . . . . 2.1.9. Almacenaje, recuperacin, y presentacin de datos . . . . . . 2.1.10. Modelo de seguridad . . . . . . . . . . . . . . . . . . . . . . . 2.1.11. Creacin y manipulacin de hilos . . . . . . . . . . . . . . . . 2.1.12. APIs opcionales . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. RTSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1. Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2. Peticiones RTSP . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.3. Sesin RTSP: . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1. Caractersticas generales . . . . . . . . . . . . . . . . . . . . . 2.3.2. Quin hace Motion? . . . . . . . . . . . . . . . . . . . . . . . 2.3.3. Notas sobre el funcionamiento . . . . . . . . . . . . . . . . . . 2.3.4. Cmaras de red . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.5. Control remoto va http . . . . . . . . . . . . . . . . . . . . . 2.4. Darwin Stream Server . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4.1. Streaming en directo vs Streaming bajo demanda . . . . . . . 2.4.2. Cmo funciona el Streaming? . . . . . . . . . . . . . . . . . 2.4.3. Multicast vs Unicast . . . . . . . . . . . . . . . . . . . . . . . 2.4.4. Streaming de contenidos multimedia . . . . . . . . . . . . . . 2.5. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii 1 5 . 5 . 6 . 8 . 10 . 12 . . . . . . . . . . . . . . . . . . . . . . . . 15 16 17 20 23 23 25 27 27 30 31 34 35 35 36 36 37 37 37 39 40 41 42 42

iv

CONTENIDOS

3. Desarrollo del sistema 3.1. Diseo del sistema . . . . . . . . . . . . . . . . . . . . . . 3.1.1. Requisitos . . . . . . . . . . . . . . . . . . . . . . . 3.1.2. Arquitectura servidor . . . . . . . . . . . . . . . . 3.1.3. Funciones del programa . . . . . . . . . . . . . . . 3.1.4. Funcionamiento de la aplicacin . . . . . . . . . . . 3.1.5. Seguridad . . . . . . . . . . . . . . . . . . . . . . . 3.1.6. Planteamiento del problema . . . . . . . . . . . . . 3.2. Decisiones de implementacin . . . . . . . . . . . . . . . . 3.3. Implementacin . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1. Lenguaje de programacin y entorno de desarrollo 3.3.2. El entorno de desarrollo . . . . . . . . . . . . . . . 3.3.3. Diagramas de ujo . . . . . . . . . . . . . . . . . . 3.3.4. Diagramas de clases . . . . . . . . . . . . . . . . . 3.4. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

45 45 46 46 47 48 49 49 50 51 52 52 53 57 59

4. Pruebas y resultados 61 4.1. Entorno de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.2. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.3. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5. Conclusiones y lneas futuras 69 5.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5.2. Lneas futuras de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . 70 6. Presupuesto 71 6.1. Descomposicin de actividades . . . . . . . . . . . . . . . . . . . . . . 71 6.2. Resumen y duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 6.3. Presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 A. Breve demostracin de ejecucin B. Anlisis del API de Android C. Cdigo C.1. Gestor . C.2. Servidor C.3. Web . . C.4. Rtsp . . C.5. Registro C.6. Ficheros 77 83 97 97 112 123 126 135 138

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

ndice de guras
2.1. Arquitectura de Android [3] . . . . . . . 2.2. Algunas ejecuciones . . . . . . . . . . . . 2.3. Hierarchy Viewer de Hello android [3] . 2.4. Hierarchy Viewer de Men [3] . . . . . . 2.5. Draw nine patch[3] . . . . . . . . . . . . 2.6. Nivel de prioridad . . . . . . . . . . . . 2.7. rbol de view y viewgroup nodos [3] . . 2.8. Posiciones relativas de los nodos hijo [3] 2.9. Ciclo de vida de Activity [3] . . . . . . . 2.10. DDMS [3] . . . . . . . . . . . . . . . . . 2.11. Ejemplo de streaming con RTSP [16] . . 2.12. Pila de protocolos [17] . . . . . . . . . . 2.13. RTSP UDP [10] . . . . . . . . . . . . . . 2.14. Diagrama de estados de RTSP [16] . . . 2.15. Live streaming [9] . . . . . . . . . . . . . 2.16. Multicast [9] . . . . . . . . . . . . . . . . 2.17. Unicast [9] . . . . . . . . . . . . . . . . . 2.18. Retransmisin en vivo [9] . . . . . . . . 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. Arquitectura Diagrama de Diagrama de Diagrama de Diagrama de Diagrama de Diagrama de Ejecuciones Ejecuciones Ejecuciones Ejecuciones Ejecuciones Ejecuciones Ejecuciones Ejecuciones del sistema . . . . . . . . casos de uso . . . . . . . ujo de la clase Gestor . ujo de la clase Servidor ujo de la clase Web . . ujo de la clase Vdeo . . clases de la aplicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 12 13 13 14 16 18 19 21 26 28 29 30 34 40 41 42 42 47 49 54 55 56 56 58 63 63 64 64 65 65 66 66

vi

NDICE DE FIGURAS

4.9. Tiempo de comienzo del streaming . . . . . . . . . . . . . . . . . . . . 67 4.10. Tiempo total de streaming . . . . . . . . . . . . . . . . . . . . . . . . . 68 A.1. Ejecucin del Hello android . . . . . . A.2. Cdigo XML . . . . . . . . . . . . . . A.3. Ejecucin de un ejemplo sencillo . . . A.4. Cdigo XML . . . . . . . . . . . . . . A.5. Cdigo XML . . . . . . . . . . . . . . A.6. Ejecucin del men . . . . . . . . . . . A.7. Cdigo del men . . . . . . . . . . . . A.8. Manejador de eventos . . . . . . . . . A.9. Cdigo para la funcionalidad del men A.10.Algunas ejecuciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 78 78 79 79 80 80 81 81 82

ndice de cuadros
4.1. Ficheros de video de prueba . . . . . . . . . . . . . . . . . . . . . . . . 62 4.2. Vericacin de la funcionalidad general . . . . . . . . . . . . . . . . . . 62 6.1. 6.2. 6.3. 6.4. Tabla de tareas . . . . . Costes directos personal Costes equipos . . . . . Costes total . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 74 74 74

vii

Lista de acrnimos
AAC (Advanced Audio Coding) ADB (Android Debug Bridge) ALSA (Advanced Linux Sound Architecture) AP I (Application Programmmig Interface)

ARM (Advanced Risc Machine) AW T (Abstract Window Toolkit) CP U (Central Processing Unit) CV S (Concurrent Version System) DDM S (Dalvik Debug Monitor Service) DSA (Digital Signature Algorithm) DSS (Darwin Stream Server) EDGE (Enhanced Data rates for GSM of Evolution) F IF O (First In First Out) GEF (Graphic Editing Framework) GIF (Graphics Interchange Format)

GP L (General Public License) GP S (Global Positioning System) GSM (Global System for Mobile Communications) GU I (Graphical User Interface)

HT M L (HyperText Markup Language) HT T P (HyperText Transfer Protocol) IDE (Integrated Development Environment) ix

Lista de acrnimos

IP

(Internet Protocol)

JDK (Java Development Kit) JDT (Java Development Tools)

JP EG (Joint Photographic Experts Group) JV M (Java Virtual Machine) LED (Light Emitting Diode) LRU (Least Recently Used) M M U (Memory Management Unit) M P EG (Moving Picture Experts Group) N P T L (Native POSIX Thread Library) PC (Personal Computer)

P DA (Personal Digital Assistant) P N G (Portable Network Graphics) QoS (Quality of Service)

RAM (Random Access Memory) RDP (Radio Data Packet) RIM (Research In Motion) RP C (Remote Procedure Call) RSA (Rivest, Shamir and Adleman) RT CP (Real Time Transport Control Protocol ) RT P (Real-Time Transport Protocol) RT SP (Real Time Streaming Protocol) SD (Secure Digital)

SDK (Software Development Kit) SM P T E (Society of Motion Picture and Television Engineers) SM S (Short Message Service) SO (Sistema Operativo)

SQL (Structured Query Language)

Lista de acrnimos

xi

SSL

(Secure Sockets Layer)

SW T (Software Widget Toolkit) T CP (Transmission Control Protocol) T LS (Transport Layer Security)

U DP (User Datagram Protocol) UI (User Interface)

U M L (Unied Modeling Language) U RI (Uniform Resource Identier)

U RL (Uniform Resource Locator) W Y SIW Y G (What You See Is What You Get) XM L (Extensible Markup Language) XM P P (Extensible Messaging and Presence Protocol)

Captulo 1

Introduccin
A pesar de que en francs la palabra vigilancia signica literalmente mirar por encima, el trmino es usualmente utilizado para toda forma de observacin o monitorizacin, no slo la observacin visual. Es la monitorizacin del comportamiento, de personas, objetos o procesos dentro de sistemas para la conformidad de normas esperadas o deseadas en sistemas conables para control de seguridad o social. Esta observacin desde una posicin de autoridad puede ser encubierta (sin su conocimiento) o maniesta (tal vez con el frecuente recordatorio del estilo te estamos vigilando). La vigilancia ha sido una parte de la historia humana al que la tecnologa moderna le ha dado un nuevo campo de operaciones. Para la vigilancia en muchas ciudades modernas y edicios se suelen emplear circuitos cerrados de televisin. Si bien la vigilancia puede ser una herramienta til para las fuerzas y empresas de seguridad, mucha gente se muestra preocupada por el tema de la prdida de privacidad. De un tiempo a esta parte, se ha podido presenciar un aumento de las medidas de seguridad en muchos mbitos de la vida. El aumento de la violencia, atentados atroces y la bsqueda del bienestar, han sido las razones principales esgrimidas para desarrollar nuevas tecnologas de vigilancia que nos permitan vivir en un mundo ms seguro. Aprovechando estas circunstancias, se ha decidido realizar este proyecto en el que se implementa una pequea aplicacin que permite tener un sistema de videovigilancia para entornos mviles, sin la necesidad de disponer para ello de una central de pantallas en las que el vigilante tenga que estar observando las distintas cmaras de seguridad. De esta forma, se consigue que el vigilante de seguridad que est haciendo la ronda o no se encuentra en el puesto de control por cualquier motivo, pueda seguir viendo lo que est ocurriendo, independientemente de su emplazamiento. Para ello, se ha empleado el S.O. libre de Android, presentando el 5 de Noviembre de 2007 por Google junto con la fundacin Open Handset Alliance, un consorcio de 48 compaas de hardware, software y telecomunicaciones comprometidas con la promocin de estndares abiertos para dispositivos mviles [4]. Al ser un sistema operativo libre y estar basado en un kernel de Linux, cualquiera puede realizar sus 1

CAPTULO 1. INTRODUCCIN

aplicaciones e instalarla en dispositivos mviles. En el proyecto que aqu se presenta, el mayor problema para implementar este sistema consiste en lograr la monitorizacin de las cmaras a travs del dispositivo mvil. Para ello es necesario tener acceso a una red que nos proporcione unas capacidades que nos permitan ver las imgenes de forma uida y que las cmaras IP emitan en Streaming. Adems, la imagen no debe aparecer en applets ya que el dispositivo es limitado y debido a sus condiciones de origen de diseo, al menos en la versin actual, no los soporta. El funcionamiento, de modo muy resumido, sera el siguiente: el/los vigilante/s, nmero variable dependiendo de la extensin a vigilar, llevan consigo un dispositivo mvil con el S.O. Android y la aplicacin de videovigilancia instalada. Estos, en un momento dado, pueden consultar el estado del recinto, sin ms que visionar las cmaras a travs de su terminal mvil, pudindolas manejar mediante el joystick del aparato (esta opcin dependera de la versin de la aplicacin y de si las cmaras proporcionan un API para lograr su manejo), hacer zoom, etc. Otra opcin sera que, llevando el aparato guardado en el bolsillo, las cmaras detectasen movimiento (esta opcin de momento tampoco est soportada ya que las cmaras utilizadas no proporcionan dicha capacidad). En ese instante, el terminal avisara al vigilante (como si un SMS llegase a nuestro telfono mvil), de forma que alerte al personal de seguridad de una intrusin en el recinto. El vigilante recibira una foto de la cmara que ha detectado movimiento, as como su localizacin para poder dirigirse a esa zona. De esta forma, el vigilante puede comprobar que no ha sido una falsa alarma, sin mas que vericar dicha imagen. En resumen, los objetivos principales del proyecto son: Congurar un sistema de vigilancia. Dar de alta tanto cmaras IP como servidores de streaming. Monitorizacin de las cmaras en un dispositivo con Android. Acceso al historial de grabacin de las cmaras de seguridad. Para alcanzarlos, el proyecto se estructura de la siguiente forma: en el captulo de Estado del arte se realiza un anlisis somero de Android, el nuevo sistema operativo que ha desarrollado Google para telfonos mviles. Se estudia su arquitectura, sus caractersticas principales, las herramientas que proporciona, como disear su interfaz grca, el ciclo de vida que siguen sus actividades, los mecanismos de seguridad que proporciona, etc. Posteriormente se analiza el servidor de vdeo Darwin Stream Server, estudiando sus caractersticas principales as como las funcionalidades que ofrece. Para nalizar este captulo se estudia el programa Motion, el cual permite analizar el vdeo que

nos proporciona las cmaras IP de seguridad. Una vez nalizada la exposicin de estas tres herramientas, en el captulo Desarrollo del sistema se presenta el diseo de la aplicacin, analizando las pruebas hechas para obtener las conclusiones pertinentes en el captulo de Pruebas y resultados, y para nalizar se presentan las posibles lneas futuras para este proyecto en el captulo Conclusiones y lneas futuras.

Captulo 2

Estado del arte


En este captulo se realiza el anlisis Android, estudiando sus distintos componentes y posibilidades. En segundo lugar se estudia Motion, un software libre para analizar el vdeo proporcionado por las cmaras. Y por ltimo el Darwin Stream Server, para realizar el streaming del vdeo grabado al dispositivo mvil.

2.1.

Android O.S.

Google Inc. es la empresa propietaria de la marca Google, cuyo principal producto es el motor de bsqueda del mismo nombre. Aunque su principal producto es el buscador, la empresa ofrece tambin entre otros servicios: un comparador de precios llamado Google Product Search (antes conocido como Froogle), un motor de bsqueda para material almacenado en discos locales (Google Desktop Search), un servicio de correo electrnico llamado Gmail, su mapamundi en 3D Google Earth o un servicio de mensajera instantnea basado en Jabber/XMPP llamado Google Talk. Tambin ha entrado de lleno en el terreno de telefona mvil, el cual viene de la mano del sistema operativo Android, el cual es la base fundamental de este documento [13]. Una de las ideas con las que se ha desarrollado Android, es la de competir con el iPhone de Apple y el Blackberry de RIM (Research In Motion). La presentacin de la plataforma Android, que se realiz el 5 de noviembre de 2007, se hizo sobre el G1 de T-Mobile, junto con la fundacin Open Handset Alliance, un consorcio de 48 compaas de hardware, software y telecomunicaciones comprometidas con la promocin de estndares abiertos para dispositivos mviles. Se concibi como un sistema operativo orientado a dispositivos mviles basado en una versin modicada del ncleo Linux. Inicialmente fue desarrollado por Android Inc., compaa que fue comprada despus por Google, y en la actualidad lo desarrollan los miembros de la Open Handset Alliance (liderada por Google) [14]. Android es una plataforma de programacin de software para dispositivos mviles que incluye un sistema operativo, middleware y distintas aplicaciones. Google 5

CAPTULO 2. ESTADO DEL ARTE

proporciona el SDK de Android, que provee las herramientas y APIs necesarios para comenzar a desarrollar aplicaciones en esta plataforma, utilizando Java como lenguaje de programacin, ejecutndose sobre Dalvik, una mquina virtual propia diseada para uso embarcado que se ejecuta sobre un kernel de Linux. Para empezar a programar en Android es importante tener conocimientos de Java, as como de programacin orientada a objetos. Se puede programar en cualquier plataforma: Windows, MAC o Linux. Para ello hay que descargar el Android SDK, que consta de todas las bibliotecas Java que utiliza Android, el emulador para poder probar las aplicaciones que realizas y multitud de aplicaciones que vienen ya desarrolladas por Google y que seguramente implementen los telfonos mviles de fbrica que salgan con Android. Desde el punto de vista del desarrollo de aplicaciones, Google proporciona APIs fciles de utilizar gracias a la documentacin, y los cdigos de ejemplo. La idea de Google es que los desarrolladores puedan ayudar a mejorar el sistema, compartiendo ideas y sus desarrollos. Adems de Java se utiliza XML para la parte visual, otro lenguaje descriptivo muy fcil de utilizar y que aporta sencillez a la hora de programar en Android. Google trabaja en la comunicacin entre las distintas aplicaciones, compartiendo capacidades de bsqueda. Por ejemplo, si estamos en el reproductor de msica, desde l, poder acceder al navegador o a YouTube, para buscar informacin del artista, ms msica, o incluso videos musicales. Tambin ofrece varias formas de acceder a las bsquedas en el nuevo sistema operativo. Cada aplicacin susceptible de bsquedas incluye un men para las mismas. Uno de los ms problemas ms llamativos es la imposibilidad de ejecutar las aplicaciones desde la tarjeta SD de ampliacin de memoria, algo que otros sistemas operativos mviles, desde Palm OS hasta Windows Mobile pasando por Symbian, s permiten (el iPhone no se sabe, puesto que no admite tarjetas de memoria) [6]. Por otra parte, Google implementa un deshabilitador de aplicaciones remoto en Android. Al igual que hizo Apple al reconocer que podra deshabilitar aplicaciones del iPhone de forma remota, Google ha admitido lo mismo. La razn que esgrime es la defensa del usuario ante programas malintencionados o poco seguros. Esto se puede ver como una defensa para el usuario, pero a la vez un punto aco al limitar el uso del terminal y dar demasiados privilegios a Google [6].

2.1.1.

Caracterstiscas generales

Android no diferencia entre las aplicaciones bsicas del telfono y las aplicaciones desarrolladas por terceros. Proporciona un amplio espectro de aplicaciones y servicios. Con los dispositivos construidos en la plataforma Android, los usuarios pueden personalizar completamente el telfono. Pueden intercambiar pantalla de inicio del telfono, el estilo del marcador, o cualquiera de las aplicaciones.

2.1. Android O.S.

Adems, proporciona acceso a una amplia gama de bibliotecas y herramientas que pueden usarse para desarrollar aplicaciones. Por ejemplo, Android permite a los desarrolladores obtener la ubicacin del dispositivo y que los dispositivos se comuniquen entre s permitiendo aplicaciones sociales. Tambin incluye un conjunto completo de herramientas que se han construido desde el inicio junto a la plataforma. Algunas de sus caractersticas principales son [3]: Framework de aplicaciones: permite la reutilizacin y reemplazo de los componentes. Proporciona un alto grado de personalizacin por parte del usuario.

Mquina virtual Dalvik: optimizada para dispositivos mviles. Posee una funcionamiento de llamadas de instancias muy similar a al de Java.

Navegador integrado: basado en el motor open source WebKit. Se le pueden aadir caractersticas adicionales en funcin de las necesidades del desarrollador.

Grcos optimizados con una librera de grcos 2D; los grcos 3D estn basados en la especicacin OpenGL ES 1.0 (aceleracin de hardware opcional).

SQLite Base de datos para almacenamiento estructurado que se integra directamente con las aplicaciones.

Soporte para medios con varios formatos comunes de audio, video e imgenes planas (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF).

Telefona GSM (dependiente del hardware ).

Dependiendo del hardware puede soportar distintos protocolos de comunicaciones entre dispositivos y con acceso a la red como Bluetooth, EDGE, 3G, y WiFi.

Dependiendo del hardware puede incluir distintas caractersticas para el ocio como pueden ser la cmara, GPS, brjula, y acelermetro.

Amplio ambiente de desarrollo incluyendo un emulador de dispositivo, herramientas para depuracin, perles de memoria y de ejecucin, y un plugin para el IDE Eclipse.

CAPTULO 2. ESTADO DEL ARTE

2.1.2.

Arquitectura de Android

La arquitectura del sistema operativo de Android, la cual se muestra en la gura 2.1, consta de aplicaciones, marco de aplicaciones, bibliotecas, runtime de Android y su ncleo. Est construida desde el kernel hacia las capas superiores [3].

Figura 2.1: Arquitectura de Android [3] Aplicaciones: Las aplicaciones base incluyen un cliente de email, programa de SMS, calendario, mapas, navegador, contactos... entre otros. Todas las aplicaciones estn escritas en el lenguaje de programacin Java. Marco de aplicaciones: Los desarrolladores de aplicaciones tienen acceso completo a las mismas APIs del framework usados por las aplicaciones base. La arquitectura est diseada para simplicar la reutilizacin de componentes; cualquier aplicacin puede hacer pblicas sus capacidades y cualquier otra aplicacin puede luego hacer uso de ellas (sujeto a reglas de seguridad del framework ). Este mismo mecanismo permite que los componentes sean reemplazados por el usuario. Bibliotecas: Android incluye un conjunto de bibliotecas C/C++ usadas por varios componentes del sistema Android. Estas capacidades se exponen a los desarrolladores a travs del framework de aplicaciones de Android. Algunas son: System C library (implementacin biblioteca C standard), bibliotecas de medios,

2.1. Android O.S.

bibliotecas de grcos, 3d, SQLite, entre otras. Runtime de Android: se incluye un conjunto de bibliotecas base que proporcionan la mayor parte de las funcionalidades disponibles en las bibliotecas de Java. Cada aplicacin Android tiene su propio proceso, con su propia instancia de la mquina virtual Dalvik. Ha sido implementado de forma que un dispositivo puede ejecutar mltiples mquinas virtuales de forma eciente. Est optimizado para hacer un uso de memoria mnimo. La Mquina Virtual est basada en registros, y ejecuta clases compiladas por el compilador de Java que han sido transformadas al formato .dex por la herramienta incluida dx. Ncleo - Linux: depende de un Linux versin 2.6 para los servicios base del sistema, como seguridad, gestin de memoria, gestin de procesos, pila de red, y modelo de drivers. El ncleo tambin acta como una capa de abstraccin entre el hardware y el resto de la pila de software. Notas sobre Linux para sistemas embarcados Uno de los cambios fundamentales en Linux para la versin 2.6 viene de la aceptacin e inclusin de gran parte del proyecto uClinux (Linux para Microcontroladores) en el kernel principal. Esta variante de Linux ha sido un pilar fundamental para su aceptacin en el mercado embarcado (embedded ), y su inclusin en la versin ocial debera aumentar an ms el desarrollo en este campo. En los sistemas embarcados no se tienen todas las capacidades del kernel, debido a limitaciones de hardware. La principal diferencia en estas variantes es la ausencia de MMU (Memory Management Unit o Unidad de Gestin de Memoria, lo que hace que un sistema operativo pueda trabajar en modo protegido) embebido en el procesador. Aunque suelen ser sistemas Linux multitarea, no tienen proteccin de memoria ni otras caractersticas asociadas. Sin proteccin de memoria, es posible que un proceso lea los datos de otros procesos, o incluso que los haga colgarse. Esto reduce su utilidad en un sistema multi-usuario, pero los hace ideales para una agenda electrnica (PDA: Personal Digital Assistant o Asistente Digital Personal) de bajo coste o un dispositivo dedicado [7]. Adems de soporte para hardware, hay tambin mejoras importantes resultantes de la inclusin de sistemas integrados en el kernel principal. Mientras que la mayora de ellas no son visibles, la robustez general del sistema operativo se ve mejorada por cambios como la capacidad de construir un sistema completo sin soporte de SWAP (proceso de intercambio de un proceso de memoria fsica a disco duro) [7]. Otra prioridad de la nueva versin ha sido hacer que el sistema tenga una respuesta ms gil: no slo es til para el usuario nal, tambin para aplicaciones crticas donde se requiere precisin absoluta. A pesar de estos cambios, Linux 2.6 no puede considerarse estrictamente como Sistema Operativo en Tiempo Real, ya que no cumple los rgidos criterios que aseguran que todas las acciones ocurren de forma

10

CAPTULO 2. ESTADO DEL ARTE

predecible; pero los cambios en velocidad de respuesta deberan ser atractivos para todo tipo de usuarios de Linux [7]. Una de las mejoras denitivas en Linux 2.6 es que el kernel puede ser interrumpido (preemptive ). El kernel puede ser detenido a la mitad de alguna operacin para que otras aplicaciones sigan ejecutndose, aunque se est en medio de un proceso intensivo de bajo nivel. Claro que habr situaciones en que el kernel no pueda ser interrumpido. En condiciones normales, la mayora de los usuarios nunca han visto retrasos anormales, ya que no suelen pasar de una fraccin de segundo. Aun as, muchos usuarios pueden notar que el sistema se comporta ms gilmente en modo interactivo al activar esta opcin; la entrada de usuario parecer ms rpida, incluso en un sistema colapsado [7]. Otro cambio importante en la versin 2.6 es la reescritura de la infraestructura del kernel para manejo de hilos, de forma que se pueda ejecutar la Biblioteca Nativa de Hilos POSIX, NPTL [Native POSIX Thread Library ] sobre ella. Esto conlleva mejores rendimientos en procesadores Pentium Pro y superiores, cuando se hace uso de muchos hilos, y el sector empresarial lleva tiempo esperndolo. Este cambio incluye nuevos conceptos en el espacio de hilos de Linux: grupos de hilos, memoria local para hilos individuales, seales tipo POSIX, y dems. Esto puede perjudicar a las aplicaciones que, en lugar de seguir las especicaciones, dependen de linuxismos ya desfasados; as ocurre con ciertas versiones de Java desarrolladas por Sun. Dado que los benecios son mayores que el perjuicio, y vista la importancia de los promotores, est claro que las aplicaciones importantes sern adecuadas a los nuevos mecanismos poco despus de la versin denitiva [7]. Una de las caractersticas nuevas de Linux 2.6 ms esperadas por los usuarios es la inclusin de ALSA (Arquitectura Avanzada de Sonido Linux ( Advanced Linux Sound Architecture )) en lugar del sistema de sonido antiguo. La primera mejora en el nuevo sistema es que ha sido diseado desde el principio para poder ser usado desde distintos hilos, procesos y procesadores, arreglando los problemas de los drivers antiguos que no funcionaban fuera del paradigma un-ordenador-un-procesador [7].

2.1.3.

Anatoma de una aplicacin

En las aplicaciones hay 5 bloques: Activity, Intent, BroadcastReceiver, Service, Content Providers. Activity :a partir de ahora actividad, son las ms comunes de los 4 bloques. Habitualmente es una pantalla de la aplicacin. Cada actividad es implementada como una clase que extiende a la clase base. La clase mostrar una interfaz de usuario compuesta por Views que responder a los distintos eventos que se produzcan. La mayora de las aplicaciones estn compuestas por varias pantallas, por lo que la mayora de ella estarn compuestas por varias actividades. El movimiento entre

2.1. Android O.S.

11

pantallas se logra empezando una nueva actividad. Cuando una nueva ventana se abre, la anterior queda en pausa o en una pila. El usuario puede navegar hacia atrs a travs de las ventanas previamente abiertas [3]. Es decir, bsicamente es la parte visual de una aplicacin. Como ejemplo considrese una aplicacin SMS. Tiene que tener una pantalla que muestre los contactos para enviar un SMS, una segunda pantalla para escribir el mensaje y otras pantallas para leer mensajes anteriores y cambiar las conguraciones. Cada una de esas pantalla ser implementada por una actividad. Cada vez que se inicia otra pantalla se comienza una nueva actividad. Intent e IntentFilters : son clases especiales para moverse de una pantalla a otra. Describe lo que una aplicacin quiere hacer. Lo ms importante de esta estructura son la accin y los datos para llevarla a cabo. La navegacin entre pantallas se logra mediante la resolucin de Intents. Para ello usamos IntentFilter que buscan entre todas las aplicaciones la que mejor se ajuste al Intent [3]. Es decir, es un evento de la aplicacin que dice quiero hacer esto. Un Intent puede ser, por ejemplo, quiero enviar un email. Cuando la aplicacin genera esa Intencin (muchas estn pre-denidas), Android busca la ms adecuada para manejar esa intencin. Si no est registrada, el usuario debe denirla en el AndroidManifest.xml para que se lance la actividad correspondiente. Por ejemplo, para ver la informacin de un contacto, se debera crear un Intent que requiera una interfaz de usuario compuesta por Views y establecer los datos a una URI para representar a ese contacto. Broadcast Intent Receiver : se puede usar cuando se requiere que se ejecute algo como reaccin a un evento externo. No usan la interfaz de usuario. Usan NoticationManager para alertar de que algo ha pasado [3]. Por ejemplo, cuando suena el telfono, o cuando los datos de la red estn disponibles, o cuando sea una hora determinada, se ejecutar algo en reaccin a estos eventos. Service : a partir de ahora servicio, es un cdigo que se ejecuta sin ninguna interfaz de usuario, cdigo que se ejecuta en segundo plano para permitir as la ejecucin de otras actividades. Es importante notar que es posible conectarse a un servicio mediante la interfaz que la actividad pone a disposicin del usuario [3]. Por ejemplo, el Media Player, est reproduciendo msica en una lista de reproduccin. En l habr una o mas actividades que permitan al usuario elegir cancin y empezar su reproduccin. No ser manejado por una actividad porque el usuario espera que la msica se mantenga sonando mientras navega por otras pantallas. En este caso el Media Player podra comenzar un servicio para ejecutar en background y mantener la msica sonando.

12

CAPTULO 2. ESTADO DEL ARTE

Content Provider : aplicaciones que establecen sus datos en cheros, bases de datos, etc. Tienen sentido si se quiere compartir datos con otras aplicaciones. Es un servicio que da capacidad a las aplicaciones de comunicarse con otras de manera interna. Es similar a inter-process communication [3].

2.1.4.

Herramientas de desarrollo

Google proporciona las herramientas necesarias para desarrollar las distintas aplicaciones sobre la plataforma Android. El Android SDK incluye una gran variedad de herramientas especialmente diseadas para desarrollar aplicaciones sobre la plataforma Android. La herramienta ms importante es el Android Emulator y las Android Development Tools plugin para Eclipse, pero el SDK tambin incluye un surtido de otras herramientas para depuracin, empaquetado e instalacin de aplicaciones en el dispositivo o emulador [3]. Android emulator: un dispositivo mvil virtual que se ejecuta sobre el ordenador. Se usa para disear, depurar y probar las aplicaciones desarrolladas. A continuacin se muestran dos imgenes del emulador, gura 2.2, ejecutando el HelloAndroid y el men [3].

(a) Hello Android

(b) Men

Figura 2.2: Algunas ejecuciones Hierarchy viewer: permite depurar y optimizar la interfaz de usuario. Proporciona una representacin visual de los distintos layouts. Estos dos rboles han sido obtenidos con el Hierarchy viewer. La primera, gura 2.3, se corresponde con la ejecucin del HelloAndroid, y la segunda, gura 2.4, con el men del terminal [3].

2.1. Android O.S.

13

Figura 2.3: Hierarchy Viewer de Hello android [3]

Figura 2.4: Hierarchy Viewer de Men [3]

14

CAPTULO 2. ESTADO DEL ARTE

Activitycreator: script para generar cheros Ant que se puedan usar para compilar las aplicaciones. Si se usa el entorno de Eclipse, esto no es necesario [3]. Android Development Tools Plugin for the Eclipse IDE: aade poderosas funcionalidades para el entorno de desarrollo Eclipse, creando y depurando las futuras aplicaciones par Android ms fcil y rpidamente [3]. Dalvik Debug Monitor Service: mquina virtual que permite manejar los procesos en el emulador o dispositivo y ayudar en la depuracin [3]. Android Debug Bridge: permite instalar tus aplicaciones en el emulador o dispositivo y acceder a ellas mediante lnea de comando [3]. Android Interface Description Language: permite crear cdigo para una interfaz entre procesos [3]. sqlite3: permite acceder a los cheros SQlite usados y creados por las aplicaciones de Android [3]. Traceview: proporciona un anlisis grco de la traza de datos generada por la aplicacin [3]. mksdcard: permite crear una imagen que se puede usar con el emulador, de forma que simule la presencia de un dispositivo de almacenamiento [3]. dx : permite reescribir bytecode en Android bytecode [3]. UI/Application Exerciser Monkey: programa que se ejecuta sobre el emulador o dispositivo que simula secuencias pseudo-aleatoria de eventos de usuario. Se puede usar para probar las aplicaciones que se estn desarrollando [3].

Figura 2.5: Draw nine patch[3]

2.1. Android O.S.

15

Draw 9-patch: permite crear fcilmente un ninePatch grca usando el editor WYSIWYG. Muestra una imagen previa pequea y remarca el rea en donde el contenido est permitido. En la gura anterior, 2.5, se muestra un pequeo ejemplo [3].

2.1.5.

Modelo de aplicaciones de Android: aplicaciones, tareas, procesos e hilos

En la mayora de los sistemas operativos hay una fuerte relacin uno a uno entre las imgenes ejecutables en las que est la aplicacin, los procesos que se ejecutan y las interacciones del usuario con ello. En Android estas asociaciones son mucho ms uidas [3]. Es importante distinguir entre tarea y proceso. Una tarea es lo que el usuario percibe como una aplicacin que ha sido lanzada (normalmente hay un icono en la pantalla que puede ser accedido). Por otro lado, un proceso, es un proceso de bajo nivel en el kernel en donde la aplicacin se est ejecutando [3]. Tareas: cuando el usuario ve una aplicacin lo que realmente est viendo es una tarea. Es decir, desde el punto de vista del usuario est viendo una aplicacin, pero desde la perspectiva del desarrollador est viendo una o ms actividades [3]. En algunos casos, Android necesita saber a qu tarea pertenece una actividad cuando esta no ha sido lanzada por una tarea en concreto. Esto se logra mediante la anidad de tareas, que proporcionan un nombre para la tarea en la que las actividades pretenden ejecutarse. La anidad de tarea por defecto es el nombre del paquete .apk en la que la actividad est implementada. La forma principal en la que se controla como las actividades interactuan con las tareas es mediante el atributo launchMode y el ag asociado con el Intent. Procesos: son un detalle de implementacin de las aplicaciones y no algo de lo que el usuario sea consciente. Sus usos principales son: mejorar la estabilidad o seguridad, reducir la sobrecarga, ayudar al manejador de recursos del sistema poniendo cdigo pesado en procesos separados que pueden ser eliminados independientemente [3]. Hilos: cada proceso tiene uno ms hilos ejecutndose en l. En la mayora de las ocasiones, se evita crear hilos adicionales en un proceso, manteniendo un nico hilo a no ser que este cree los suyos propios. Es importante decir que los nuevos hilos no son creados por instancias de Activity, BroadcastReceiver, Service o ContentProvider. Son instanciados en el proceso deseado, en el hilo principal de ese proceso [3]. An as hay algunas excepciones a esta regla: llamada a IBinder o a una interfaz implementada por IBinder, llamada al mtodo main por ContentProvider y llamadas

16

CAPTULO 2. ESTADO DEL ARTE

en View y su subclases [3].

2.1.6.

Ciclo de vida de una aplicacin

En la mayora de los casos, las aplicaciones de Android se ejecutan en un proceso de Linux. El proceso lo crea la aplicacin que necesita alguna parte de su cdigo y se mantiene hasta que no se necesita ms y el sistema reclama memoria para otras aplicaciones. Es raro aunque fundamental saber que el tiempo de vida de una aplicacin no est controlado por ella misma, sino que est determinada por el sistema mediante una combinacin de partes de la aplicacin que se estn ejecutando, cun de importantes son para el usuario y cunta memoria estn consumiendo. Es muy importante tener clara las diferencias entre los distintos componentes de aplicacin (Activity, Service y BroadcastReceiver ). No usarlos correctamente puede implicar que el sistema los elimine cuando estn realizando alguna actividad importante. Para determinar los procesos que eliminar el sistema cuando est bajo de memoria, Android establece una jerarqua, gura 2.6, de importancia basado en los componentes que estn ejecutando y en qu estado se encuentran. Estos tipos son[3]:

Figura 2.6: Nivel de prioridad Foreground process : es el que es requerido por lo que est haciendo actualmente el usuario. Varias aplicaciones pueden estar proporcionando distintos elementos para que se consideren foreground . Habr solo unos pocos procesos de este tipo en el sistema y solo sern eliminados cuando la memoria sea tan baja que incluso estos

2.1. Android O.S.

17

procesos no se puedan seguir ejecutando. Visible process : el que mantiene una actividad que es visible en la pantalla para el usuario (pero est en pausa). Esto puede ocurrir si el Foreground process se muestra en pantalla permitiendo que la actividad anterior sea mostrada detrs de ella. Como un proceso es considerado extremadamente importante no se eliminar a no ser que sea necesario tener todos los Foregorund Processes ejecutando. Service process : procesos que no son vistos directamente por el usuario pero que hacen cosas requeridas por el usuario, por lo que el sistema los mantiene ejecutando a no ser que los 2 tipos de procesos anteriores requieran ms memoria. Background process : proceso que mantiene una actividad pero que no es visible al usuario. No tienen incidencia directa en la actividades que realiza el usuario. El sistema puede eliminar procesos en cualquier momento para liberar memoria para cualquiera de los 3 tipos de procesos anteriores. Se mantiene una lista LRU (Least Recently Used, No usada recientemente) para asegurar que los procesos usados mas recientemente por el usuario son los ltimos en ser eliminados. Empty process : que no tiene ningn componente de aplicacin activo, la nica razn de mantenerlos funcionando es como cach para mejorar el tiempo de arranque la siguiente vez que una aplicacin empiece. El sistema eliminar estos procesos para equilibrar los recursos del sistema. Una vez que se ha decidido como clasicar el proceso, el sistema tomar su decisin en base al nivel ms importante de entre todos los procesos activos. La prioridad de un proceso puede incrementarse a otras dependencias que tenga. Un ejemplo de todo esto son los BroadcastReceiver. Estos lanzan un hilo cuando reciben un Intent. Despus, devolver el control a la funcin que corresponda. En ese momento, el sistema puede considerar que el BroadcastReceiver ya no est activo porque ya ha cumplido su funcin, y por lo tanto no se necesita ms, a no ser que otros componentes de aplicacin sigan activos en l. Por tanto el sistema eliminar el proceso en cualquier momento para liberar memoria, por lo que termina el hilo lanzado que estaba ejecutando en el proceso. Para evitar esto se debe comenzar un nuevo servicio a partir del BroadcastReceiver para que el sistema vea que sigue activo.

2.1.7.

Implementar una interfaz de usuario

A la hora de disear la interfaz grca de la aplicacin, se debe tener en cuenta la estructura jerrquica de los elementos en pantalla as como los elementos comunes entre los distintos objetos.

18

CAPTULO 2. ESTADO DEL ARTE

JERARQUA DE LOS ELEMENTOS DE PANTALLA

Views: es una estructura de datos cuyas propiedades permiten establecer el layout y el contenido de un area rectangular. Permite manejar medidas, focalizar elementos, scrolling, etc. Sirve de base para widgets (conjunto de subclases enteramente implementadas para mostrar elementos de pantalla interactivos).

Viewgroups: objeto cuya funcin es almacenar y manejar conjuntos subordinados de objetos Views y Viewgroups.

Tree-Structured UI: en la gura 2.7 se muestra el rbol que representa las relaciones entre los viewsy Viewgroups.

Figura 2.7: rbol de view y viewgroup nodos [3]

LayoutParams: esta subclase contiene propiedades que denen el tamao y la posicin de los hijos. En la gura 2.8 se muestra la jerarqua de los elementos de la clase.

2.1. Android O.S.

19

Figura 2.8: Posiciones relativas de los nodos hijo [3] COMMON LAYOUT OBJECTS Frame Layout: Es el objeto de layout ms simple. Es un hueco en blanco reservado en la pantalla que se puede rellenar ms tarde. Los elementos hijo se ponen en la esquina superior izquierda. No se puede especicar una posicin concreta. LinearLayout: alinea todos los hijos en una misma direccin, vertical u horizontal. Se apilan uno detrs de otro. Permite establecer la altura de los hijos. TableLayout: posiciona a los hijos en las y columnas. No muestra las lneas de las las ni de las columnas. AbsoluteLayout: permite especicar las coordenadas exactas de los hijos, siendo la coordenada (0,0) la esquina superior izquierda. RelativeLayout: permite establecer las posiciones relativas entre los hijos, diferencindolos por su identicador. DISEAR LA PANTALLA EN XML Disear una pantalla mediante cdigo puede ser tedioso. Android soporta XML para disear pantallas. Android dene un montn de elementos personalizados, cada uno representando a una subclase especca de View. Se pueden crear pantallas igual que se disean cheros HTML. Cada chero describe un nico elemento, pero este puede ser una vista simple, un layout que contenga unos cuantos hijos. Cuando se compila la aplicacin, Android compila cada chero en recurso un android. view.View.

20

CAPTULO 2. ESTADO DEL ARTE

ESCUCHANDO NOTIFICACIONES DE LA INTERFAZ DE USUARIO Algunas noticaciones son expuestas y llamadas por Android automticamente. Algunas llamadas, como los clicks del botn, deben ser registradas manualmente. USAR TEMAS EN UNA APLICACIN Si no se especica un tema, Android usar el tema por defecto. Se puede crear uno propio, para posteriormente establecerlo en el chero XML o programando. Si se elige esta ltima opcin, es necesario tener creado el tema antes de crear las distintas vistas usadas en la interfaz.

2.1.8.

Bloques de Android

Para analizar la estructura de Android, podemos dividirlo en los siguientes bloques funcionales [3]: 1. AndroidManifest.xml: es el chero de control que le dice al sistema que hacer con los elementos del nivel ms alto que se han creado. Este chero es requerido por todas las aplicaciones. Contiene los valores globales del paquete que se est usando, incluyendo los componentes de aplicacin., la implementacin de las clases para cada componente, que tipo de datos puede manejar y cuando pueden ser lanzados. Hay que destacar que estn incluidos los Intent Filters. Estos describen dnde y cundo puede comenzar una actividad. Cuando una actividad quiere realizar algo, como abrir una pgina Web, crea un Intent. ste puede tener descriptores de lo que se quiere hacer, qu datos quieres para hacerlo, que tipo de datos... Despus de esto, Android compara est informacin del Intent con el Intent Filter de cada aplicacin, los compara y elige el ms adecuado para realizar la operacin especicada por el llamante.

2. Actividades: fundamentalmente son objetos que tienen un ciclo de vida (ver gura 2.9). Es un trozo de cdigo que hace algo. Si es necesario puede mostrar una interfaz de usuario. Interactuan con el usuario, por lo que ponen una ventana para que el usuario pueda disear su interfaz de usuario. Aunque normalmente se presentan al usuario en ventanas a pantalla completa, se las puede usar de otras maneras: como ventanas otantes o embebidas

2.1. Android O.S.

21

dentro de otra actividad.

Las actividades del sistema se manejan en una pila. Cuando se crea una nueva, se pone arriba del todo. Las previas permanecen debajo. A continuacin se muestra el ciclo de vida de una actividad.

Figura 2.9: Ciclo de vida de Activity [3]

22

CAPTULO 2. ESTADO DEL ARTE

Las actividades tienen 4 posibles estados [3]: a ) Cuando una actividad est en foreground (encima de la pila) se dice que est activa o ejecutando. b ) Si ha perdido el foco, pero todava es visible (porque una nueva actividad, no maximizada o transparente, tiene ahora el foco), se dice que est pausada. An as est viva, mantiene la informacin de estado, pero puede ser eliminada por el sistema en caso de que quede muy poca memoria libre. c ) Si sta est oscurecida por otra y ha perdido completamente el foco, est parada. mantiene la informacin de estado, pero no es visible para el usuario, y puede ser eliminada por el sistema cuando se requiere ms memoria. d ) Cuando una actividad est pausada o parada, el sistema puede pedirla que acabe o simplemente eliminarla de la memoria. Cuando se vuelve a mostrar al usuario debe haberse reiniciado y restaurado completamente a su estado previo. Si cambia la conguracin del dispositivo, algo que est mostrando la interfaz de usuario necesitar actualizarse para corresponderse con esa nueva conguracin. Debido a que las actividades son el mecanismo primario para interactuar con el usuario, stas incluyen soporte especial para manejar estos cambios de conguracin. A menos que se especique otra cosa, un cambio de conguracin provocar que la actividad se destruya, siguiendo el curso normal de su ciclo de vida [3]. 3. Views : objeto que sabe cmo dibujarse en la pantalla. Las interfaces de usuario estn compuestas por rboles de Views. La geometra de un View es un rectngulo, que tiene unas coordenadas en la pantalla, empezando a contarse por la esquina superior izquierda. Se puede especicar su tamao. 4. Intents : es un mensaje de objeto que representa la intencin de hacer algo. Por ejemplo, si la aplicacin quiere mostrar una pgina web, expresa su intencin de hacer eso creando un Intent y manejndolo. El sistema localiza el trozo de cdigo que sabe manejar esa intencin y la hace funcionar. 5. Servicios: es cdigo que corre en background. Puede ejecutar su proceso en el contexto de otros procesos de aplicacin. Por ejemplo cuando se usa el reproductor de msica y mientras tanto se vuelve a pantallas anteriores para hacer otras cosas. Mientras se hace eso, la msica seguir sonando. 6. Notications : es un icono pequeo persistente que aparece en la barra de estado. Estos podra ser por ejemplos SMS, apareciendo por ejemplo un

2.1. Android O.S.

23

sobrecejo. El usuario puede interactuar con l para recibir informacin. Estas son los mecanismos preferidos para alertar al usuario cuando pasa algo. Tambin se puede avisar al usuario mediante LEDs en el dispositivo, con sonidos, vibraciones...

7. ContentProviders : es un lugar para almacenar datos que proporciona acceso a datos del dispositivo. Encapsulan datos y se los proporcionan a las aplicaciones. Solo se necesita si necesitamos compartir datos entre multiples aplicaciones. Si no se necesita compartir los datos se puede usar una base de datos directamente.

2.1.9.

Almacenaje, recuperacin, y presentacin de datos

Un sistema operativo proporciona un sistema de cheros comn que cualquier aplicacin puede usar para almacenar y leer archivos que pueden ser ledos por otras aplicaciones (con algunos ajustes de control de acceso). Android usa un sistema diferente: en Android, todos los datos de aplicacin (incluyendo archivos) son internos a esa aplicacin. Sin embargo, Android tambin proporciona un modo para presentar sus datos internos a otras aplicaciones [3]: Preferences: mecanismo ligero para establecer y recuperar parejas de datos primitivos. Files: poner los cheros en el dispositivo o en otros medios extrables. Databases: el API contiene soporte para SQLite. La aplicacin puede crear y usar esta base de datos. ContentProviders: componente opcional de la aplicacin que lee/escribe cuando accede a datos privados de una aplicacin. Network: tambin se puede utilizar la red para poner y recuperar datos.

2.1.10.

Modelo de seguridad

Android es un sistema multiproceso donde cada aplicacin se ejecuta sobre su propio proceso. La mayor parte de la seguridad entre aplicaciones y el sistema se hace cumplir en el nivel de proceso de Linux, como los identicadores de grupo y usuario que son asignados a las aplicaciones. Tambin se proporcionan ms caractersticas de seguridad a travs de mecanismos de permisos que ofrecen restricciones en operaciones especcas [3].

24

CAPTULO 2. ESTADO DEL ARTE

ARQUITECTURA DE SEGURIDAD En el punto central de la arquitectura de seguridad de Android, por defecto, ninguna aplicacin tiene permisos para realizar ninguna operacin sobre l, lo que podra provocar graves daos en otras aplicaciones, el sistema operativo, etc. Un proceso de aplicacin es una caja segura. No puede molestar a otras aplicaciones excepto si se han declarado los permisos explcitamente. Estos permisos pueden ser manejados de diferentes maneras, tpicamente permitiendo o no mediante certicados, o promovido por el usuario. Los permisos requeridos por una aplicacin son declarados estticos. FIRMAS DE APLICACIONES Todas las aplicaciones de Android deben ser rmadas con un certicado cuya clave la tiene el desarrollador. Este certicado identica al autor de la aplicacin. No necesita ser rmado por una autoridad certicadora. Es tpico que sean autormados. Simplemente es utilizado para establecer relaciones entre aplicaciones. IDENTIFICADOR DE USUARIO Y ACCESO A FICHEROS Cada paquete instalado se le da su propio identicador de usuario, creando una caja para prevenir que otras aplicaciones intereran, o que l interera en otras. Como la seguridad se hace cumplir a nivel de proceso, el cdigo de dos paquetes, normalmente, no pueden correr sobre el mismo proceso, ya que necesitan correr como usuarios distintos. USANDO PERMISOS Una aplicacin bsica, no tiene permisos asociados a ella, es decir, no puede hacer cosas que repercutan negativamente en la experiencia de usuario o en los datos del dispositivo. En el momento de la instalacin, los permisos requeridos por la aplicacin, son garantizados por el instalador del paquete, basado en vericacin contra las rmas de las aplicaciones declarando aquellos permisos y/o interacciones con el usuario. No se verica nada mientras la aplicacin est corriendo. Un permiso en particular se debe hacer cumplir: cuando lo llama el sistema, cuando se empieza una actividad, cuando se enva y reciben broadcasts, cuando se opera y accede a un Content Provider DECLARAR Y HACER CUMPLIR LOS PERMISOS Para hacer cumplir los permisos se deben declarar en AndroidManifest.xml. Los permisos de Activity, Service, BroadcastReceiver restringen quien puede realizar esas actividades, y los permisos de Content Provider restringen quien puede acceder a los datos en el ContentProvider.

2.1. Android O.S.

25

En el caso de los BroadcastReceiverse puede exigir que las aplicaciones en el receptor tambin tengan los permisos necesarios. PERMISOS URI El sistema de permisos estndar descrito puede no ser suciente en el caso de usar Content Providers. Estos objetos pueden querer protegerse con permisos de lectura y/o escritura, mientras sus clientes directos tambin tienen que dar URIS especco a otras aplicaciones para funcionar sobre ellas.

2.1.11.

Creacin y manipulacin de hilos

Los hilos, al igual que en cualquier programa Java, tienen dos formas de crearse. 1. Heredando de Threads. public class Clase1{ . Hilo h = new Hilo(); h.start(); } public class Hilo extends Thread{ . public void run(){ . . . } }

2. Implementando la interfaz Runnable public class Clase1 implements Runnable{ . public void run(){ . . . } }

26

CAPTULO 2. ESTADO DEL ARTE

public class Clase2{ . Clase2 c = new Clase2(); Thread h=new Thread(c); h.start(); } Para su uso de forma correcta, se debe utilizar una serie de mtodos para poder evitar las condiciones de carrera. Entre ellos se tienen los mtodos de espera y noticacin (wait() y notify()) y los semforos, que mediante sus operaciones P(acquire()) y V(release()), permiten el acceso de forma sincronizada a la seccin crtica del cdigo. El SDK de Android proporciona un API con clases y mtodos que permiten implementar acciones concurrentes. Entre ellas la clase Semaphore , la cual proporciona una serie de mtodos (Ps y Vs mencionadas anteriormente). Hay que destacar que las operaciones de espera, tanto wait() como acquire() tienen que estar encerradas en una estructura try-catch para poder capturar las distintas excepciones que pudieran producirse. Otra opcin para trabajar con estructuras concurrentes es el uso del modicador Synchronized . Usndolo de forma combinada con un objeto, utilizndolo como cerrojo, se puede proteger el acceso a zonas donde ya est trabajando otro hilo. Se puede complementar su funcionalidad con el uso de wait() y notify(). En este caso, para poder depurar el cdigo y observar las condiciones de carrera, no se puede usar la consola habitual y utilizar System.out.println , ya que aunque se programe en Java, no se ejecuta ese cdigo como tal, sino que se interpreta mediante la mquina de Dalvik para poder mostrarla en el emulador.

Figura 2.10: DDMS [3] Para ello se usa la perspectiva DDMS con la herramienta LogCat en la que se monitorizan todos los estados por los que pasa Android. Usando la instruccin

2.2. RTSP

27

Log.d(tag, String), se puede mostrar el estado de las variables que interesen y en el punto que interese. Como se puede ver en la gura 2.10 se muestran distintas variables (tag) con su correspondiente valor (Message). De esta forma, se pueden denir en el cdigo variables y obtener su valor sin ms que utilizar esta perspectiva.

2.1.12.

APIs opcionales

Android es vlido para una gran cantidad de telfonos, smartphones... El ncleo de las APIs de Android son vlidas en cualquier telfono, pero hay algunas que son opcionales. Son opcionales en el sentido de que el aparato no puede soportarlas completamente debido a que no tienen el hardware apropiado [3]. Wi-Fi APIs: proporcionan lo necesario para que las aplicaciones puedan comunicarse con el nivel inferior de la pila que proporciona el acceso a la red Wi-Fi. La mayor parte de la informacin del dispositivo est disponible, velocidad de conexin, direccin IP, estado, etc. Servicios basados en localizacin: software que permite obtener al telfono su posicin. Esto incluye localizacin mediante satlites GPS, pero no se limita a ello. Otros sistemas de localizacin que aparezcan en el futuro, tambin se podrn utilizar. Media APIs: se usa para reproducir cheros multimedia. Esto incluye video y audio, streaming de datos sobre la red. Tcnicamente no son opcionales, porque siempre estn presentes, pero puede haber diferencia en los codecs dependiendo del dispositivo. Grcos 3D con OpenGL: el interfaz de usuario primario es una jerarqua de clases tpica. Es el API usado para acceder a las capacidades 3D. No es estrictamente opcional ya que siempre estar presente. Pero puede ser que algunos dispositivos no tengan aceleracin de hardware y usen software rendering, lo que afectar al funcionamiento de la aplicacin.

2.2.

RTSP

Se denomina transmisin en tiempo real a la comunicacin en la que el receptor puede manipular los datos al mismo tiempo que el emisor los est enviando. Para ello se necesita un sistema que proporcione a las aplicaciones los servicios y el control necesario para la gestin de la calidad de servicio (QoS) [12]. Los protocolos de transmisin tienen sistemas de control de errores y de reenvo de paquetes que aseguran que la abilidad entre emisor y receptor sea transparente a los niveles superiores [12].

28

CAPTULO 2. ESTADO DEL ARTE

Para la transmisin en tiempo real, esta gestin de errores puede ser negativa, debido al retraso que producira la retransmisin de un paquete de nuevo. Para evitar este problema se plantea que el tratamiento y gestin de los errores sea a niveles superiores. En una red en tiempo real, la prdida de paquetes puede ocurrir debido a la saturacin de memoria en los nodos o al superar el retraso mximo exigido [12]. Las prestaciones de una transmisin multimedia pueden ser medidas en dos dimensiones: latencia y delidad. La latencia puede ser vital para aplicaciones interactivas como conferencias mientras que para la transmisin de una pelcula no lo es. La delidad de la transmisin es variable. Hay aplicaciones que no toleran ninguna variacin en la delidad de la imagen como podra ser la transmisin de imgenes mdicas y otras en que esta variacin slo produce una cierta distorsin tolerable como la transmisin de pelculas o msica [12]. La provisin de servicios multimedia sobre redes en tiempo real se denomina Streaming. La tecnologa de streaming se utiliza para aligerar la descarga y ejecucin de audio y vdeo en la web, ya que permite escuchar y visualizar los archivos mientras se estn descargando [12]. La diferencia con los servicios de descarga es clara, ya que en este se produce primero el envo de datos y slo despus se accede a los contenidos, por el contrario, el streaming permite ver o escuchar el contenido durante la descarga; es decir, el transporte y el tratamiento de datos de producen en forma simultnea [12].

Figura 2.11: Ejemplo de streaming con RTSP [16] RTSP (Real Time Streaming Protocol) es un protocolo no orientado a conexin. El servidor mantiene una sesin asociada a un identicador, en la mayora de los casos RTSP usa TCP para datos de control del reproductor y UDP para los datos de audio y vdeo aunque tambin puede usar TCP en caso de que sea necesario (en la gura 2.12 se muestra el lugar de RTSP en la pila de protocolos). En el transcurso de una sesin RTSP, gura 2.13, un cliente puede abrir y cerrar varas conexiones de transporte hacia el servidor por tal de satisfacer las necesidades del protocolo [10].

2.2. RTSP

29

Figura 2.12: Pila de protocolos [17] De forma intencionada, el protocolo es similar en sintaxis y operacin a HTTP de forma que los mecanismos de expansin aadidos a HTTP pueden, en muchos casos, aadirse a RTSP. Sin embargo, RTSP diere de HTTP en un nmero signicativo de aspectos [11]: RTSP introduce nuevos mtodos y tiene un identicador de protocolo diferente. Un servidor RTSP necesita mantener el estado de la conexin, al contrario de HTTP. Tanto el servidor como el cliente pueden lanzar peticiones. Los datos son transportados por un protocolo diferente. RTSP es denido utilizando la norma ISO 10646 (UTF-8) en lugar de la norma ISO 8859-1. El protocolo soporta las siguientes operaciones [11]: Recuperar contenidos multimedia del servidor: el cliente puede solicitar la descripcin de una presentacin por HTTP o cualquier otro mtodo. Si la presentacin es multicast, la descripcin contiene los puertos y las direcciones que sern usados. Si la presentacin es unicast el cliente es el que proporciona el destino por motivos de seguridad. Invitacin de un servidor multimedia a una conferencia: Un servidor puede ser invitado a unirse a una conferencia existente en lugar de reproducir la presentacin o grabar todo o una parte del contenido. Este modo es til para aplicaciones de enseanza distribuida dnde diferentes partes de la conferencia van tomando parte en la discusin.

30

CAPTULO 2. ESTADO DEL ARTE

Adicin multimedia a una presentacin existente: Particularmente para presentaciones en vivo, til si el servidor puede avisar al cliente sobre los nuevos contenidos disponibles.

Figura 2.13: RTSP UDP [10]

2.2.1.

Propiedades

RTSP tiene las siguientes propiedades [11]:

Extensible: nuevos mtodos y parmetros pueden ser fcilmente aadidos al RTSP.

Seguro: RTSP reutiliza mecanismos de seguridad web ya sea a los protocolos de transporte (TLS) o dentro del mismo protocolo. Todas las formas de autenticacin HTTP ya sea bsica o basada en resumen son directamente aplicables.

Independiente del protocolo de transporte: RTSP puede usar indistintamente protocolos de datagrama no ables (UDP) o datagramas ables RDP (Radio Data Packet") o un protocolo able orientado a conexin como el TCP.

Capacidad multi-servidor: Cada ujo multimedia dentro de una presentacin puede residir en servidores diferentes, el cliente automticamente establece varas sesiones concurrentes de control con los diferentes servidores, la sincronizacin la lleva a trmino la capa de transporte.

Control de dispositivos de grabacin: El protocolo puede controlar dispositivos de grabacin y reproduccin (p.ej cmaras IP RTSP).

2.2. RTSP

31

Adecuado para aplicaciones profesionales: RTSP soporta resolucin a nivel de frame mediante marcas temporales SMPTE para permitir edicin digital. Separacin del control de ujo y la iniciacin de conferencias: el control de ujo est separado de invitar a un servidor de medios para una conferencia. El nico requisito es que el protocolo de inicio de conferencia proporciona o se puede utilizar para crear un identicador nico. Negociacin de transporte: el cliente puede negociar el mtodo de transporte antes de procesar un ujo de datos.

2.2.2.

Peticiones RTSP

Las peticiones RTSP estn basadas en peticiones HTTP y generalmente son enviadas del cliente al servidor. Su sintaxis y operacin es similar a HTTP con lo que los mecanismos de expansin aadidos a HTTP pueden aadirse tambin en muchos casos a RTSP. A continuacin se describe el intercambio de peticiones y respuestas ms tpicos [10] [11]:

PROPIEDADES Este mtodo obtiene una descripcin del objeto multimedia apuntado por una URL RTSP (DESCRIBE) situada en un servidor. El servidor responde a esta peticin con una descripcin del recurso solicitado (Content-Type, ContentLength, etc), entre otros datos la descripcin contiene una lista de los ujos multimedia que sern necesarios para la reproduccin. Esta solicitud/respuesta constituye la fase de inicializacin del RTSP. Ejemplo: -Cliente a Servidor: -DESCRIBE rtsp://unservidor.com/uncontingut RTSP/1.0 -Accept: application/sdp, application/rtsl, application/ mheg -Servidor a Cliente: -RTSP/1.0 200 OK -Content-Type: application/sdp -Content-Length: 376 -i=Descripcin del contenido

32

CAPTULO 2. ESTADO DEL ARTE

-m=audio 3456 RTP/AVP 0 -m=video 2232 RTP/AVP 31 SETUP Esta peticin contiene la URL del ujo multimedia y especica como se transportar el ujo de datos, as como un puerto para recibir los datos (audio o vdeo) y otro para los datos RTCP (meta-datos). El servidor responde a esta peticin conrmando los parmetros escogidos y completa las partes restantes, como los puertos escogidos. Cada ujo de datos debe ser congurado con un SETUP antes de enviar una peticin de PLAY. Ejemplo: -Cliente a Servidor: -SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0 -Transport: RTP/AVP;unicast;client_port=4588-4589 -Servidor a Cliente: -RTSP/1.0 200 OK -Session: 47112344 -Transport: RTP/AVP;unicast; -client_port=4588-4589;server_port=6256-6257 PLAY Una peticin de PLAY provocar que el servidor comience a enviar datos de los ujos especicados utilizando los puertos congurados con SETUP. Ejemplo: -Cliente a Servidor: -PLAY rtsp://unservidor.com/audio RTSP/1.0 -Session: 12345678

2.2. RTSP

33

PAUSE

Detiene temporalmente uno o todos los ujos, de manera que puedan ser recuperados con un PLAY posteriormente.

Ejemplo:

-Cliente a Servidor:

-PAUSE rtsp://unservidor.com/video1 RTSP/1.0 -Session: 12345678

-Servidor a Cliente:

-RTSP/1.0 200 OK

TEARDOWN Detiene la entrega de datos para la URL indicada liberando los recursos asociados.

Ejemplo:

-Cliente a Servidor:

-TEARDOWN rtsp://example.com/zzle/foo RTSP/1.0 -Session: 12345678

-Servidor a Cliente:

-RTSP/1.0 200 OK

En la siguiente grca, 2.14, se muestra el diagrama de estados del protocolo segn la operacin que se realiza.

34

CAPTULO 2. ESTADO DEL ARTE

Figura 2.14: Diagrama de estados de RTSP [16]

2.2.3.

Sesin RTSP:

Para establecer unas conexin RTSP, se realizan los siguientes pasos [10]: 1. El cliente accede a la URL RTSP para colocar el nombre del servidor y el puerto. 2. Si el nombre del servidor no est en formato IP, el cliente hace una consulta DNS para obtener la direccin correspondiente. 3. El cliente inicia una conexin TCP hacia el servidor. 4. Cuando la conexin est establecida correctamente, el cliente enva al servidor una peticin OPTIONS. EL servidor devuelve informacin que puede incluir la versin de RTSP, la fecha, el nmero de sesin, el nombre del servidor y los mtodos soportados. 5. El cliente enva una peticin DESCRIBE para obtener una descripcin de la presentacin. El servidor responde con todos los valores de inicializacin necesarios para la presentacin. 6. El cliente enva SETUP para cada ujo de datos que se quiere reproducir. El SETUP especica los protocolos aceptados para el transporte de los datos. 7. El cliente inicializa los programas adecuados requeridos para reproducir la presentacin. 8. El cliente enva una peticin PLAY que informa al servidor que ahora es el momento de comenzar a enviar datos. 9. Durante la sesin, el cliente peridicamente hace ping al servidor utilizando peticiones SET_PARAMETER. Aunque la respuesta sea errnea el cliente la ignora informando al cliente que el servidor todava est activo.

2.3. Motion

35

10. Cuando la presentacin termina o el usuario la para, el cliente enva un SET_PARAMETER que contiene las estadsticas de la sesin. 11. El cliente enva TEARDOWN para dar por terminada la conexin con el servidor.

2.3.

Motion

Motion es un programa que monitoriza la seal de vdeo de una o ms cmaras y es capaz de detectar si ha cambiado una parte signicativa de la imagen, es decir, se puede detectar el movimiento. Toda la documentacin se ha obtenido de [8]. El programa est escrito en C y funciona bajo el sistema operativo Linux. Motion es una herramienta basada en lnea de comandos cuya salida puede ser jpeg, mpeg o secuencias de vdeo. No tiene absolutamente ninguna interfaz grca de usuario. Todo se congura a travs de la lnea de comandos o a travs de un conjunto de archivos de conguracin (simples archivos ASCII).

2.3.1.

Caractersticas generales

Adems de analizar las imgenes para detectar movimiento, Motion proporciona funcionalidades adicionales, siendo las siguientes las ms representativas:

Captar imgenes de movimiento Visualizar mltiples dispositivos de vdeo al mismo tiempo Visualizar mltiples entradas de una tarjeta de captura, al mismo tiempo Streaming de Webcam en vivo (usando multipart / x-mixed-replace) Creacin en tiempo real de vdeos MPEG usando las bibliotecas de mpeg Toma instantnea de imgenes a intervalos regulares Captura instantnea de imgenes a intervalos irregulares utilizando cron Ejecutar comandos externos cuando se detecta movimiento (y por ejemplo, enviar SMS o correo electrnico) Seguimiento de movimiento (la cmara sigue el movimiento - hardware especial requerido) Fuente eventos en un MySQL o base de datos PostgreSQL. Video Comunicacin a un bucle de tiempo real video4linux visualizacin

36

CAPTULO 2. ESTADO DEL ARTE

Muchos usuarios han contribuido con proyectos relacionados con interfaces web, etc Usuario congurable y denido por el usuario en pantalla. Control a travs del navegador (las versiones anteriores utilizan XML-RPC) Control automtica de ruido y del umbral Motion es un demonio con un bajo consumo de CPU de memoria.

2.3.2.

Quin hace Motion?

Motion es un proyecto de cdigo abierto. No cuesta nada. Motion se publica bajo licencia GNU General Public License (GPL) versin 2 o posterior. Esto signica que se puede conseguir el programa, instalarlo y usarlo libremente.

2.3.3.

Notas sobre el funcionamiento

Si se tiene ms de una cmara no se debe ejecutar el programa ms de una vez. Motion trabaja con ms de una cmara creando una serie de hilos, siendo cada uno de ellos un archivo de conguracin. Si slo tiene una cmara, slo se necesitar el archivo motion.conf. En el momento en que haya dos o ms cmaras, se debe tener un archivo de conguracin por cada cmara, adems del archivo motion.conf. As, si por ejemplo se tienen dos cmaras, se necesitarn el archivo motion.conf hilo y dos archivos ms de conguracin. En total tres archivos. Las opciones comunes a todas las cmaras se pueden denir en el archivo motion.conf y las particulares de cada una de ellas en el archivo correspondiente a su hilo. Otra opcin menos elegante consistira en denir en el archivo perteneciente a cada hilo todos los parmetros de conguracin. As, el funcionamiento anteriormente descrito se podra resumir siguiendo los siguientes cuatro pasos. 1. Motion lee el archivo de conguracin motion.conf desde el principio del archivo bajando lnea por lnea. 2. Si la opcin de hilo se dene en motion.conf, el archivo de conguracin de hilo (s) es / (son) ledos. 3. Motion contina leyendo el resto del archivo motion.conf. Cualquiera de las opciones denidas de aqu en adelante sobrescribirn las denidas previamente en los cheros de conguracin de cada hilo.

2.4. Darwin Stream Server

37

4. Motion vuelve a leer la lnea de comandos, sobrescribiendo las opciones denidas previamente.

Siempre deben llamarse a los cheros de conguracin de hilo al nal del archivo motion.conf. Si se denen opciones en motion.conf despus de que se invoque a los distintos hilos, dichas opciones nunca sern utilizadas.

2.3.4.

Cmaras de red

Motion puede conectarse a una cmara de red a travs de un socket TCP normal. Todo lo que se necesita es la direccin. La direccin URL dada debe devolver una sola imagen jpeg o un stream mjpeg. Por el momento Motion no se puede conectar a una secuencia de vdeo tal MPEG, MPEG4, DivX. Puede conectarse a travs de un servidor proxy. Tambin hay que tener en cuenta que no utilice una direccin URL que cree una pgina HTML con un jpg incrustado. Lo que debe ser devuelto es la imagen jpg propia o en el ujo mjpeg.

2.3.5.

Control remoto va http

Motion puede ser controlado de forma remota mediante una interfaz http simple. El servidor web responde con algunas cabeceras http simple seguido de una pgina web codicada en HTML. La mayora de opciones de conguracin de Motion se pueden cambiar mientras se est ejecutando, excepto las opciones relacionadas con el tamao de las imgenes capturadas y los archivos de mscara que slo se cargan cuando se inicia el programa. As que la herramienta ms obvia para controlar de forma remota el programa es cualquier navegador web. Todos los comandos se envan utilizando el mtodo HTTP GET. Puede utilizar cualquier navegador (Firefox, Mozilla, Internet Explorer, Konqueror, etc). Tambin puede utilizar el navegador basado en texto "Lynx"para controlar el movimiento desde una consola.

2.4.

Darwin Stream Server

Se denomina Streaming a la tcnica utilizada para transmitir datos de tal modo que estos puedan ser procesados en nuestra computadora como un ujo continuo y constante, mostrando la informacin transmitida antes de que el archivo se haya descargado en su totalidad, an cuando los archivos en teora no tengan n como una transmisin de televisin o de radio en vivo por ejemplo.

38

CAPTULO 2. ESTADO DEL ARTE

La tecnologa de streaming se utiliza para aligerar la descarga y ejecucin de audio y vdeo en la web, ya que permite escuchar y visualizar los archivos mientras se estn descargando [19]. Si no utilizamos streaming, para mostrar un contenido multimedia en la Red, tenemos que descargar primero el archivo entero en nuestro ordenador y ms tarde ejecutarlo, para nalmente ver y or lo que el archivo contena. Sin embargo, el streaming permite que esta tarea se realice de una manera ms rpida y que podamos ver y escuchar su contenido durante la descarga [19]. El streaming funciona de la siguiente manera [19]: El cliente conecta con el servidor y ste comienza el envo del chero. El cliente comienza la recepcin del chero, construyendo un buer donde almacena la informacin. Cuando se ha alcanzado un pequeo porcentaje de llenado el buer, el cliente comienza la reproduccin del mismo, a la vez que contina con la descarga. El sistema est sincronizado para que el archivo se pueda ver mientras se descarga, de modo que cuando el archivo acaba de descargarse el chero tambin ha acabado de visualizarse. Si en algn momento la conexin sufre descensos de velocidad, se utiliza la informacin que hay en el buer, de modo que se pueda soportar esa disminucin. Si la comunicacin se corta demasiado tiempo, el buer se vaca y la reproduccin del archivo se cortara hasta que se restaurase la transmisin. A la hora de seleccionar un servidor de streaming se han valorado distintas opciones. Las tres tecnologas de streaming, posiblemente ms conocidas del momento, son [19]: Real Media es posiblemente la ms popular. Tambin es la empresa con ms experiencia en el sector y desarrolla muchos productos orientados a la distribucin de archivos multimedia. Windows Media es la apuesta de Microsoft. Ya posee una cuota de usuarios muy importante y seguramente aumentar con rapidez ya que Microsoft incluye el plug-in en la instalacin tpica de los sistemas operativos que est fabricando. Quick Time es la tercera opcin. Con menor cuota de mercado. Su version para Linux es Darwin Stream Server (DSS). Darwin Streaming Server (DSS) es un servidor que permite el envo de esta informacin, utilizando el formato QuickTime, a travs de los protocolos RTP y RTSP, estndares en la industria para la transmisin de Streaming. Este formato

2.4. Darwin Stream Server

39

est basado en pistas, lo que permite combinar prcticamente cualquier contenido multimedia (audio, vdeo, imgenes jas, texto, realidad virtual, captulos e incluso idiomas alternativos) en una misma pelcula. Dispone de ms de 2.500 APIs multiplataforma totalmente documentadas que permiten a los desarrolladores de software aprovechar las posibilidades de QuickTime en aplicaciones multimedia, de creacin y de entretenimiento [18]. Hemos elegido este servidor porque est basado en el mismo cdigo que el Apples QuickTime Streaming Server. Proporciona un alto nivel de personalizacin y se ejecuta en una variedad de plataformas que le permite manipular el cdigo para que se ajuste a sus necesidades. Si bien comparten la misma base de cdigo como QuickTime Streaming Server, Darwin Streaming Server es un proyecto open source destinado a desarrolladores que necesitan ujo de QuickTime y MPEG-4 en los medios de comunicacin alternativos, tales como las plataformas Windows, Linux y Solaris, o los desarrolladores que necesitan ampliar y / o modicar el cdigo de servidor existente que se ajuste a sus necesidades. El servidor de streaming DSS de vdeo y audio transmite el ujo de datos en respuesta a peticiones que usan el software cliente. Las solicitudes se manejan utilizando Real-Time Streaming Protocol (RTSP), un protocolo para el control ujo de contenidos multimedia en tiempo real. El streaming se realiza utilizando Real-time Transport Protocol (RTP), un protocolo de transporte utilizados para la transmisin en tiempo real de contenido multimedia a travs de redes [9].

2.4.1.

Streaming en directo vs Streaming bajo demanda

Las opciones servicio para los medios de streaming en tiempo real, se dividen en dos categoras: en directo y bajo demanda. Los eventos en vivo, como conciertos, discursos y conferencias, son comnmente escuchados en Internet segn se producen con la ayuda de software. Se codica la fuente, como el vdeo de una cmara, en tiempo real, gura 2.16, y proporciona el ujo resultante en el servidor. El servidor sirve la transmisin en directo a los clientes [9]. Independientemente de cun diferentes sean los clientes, cada uno ve el mismo punto al mismo tiempo. Esta experiencia en vivo se puede simular con el contenido grabado [9]. Para una experiencia de entrega bajo demanda, como una pelcula, cada cliente empieza a recibir el ujo de datos desde el principio, por lo que nadie llega tarde al comienzo. El ujo comienza cuando el cliente lo ordena [9].

40

CAPTULO 2. ESTADO DEL ARTE

Figura 2.15: Live streaming [9]

2.4.2.

Cmo funciona el Streaming?

Al ver y escuchar las transmisiones en la televisin o los medios de comunicacin ya sea por radio, cable... estas transmisiones son en su mayora sin comprimir y consumen grandes cantidades de ancho de banda. Pero eso no es un problema, porque no tienen que competir con otras transmisiones en la frecuencia en la que estn emitiendo [9]. Cuando se enva el mismo contenido a travs de Internet, el ancho de banda utilizado ya no es exclusivo para eso. Los medios de comunicacin ahora tiene que compartir el ancho de banda con miles, posiblemente millones de personas, de otras transmisiones a travs de Internet [9]. Por lo tanto, los contenido multimedia enviados a travs de Internet son codicados y comprimidos para transmisin. Los archivos resultantes se guardan en un lugar especco, y los softwares de streaming como Darwin Streaming Server se utilizan para enviar los distintos contenidos [9]. Los streamings los pueden ver tanto por usuarios de distintas plataformas usando QuickTime Player (disponible gratuitamente en el sitio web de Apple) o cualquier otra aplicacin compatible con QuickTime o archivos estndar MPEG-4. Tambin se puede congurar para que los usuarios puedan verlos desde un navegador web con el plugin QuickTime est instalado [9]. Cuando un usuario comienza a reproducir contenido multimedia a travs de una pgina web, el plugin QuickTime enva una solicitud al servidor de streaming. El servidor responde enviando el contenido multimedia al equipo cliente [9].

2.4. Darwin Stream Server

41

El tipo de contenido multimedia que se enva al equipo cliente depende de lo que se haya especicado en la pgina web. Si alguien se conecta a una lista de reproduccin creada por el servidor de streaming, eso es lo que se enva. Si se conecta a una pelcula QuickTime en el directorio de los contenidos, eso es lo que se enva. Si se conecta a una transmisin en vivo, eso es lo que se enva [9].

2.4.3.

Multicast vs Unicast

DSS soporta multicast y unicast para ofrecer media streaming. En multicast, gura 2.17, un solo ujo de datos se comparte entre todos los clientes (ver gura). Cada cliente sintoniza un ujo como cuando se sintoniza una emisora de radio. Aunque esta tcnica reduce la congestin de la red, se requiere una red en la que cualquiera tenga acceso a la red troncal de multicast, tambin llamada Mbone, de los contenidos distribuidos a travs de Internet, o de multicast habilitado para la distribucin en una red privada [9].

Figura 2.16: Multicast [9]

En un unicast, gura 2.18, cada cliente inicia su propio ujo, dando como resultado la generacin de muchas conexiones entre el cliente y el servidor (ver gura). Muchos clientes conectados en unicast a un ujo en una red local puede dar lugar a trco de red. Pero esta tcnica es ms able para la entrega a travs de Internet, porque no necesita ningn tipo de apoyo al transporte [9].

42

CAPTULO 2. ESTADO DEL ARTE

Figura 2.17: Unicast [9]

2.4.4.

Streaming de contenidos multimedia

Darwin Streaming Server puede ser congurado para escuchar un ujo entrante y luego enviar ese ujo a uno o ms destinos (ver gura 2.19). Puede reducir el consumo de ancho de banda de Internet. Puede ser tiles en casos especiales, sobre todo si los espectadores en diferentes lugares deseas optimizar sintonizar un mismo ujo [9].

Figura 2.18: Retransmisin en vivo [9]

2.5.

Conclusiones

A la vista del estado del arte, se puede concluir que el uso de Android como plataforma para el desarrollo de una aplicacin de vdeo vigilancia, proporciona una gran cantidad de herramientas para que se pueda desarrollar el programa, de forma que se adapte lo ms posible a las necesidades del proyecto.

2.5. Conclusiones

43

Por otra parte, Motion, da muchsimas opciones de personalizacin en el tratamiento y gestin de las imgenes, siendo muy til, adems de proporcionar una amplia variedad de utilidades que harn que se pueda mejorar la aplicacin en el futuro, dotndola de nuevas funcionalidades. Por ltimo, Darwin Stream Server", realiza el streaming del vdeo grabado utilizando el protocolo RTSP, el cual es la nica forma que soporta Android para realiza dicha operacin.

Captulo 3

Desarrollo del sistema


En este captulo se va a presentar todo lo relativo al proceso de diseo y desarrollo del sistema, entendiendo como tal, el proceso de concepcin del mismo, as como el establecimiento de los requisitos, los posibles casos de usos y los diagramas de ujo y de clases de la aplicacin. Tambin se discutirn las distintas decisiones de implementacin, tales como el lenguaje de programacin y el entorno de desarrollo.

3.1.

Diseo del sistema

La televigilancia permite mediante un dispositivo (dispositivo mvil con Android en este caso), visualizar cmaras desde cualquier lugar, slo con disponer de acceso a Internet, ya se va WiFi o con tarifa de datos, para visualizar entornos diversos como empresas, comercios, hogares, etc... proporcionando adems acceso para recuperar imgenes grabadas o en tiempo real. El envo las imgenes captadas por las cmaras IP, travs de la red, lo realizan ellas mismas o mediante servidores web de vdeo. Toda la informacin de vdeo que estn captando en ese momento, se analizan con Motiony se almacenan en un disco duro para poder se recuperadas para el historial. Gracias a ello podemos ver de forma remota, desde cualquier lugar, la zona a vigilar, grabar de imgenes, simplicar la supervisin de personal, supervisin de espacios, abiertos y cerrados... Con este proyecto se pretende ofrecer un sistema sencillo y bsico, compuesto por las cmaras IP especicadas anteriormente, un PC que hace las veces de servidor y dispositivos con el Sistema Operativo Android. A pesar de ser un sistema muy concreto, lo que puede hacer caer en el error de pensar que no se trata de una aplicacin que pueda llegar a un gran nmero de usuarios, se trata de una aplicacin totalmente abierta soportada por una tecnologa emergente que pretende hacerse fuerte en el mercado de la tecnologa porttil.

45

46

CAPTULO 3. DESARROLLO DEL SISTEMA

3.1.1.

Requisitos

A continuacin se muestran los requisitos de la aplicacin, obtenidos teniendo en cuenta las necesidades del proyecto y de las limitaciones, hardware y software, que planteaban Android, Motion y DSS.

1. Es necesario tener acceso a una red de datos, preferiblemente Wi.

2. Deber haber sucientes nmeros de acceso para que la cobertura de la zona a cubrir sea la adecuada.

3. El visionado de las cmaras no puede ser con applets ya que la JVM que lleva incorporada Android es parcial y no los soporta.

4. En la URL de la cmara slo deben aparecer las imgenes del streaming para que Motion pueda realizar el tratamiento de las mismas.

5. Las direcciones de las cmaras y los servidores deben ser introducidas por los usuarios cuando se realice la conguracin del sistema.

6. Los cheros de vdeo del historial sern de un minuto para evitar que tarden tiempo en cargarse, ya que el tiempo en estas aplicaciones es un factor crtico.

7. Se guardarn cheros de vdeo grabados como mucho una hora atrs. An as, esto depender de la capacidad de almacenamiento del sistema.

8. El servidor de vdeo debe hacer el streaming de los cheros mediante el protocolo RTSP.

9. Versin mnima del sistema operativo Android: 1.5

3.1.2.

Arquitectura servidor

En esta seccin se muestra la arquitectura del sistema en la gura 3.1, haciendo nfasis en la parte del servidor. En l, se puede ver como la cmara realiza el streaming de las imgenes, las cuales, aparte de recibirlas el dispositivo mvil, tambin son captadas por Motion. ste, las analiza y graba, en vdeos de sesenta segundos, y posteriormente, las deja accesibles para que el servidor de streaming

3.1. Diseo del sistema

47

DSS pueda acceder a ellas, y enviarlas cuando llegue la peticin correspondiente.

Figura 3.1: Arquitectura del sistema En la otra parte del sistema se encuentra el dispositivo mvil, que recibe las imgenes de la cmara cuando solicita la visualizacin en directo, o las imgenes del servidor DSS cuando pide ver el historial almacenado.

3.1.3.

Funciones del programa

A continuacin se detallan las caractersticas que han de tener los distintos elementos de la aplicacin:

Cmaras IP Hemos de tener un chero de conguracin en el que se detallen las direcciones IP de cada una de las cmaras para poder acceder a ella. As mismo, se tendr la posibilidad de editar el chero, aadiendo y borrando las direcciones que se estime conveniente. Aqu, tendremos la opcin, mediante una lista, de escoger la cmara que queremos visualizar en directo o de la cual queremos acceder a su historial. Servidores Tambin hemos de tener un chero de conguracin en el que se detallen las direcciones IP de cada una de los servidores para poder acceder a los videos de historial grabados por cada una de las cmaras. Asimismo, se tendr la posibilidad de editar el chero, aadiendo y borrando las direcciones que se estime conveniente. Aqu, tendremos la opcin, mediante una lista, de escoger

48

CAPTULO 3. DESARROLLO DEL SISTEMA

el servidor que queremos utilizar. Web El programa podr visualizar en una ventana cualquier cmara IP seleccionada. Podr hacer zoom (tanto alejar como acercar), adems de pausar y reanudar la visualizacin de las imgenes. Historial El programa, despus de seleccionar una cmara, un minuto de los ltimos 60 y un servidor, podr visualizar mediante streaming un vdeo grabado y almacenado en un servidor. Para ello ser hace una peticin RTSP, y mediante un reproductor podemos ver el vdeo seleccionado. Caractersticas principales La aplicacin debe tener un alto grado de manejabilidad, es decir, debe que ser fcil de usar por cualquier tipo de usuario. Tiene que ser intuitiva de forma que pueda ser manejada con rapidez y agilidad. Adems debe de ser able y de evitar los errores. El usuario ser capaz de dar de alta y eliminar, tanto cmaras como servidores, adems de la visualizacin en directo o de un historial grabado servido por streaming. Limitaciones El sistema que se trata de construir ha de funcionar en cualquier dispositivo que use como sistema operativo Android y con el software que se proporciona no se necesitar ni hardware ni software adicional. Adems, el dispositivo tendr que disponer de una tarjeta de red capaz de detectar redes Wi-Fi, o tener una tarifa de datos, de forma que pueda acceder a internet con el n de visualizar las cmaras o los videos del historial. Para un funcionamiento adecuado ser necesario hacer un estudio del tiempo que tarda en servirse el streaming, para as poder realizar una codicacin del video en su grabacin, que sea de una calidad suciente y que no sea demasiado pesado para que se pueda cargarse en el menor tiempo posible.

3.1.4.

Funcionamiento de la aplicacin

El funcionamiento del sistema se podra representar mediante el siguiente diagrama, gura 3.2

3.1. Diseo del sistema

49

Figura 3.2: Diagrama de casos de uso Caso 1: el usuario inicia la aplicacin y accede al menu "Gestor", desde donde puede realizar la gestin de las distintas cmaras, as como proceder al visionado de las mismas o a las grabaciones de historial. Caso 2: el usuario accede al men de "Servidores"desde donde realiza su gestin y elige uno para su uso. Caso 3: el usuario accede a la parte "Web"desde donde podr ver las imgenes emitidas por las distintas cmaras en directo. Caso 4: el usuario podr ver las grabaciones de las cmaras mediante un servicio de streaming.

3.1.5.

Seguridad

Actualmente la seguridad que ofrece la aplicacin son los rewall de los routers y de la red del departamento de Telemtica, WLIT y la seguridad de la red Wi-Fi UC3M. El uso de la aplicacin no supone un compromiso para la seguridad de estas redes puesto que no se estn enviando datos desde el dispositivo a la red, simplemente se est obteniendo informacin de la misma. Como lneas futuras de trabajo, se puede llevar un registro de las personas que acceden al sistema mediante un sistema de autenticacin que se instalara en la aplicacin.

3.1.6.

Planteamiento del problema

El problema principal a resolver es el establecimiento de un circuito de vigilancia de un entorno determinado. Para ello necesitamos las cmaras de seguridad as como

50

CAPTULO 3. DESARROLLO DEL SISTEMA

dispositivos con Android, que sern con los que podamos visualizar dichas cmaras. Adems, necesitaremos un servidor de vdeo, en el que se almacene el historial de grabacin y nos lo sirva cuando lo requiramos. Las ventajas de implementar el sistema de esta forma es el ahorro de costes de material, ya que toda la parte de pantallas y servidores nos la podemos ahorrar. l nico material hardware que necesitamos es: las cmaras de seguridad (indispensable en cualquier sistema), un PC que haga de servidor, as como los dispositivos mviles con Android.

3.2.

Decisiones de implementacin

A continuacin se detallan decisiones relativas a la estructura de la aplicacin, la interfaz grca y del tratamiento de los cheros que contienen los datos de las direcciones de las cmaras y lo servidores.

1. Se ha decidido separar la funcionalidad de forma que tengamos los gestores tanto de las cmaras como de los servidores y asociados a cada uno de ellos, las opciones de visualizar las cmaras o el historial.

2. Interfaz grca: Aunque tcnicamente es posible crear y adjuntar los widgets para nuestra actividad tan solo a travs de Cdigo Java, el enfoque ms comn es utilizar scripts basados en un diseo XML. La llamada dinmica de instancias de widgets se reserva para situaciones ms complejas, donde los widgets no se conocen en tiempo de compilacin. Como su nombre indica, un diseo basado en XML es una especicacin de widgets, las relaciones de cada uno de ellos con el resto y con sus contenedores, todo esto codicado en formato XML. La mayora de todo lo que se puede hacer en archivos de diseo de XML se puede lograr a travs de Java. Por ejemplo, se podra utilizar setTypeface() para tener un botn que tuviese su texto en negrita, en lugar de utilizar una propiedad en un esquema XML. Quizs la razn ms importante para usar una interfaz grca basada en XML es la ayuda que se obtiene gracias a la creacin de herramientas para la denicin de la vista de la aplicacin. Una de estas herramientas es el constructor de GUI para el entorno de desarrollo de Eclipse. Otra herramienta que se puede encontrar en internet es DroidDraw. Si la informacin se encuentra estructurada y ordenada es ms sencillo crear la interfaz grca en un chero

3.3. Implementacin

51

XML, que en cdigo Java. Por otro lado, al estar separado la parte grca del cdigo de Java facilita la labor a posibles desarrolladores secundarios, que trate de reinterpretar y modicar el cdigo. Adems, XML como un formato de denicin de interfaz grca de usuario es cada vez ms comn. Como ejemplos tenemos XAML2 de Microsoft, Flex3 de Adobe, y XUL4 de Mozilla. Todos tratan de adoptar un enfoque similar al de Android: poner el diseo grco en un archivo XML.

3. Ficheros: En el caso de los cheros de conguracin de las direcciones IP tanto de las cmaras como de los servidores de vdeo, se ha optado por elegir un archivo de texto simple, sin formato. La eleccin de este archivo se debe a que de los editores de texto sus archivos son los de menor tamao. Las direcciones se almacenarn de forma consecutiva, separadas por un retorno de carro. A la hora de guardar los archivos, Android ofrece la posibilidad de guardarlos en la propia aplicacin, lo cual resulta muy til para tener todo ordenado y almacenado en el mismo paquete del programa. An as se eligi por aadirlos en la tarjeta de memoria externa, en el directorio raz. Con esto se consigue disponer de los archivos siempre que se necesiten y adems, al estar en el directorio raz, no ser necesario crear nuevas carpetas. Se ha optado por un chero de texto y no una base de datos por las siguientes razones. La primera y principal, es que un usuario que quisiese acceder a los datos tendra que tener conocimientos de programacin para poder volcar el contenido de la base de datos en un chero. La segunda razn es que la base de datos de Android, SQLite, est implementada en bibliotecas de C y habra que crear unas nuevas bibliotecas en Java. Esto supondra un aumento del tiempo de trabajo y la complejidad del proyecto sin ser un objetivo del proyecto la creacin de bibliotecas para el manejo de la base de datos.

3.3.

Implementacin

En esta seccin se analizan brevemente el lenguaje de programacin usado para desarrollar en la plataforma Android, as como el entorno de desarrollo. Posteriormente, se muestran los diagramas de ujo de cada una de las partes de la aplicacin y el diagram de clases de la misma.

52

CAPTULO 3. DESARROLLO DEL SISTEMA

3.3.1.

Lenguaje de programacin y entorno de desarrollo

El lenguaje de programacin sobre el que se desarrolla en Android es Java. Aunque las aplicaciones se escriben en en este lenguaje, los archivos y libreras de bajo nivel estn escritas en C/C++. Para programar en Android es necesario descargar el SDK proporcionado por Google, el cual contiene el conjunto de desarrollo y los paquetes necesarios para implementar aplicaciones para Android. Este paquete incluye las APIs y herramientas necesarias para desarrollar las aplicaciones utilizando Java como lenguaje de programacin, el cual es el lenguaje utilizado en este proyecto n de carrera.

3.3.2.

El entorno de desarrollo

Eclipse es un entorno de desarrollo integrado de cdigo abierto multiplataforma para desarrollar lo que el proyecto llama Aplicaciones de Cliente Enriquecido, opuesto a las aplicaciones Cliente-liviano basadas en navegadores. Esta plataforma, tpicamente ha sido usada para desarrollar entornos de desarrollo integrados, como el IDE de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se entrega como parte de Eclipse (y que son usados tambin para desarrollar el mismo Eclipse) [20]. Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de herramientas para VisualAge. Eclipse es ahora desarrollado por la Fundacin Eclipse, una organizacin independiente sin nimo de lucro que fomenta una comunidad de cdigo abierto y un conjunto de productos complementarios, capacidades y servicios [20]. Los widgets de Eclipse estn implementados por una herramienta de widget para Java llamada SWT, a diferencia de la mayora de las aplicaciones Java, que usan las opciones estndar Abstract Window Toolkit (AWT) o Swing. La interfaz de usuario de Eclipse tambin tiene una capa GUI intermedia llamada JFace, la cual simplica la construccin de aplicaciones basada en SWT [20]. El entorno de desarrollo integrado (IDE) de Eclipse emplea mdulos para proporcionar toda su funcionalidad al frente de la plataforma, a diferencia de otros entornos donde las funcionalidades estn todas incluidas, las necesite el usuario o no. Este mecanismo de mdulos es una plataforma ligera para componentes de software. Adicionalmente a permitirle a Eclipse extenderse usando otros lenguajes de programacin como son C/C++ y Python, permite a Eclipse trabajar con lenguajes para procesado de texto como LaTeX, aplicaciones en red como Telnet y Sistema de gestin de base de datos. La arquitectura plugin permite escribir cualquier extensin deseada, como sera Gestin de la conguracin. Se provee soporte para Java y CVS en el SDK de Eclipse [20]. En cuanto a las aplicaciones clientes, eclipse provee al programador con fra-

3.3. Implementacin

53

meworks para el desarrollo de aplicaciones grcas, denicin y manipulacin de modelos de software, aplicaciones web, etc. Por ejemplo, GEF (Graphic Editing Framework - Framework para la edicin grca) es un plugin de Eclipse para el desarrollo de editores visuales que pueden ir desde procesadores de texto hasta editores de diagramas UML, interfaces grcas para el usuario (GUI), etc. Dado que los editores realizados con GEF viven dentro de Eclipse, adems de poder ser usados conjuntamente con otros plugins, hacen uso de su interfaz grca personalizable y profesional [20]. El SDK de Eclipse incluye las herramientas de desarrollo de Java, ofreciendo un IDE con un compilador de Java interno y un modelo completo de los archivos fuente de Java. El IDE tambin hace uso de un espacio de trabajo, en este caso un grupo de metadata en un espacio para archivos plano, permitiendo modicaciones externas de los archivos en tanto se refresque el espacio de trabajo correspondiente [20]. Eclipse permite extender su funcionalidad a travs del plugin de Android, de forma que slo hay que preocuparse por escribir el cdigo, ya que l congura el proyecto de forma que se pueda compilar o ejecutar de forma similar a otros proyectos Java. Adems del cdigo propio de la aplicacin que se realiza, se necesitan otras paquetes desarrollados por Google que se encuentran en el SDK de Android y permiten acceder a distintas funciones de la plataforma. Adems del cdigo propio de la aplicacin, se necesitan otros tres archivos que estn relacionados entre s: un archivo xml para la interfaz grca, el AndroidManifest.xml y un archivo R.java que genera la aplicacin automticamente y sirve para referenciar cualquier recurso de los xml anteriores [20].

3.3.3.

Diagramas de ujo

Este sistema de videovigilancia esta compuesto por dos partes bien diferenciadas: la parte hardware(cmaras IP, servidor vdeo y dispositivos Android), y la parte software (aplicacin para la gestin de las cmaras y de la grabacin). A su vez, el software de la aplicacin lo podemos dividir en 4 partes: la gestin de las cmaras (aadir y eliminar), gestin de los servidores (aadir y quitar), visualizacin de la cmara seleccionada y el visor de historial.

Gestor Clase encargada de la gestin de las cmaras de seguridad (ver diagrama de ujo en la gura 3.3). En l se muestra una lista de cmaras que se obtiene de la lectura de un chero de conguracin. El chero de conguracin puede estar cargado previamente en la tarjeta SD o se puede editar desde el mismo programa. Para ello existen en el botn men las

54

CAPTULO 3. DESARROLLO DEL SISTEMA

opciones de aadir o borrar. Al aadir, aparecer una ventana en la que habr que aadir la direccin IP de la cmara. Esta se aadir al nal de la lista con un nmero correlativo al ltimo registrado. Para borrar, bastar con indicar el nmero de la cmara que se desea eliminar.

A modo informativo, si se pulsa sobre una cmara, aparecer un texto en el que se indica el nmero de cmara y la direccin IP de la misma: Cmara X: XXX.XXX.XXX.XXX

En el men, aparte de las opciones de aadir y borrar mencionadas anteriormente, aparecer la opcin Video Server, la cual nos lleva al gestor de servidores.

Adems de todo ello, se muestran dos botones en pantalla, cmara e historial, los cuales solo funcionan si previamente se ha seleccionado una cmara. Una vez seleccionada una, con cmara accedemos al visualizado de la misma, y si elegimos historial, pasaremos a ver la grabacin del minuto seleccionado.

Figura 3.3: Diagrama de ujo de la clase Gestor

3.3. Implementacin

55

Servidor Clase encargada de la gestin de los servidores de vdeo (ver diagrama de ujo en la gura 3.4). En l se muestra una lista de direcciones IP de cada uno de los mismo, la cual se obtiene de la lectura de un chero de conguracin. El chero de conguracin puede estar cargado previamente en la tarjeta SD o se puede editar desde el mismo programa. Para ello existen en el botn men las opciones de aadir o borrar. Al aadir, aparecer una ventana en la que habr que aadir la direccin IP del servidor. Esta se aadir al nal de la lista. Para borrar, bastar con indicar el nmero del servidor que se desea eliminar. A modo informativo, si se pulsa sobre un servidor, aparecer un texto en el que se indica la direccin IP del mismo.

Figura 3.4: Diagrama de ujo de la clase Servidor Web Clase que nos permite el visualizado de las cmaras en directo (ver diagrama de ujo en la gura 3.5). Aqu se accede desde el men Gestor, despus de haber seleccionado una cmara. Existen las posibilidades de hacer zoom digital, moviendo el pad a izquierda o derecha adems de pausar o reanudar el visionado sin ms que presionar en el botn correspondiente.

56

CAPTULO 3. DESARROLLO DEL SISTEMA

Figura 3.5: Diagrama de ujo de la clase Web Vdeo Clase que permite el visionado en streaming de un vdeo de un minutos sobre los ltimos sesenta (ver diagrama de ujo en la gura 3.6). Para acceder a esta parte de la aplicacin, primero hay que seleccionar una cmara, un minuto del historial y elegir un servidor en los que pueda estar alojado el vdeo. Una vez comenzada la reproduccin se podr pausar o reanudar con los botones correspondientes, adems de pasar al siguiente minuto o al anterior con los botones dispuestos a tal efecto.

Figura 3.6: Diagrama de ujo de la clase Vdeo Ficheros Clase dispuesta para el tratamiento de los cheros de conguracin de las cmaras y los distintos servidores. Permite tanto aadir como borrar, as como buscar y modicar.

3.3. Implementacin

57

3.3.4.

Diagramas de clases

Como se puede ver en el diagrama, gura 3.7, existen cuatro actividades en esta aplicacin, por lo que tenemos cuatro pantallas distintas de funcionamiento. La primera pantalla est desarrollada a travs de la clase Gestor que extiende de la interfaz Activity. En esta actividad se muestra la lista de cmaras del sistema. Con ella podemos dar de alta y de baja las cmaras, y seleccionar la opcin que deseamos, es decir, ver una cmara en directo o el historial de alguna de ellas. Para realizar estas tareas de altas y bajas de los dispositivos, utilizamos la clase Ficheros que es la que nos permite realizar la lectura del chero de conguracin para cargarlas as como realizar las distintas modicaciones. Adems, contamos con la clase anidada GestorAdapter, que nos permite gestionar la lista de elementos que se muestra en pantalla. La segunda es la clase servidor que extiende la interfaz Activity, mostrando la lista de servidores del sistema. Aqu tambin podemos darlos de alta y de baja. Para realizar estas tareas de altas y bajas de los dispositivos, al igual que en la clase Gestor, utilizamos la clase Ficheros, que es la que nos permite realizar la lectura del chero de conguracin para cargar los servidores as como realizar las distintas modicaciones. Adems, aqu tambin contamos con la clase anidada GestorAdapter, que nos permite gestionar la lista de elementos que se muestra en pantalla. La tercera es la clase Web, que tambin extiende Activity, mostrando las imgenes de la cmara IP seleccionada, as como realizar zoom, pausar el visionado,etc. Para ello cuenta con un elemento llamado WebKit, que es un navegador open source al cual se le pueden ir aadiendo funcionalidades segn las necesidades, y que nosotros personalizamos para poder visionar las distintas cmaras. La cuarta es la clase Rtsp, que tambin extiende de Activity, implementando el visor del vdeo del historial, implementada gracias al streaming mediante RTSP. En ella, podemos pausar y reanudar el streaming. Para ello usamos un reproductor multimedia que soporta dicho streaming gracias a este protocolo de transmisin de datos. Estas cuatro clases son las vistas principales de la aplicacin. La pantalla que se carga de forma inicial es la de la clase Gestor. Est considerada como el men principal, desde el cual se puede dirigir uno a visualizar las cmaras, acceder al men de servidores para realizar las gestiones oportuna o visualizar el historial, adems de las operaciones propias de alta y baja de las cmaras. Adems, desde esta clase, es desde la nica desde la que se puede salir de la aplicacin. A la clase Web, que es donde se ven las cmaras, slo se puede acceder desde la clase Gestor, por lo que, al salir de ella, tambin se va a parar en ella. Es decir, Web solo se relaciona con Gestor.

58

CAPTULO 3. DESARROLLO DEL SISTEMA

Figura 3.7: Diagrama de clases de la aplicacin

3.4. Conclusiones

59

Con la clase Rtsp es un caso similar a Web. Para llegar a ella, se puede acceder desde Gestor (siempre que haya seleccionado un servidor previamente), o desde Servidores (siempre que primero se haya seleccionado una cmara y un tiempo de historial). Pero al salir de ella, se llega nicamente a la clase de los servidores. A la clase Servidores se puede acceder desde el men gestor, para realizar las tareas de gestin de los servidores que se consideren oportunas o desde el visor del historial (clase Rtsp) al salir de ella. Y desde Servidores se puede volver a Gestor con la que mantiene una relacin bidireccional, por cuestiones de trato y funcionamiento prcticamente idnticos, y a el visor Rtsp cuando previamente se ha seleccionado una cmara y un momento del historial. Por otro lado tenemos las clases que nos sirven de apoyo para que las cuatro principales realizan su funcin correctamente, las cuales ya hemos comentado de forma somera anteriormente. La clase Ficheros nos proporciona los mtodos necesarios para escribir en los cheros y gestionar as las altas y bajas de cmaras y servidores de las clases Gestor y Servidor, as como sus distintas modicaciones. La clase Registro nos proporciona la base para representar cada uno de los elementos que conforman las distintas listas de cmaras y servidores. Y por ltimo tenemos la clase anidada GestorAdapter, que nos permite gestionar los cambios realizados en las listas, mostrando las altas y las bajas en la pantalla.

3.4.

Conclusiones

El sistema se ha diseado de forma que su uso sea fcil e intuitivo. Se ha buscado la claridad y que el usuario pueda personalizarlo pudiendo dar de alta y de baja, tanto cmaras como servidores. Por otra parte, para realizar esta aplicacin, el entorno de desarrollo Eclipse, ha sido muy til ya que proporciona un plugin que permite emular el dispositivo, para poder hacer as las pruebas necesarias. Adems, la forma que tiene de organizar las clases en una estructura de rbol, as como de organizar los distintos recursos y cheros generados, facilita enormemente la labor del desarrollador. En cuanto al lenguaje de programacin, Java facilita mucho las cosas, ya que es sencillo de manejar. Adems, la parte grca de la aplicacin, al realizarse en .xml simplica la creacin de las distintas interfaces visuales del programa, ya que Eclipse muestra en una ventana como quedara la interfaz segn se va escribiendo el chero .xml, ya que evita tener que estar ejecutando constantemente la aplicacin para ver si el desarrollo es el deseado.

Captulo 4

Pruebas y resultados
En este captulo se van a presentar las pruebas realizadas a las distintas partes sistema. Tambin se presentar un anlisis de los resultados obtenidos y valoracin de los mismos.

4.1.

Entorno de pruebas

El lugar de pruebas es un recinto cerrado. En l se tiene una cmara IP y un router conectados a un PC. El router ejerce de punto de acceso del dispositivo mvil a la red y el PC como servidor de los vdeos del historial. Se van a realizar tres tipos de pruebas:

La primera es la vericacin del funcionamiento global del sistema, es decir, ver que se gestionan correctamente las altas y bajas de cmaras y servidores, el paso de una pantalla a otra, los visionados de las cmaras y los servidores, los distintos mensajes, etc.

La segunda prueba es obtener el tiempo que tarda en comenzar la visualizacin de los videos. La razn es que vamos a estudiarlo con distintas calidades para elegir una relacin calidad-tiempo que nos permita alcanzar unos mnimos en ambos aspectos. Por ltimo, las medidas de tiempo de cuanto se tarda en ver todo el vdeo. Esto es debido a que al ser de distinta calidad los videos, los procesos de buering del streaming, sern ms lentos y por lo tanto distintos.

La tercera es mostrar pantallazos de la aplicacin para vericar de forma visual el correcto funcionamiento de la parte visual de la misma.

61

62

CAPTULO 4. PRUEBAS Y RESULTADOS

A la hora de realizar las pruebas, hemos utilizado unos videos de prueba que vienen con el Darwin Stream Server. En la tabla anterior, 4.1, se muestran dichos archivos y sus caractersticas principales. Nombre sample_50kbit.3gp sample_100kbit.mp4 sample_300kbit.mp4 sample_h264_100kbit.mp4 sample_h264_300kbit.mp4 sample_h264_1mbit.mp4 Tasa 50 kb/s 100 kb/s 300 kb/s 100 kb/s 300 kb/s 1000 kb/s Tamao 589.4 Kb 911.6 Kb 2.3 Mb 976 Kb 2.4 Mb 8.5 Mb

Cuadro 4.1: Ficheros de video de prueba

4.2.

Resultados

1. Funcionalidad general: vericar que los pasos entre pantallas, mensajes, altas y bajas de cmaras y servidores funciona correctamente. En la tabla 4.2 se muestra un listado de las funcionalidades comprobadas. Funcionalidad Carga gestor Carga servidores Carga web Carga rtsp Alta cmara Baja cmara Pausa web Zoom web Paso de gestor a servidores Siguiente video Anterior video Play video Stop video Resultado             

Cuadro 4.2: Vericacin de la funcionalidad general

2. A continuacin se muestran algunos pantallazos de la aplicacin para poder ilustrar el funcionamiento del sistema.

4.2. Resultados

63

(a) Men gestor

(b) Men de servidores

Figura 4.1: Ejecuciones

En las guras 4.1.a y 4.1.b se pueden ver los mens de gestin y de los servidores. Se observa como en cada uno de ellos se muestran las listas de las cmaras registradas en el sistema, as como los distintos servidores para realizar el streaming.

(a) Direccin IP de la cmara

(b) Men de servidores

Figura 4.2: Ejecuciones

En las guras 4.2.a y 4.2.b se pueden ver los mensajes emergentes que indican la direccin IP de la cmara seleccionada y el men para salir de la aplicacin.

64

CAPTULO 4. PRUEBAS Y RESULTADOS

(a) Men de la pantalla gestor

(b) Men de la pantalla servidores

Figura 4.3: Ejecuciones En las guras 4.3.a y 4.3.b se pueden ver los mens que aparecen cuando se pulsa la tecla Men en cada una de los dos pantallas principales. En el men del gestor se tienen las opciones de dar de alta y baja las cmaras, as como de pasar al men de los servidores. En el men de ste tenemos las opciones de dar de alta y bajo los servidores de vdeo.

(a) Men de la pantalla gestor

(b) Men de la pantalla servidores

Figura 4.4: Ejecuciones En las guras 4.4.a y 4.4.b se pueden ver las pantallas emergentes que aparecen al seleccionar dar de alta o baja una cmara o un servidor. Si es la opcin de dar de alta, se debe poner la direccin IP del elemento, con el formato

4.2. Resultados

65

xxx.xxx.xxx.xxx. Si por el contrario se quiere dar de baja, se tiene que introducir su nmero identicador de posicin.

(a) Men de la pantalla gestor

(b) Men de la pantalla servidores

Figura 4.5: Ejecuciones En las guras 4.5.a y 4.5.b se observan los mensajes emergentes que indican que la direccin IP introducida es incorrecta y que no se puede realizar ninguna operacin de visionado en directo o en diferido sin haber seleccionado previamente una cmara.

(a) Men de la pantalla gestor

(b) Men de la pantalla servidores

Figura 4.6: Ejecuciones En las guras 4.6.a y 4.6.b se pueden ver la ventana emergente en la que se

66

CAPTULO 4. PRUEBAS Y RESULTADOS

tiene que indicar que minuto de la grabacin que se quiere ver, y el mensaje emergente que indica que se ha seleccionado un servidor de vdeo sin haber seleccionado previamente una cmara.

(a) Men de la pantalla gestor

(b) Men de la pantalla servidores

Figura 4.7: Ejecuciones En las guras 4.7.a y 4.7.b se observan los ejemplos de visualizacin en directo de distintas cmaras.

(a) Vista cmara IP

(b) Vista de la pantalla de vdeo de historiales

Figura 4.8: Ejecuciones En las guras 4.8.a y 4.8.b se pueden ver las pantallas de visualizacin en directo y en diferido justo antes de cargar las imgenes correspondientes.

4.2. Resultados

67

3. Estudio del tiempo de inicio de streaming en funcin de la tasa de codicacin del vdeo, gura 4.9.

Figura 4.9: Tiempo de comienzo del streaming Como se puede observar los tiempos son bastante similares, siendo ms elevados los que tienen una tasa de codicacin mayor.

4. Estudio del tiempo de duracin de streaming en funcin de la tasa de codicacin del vdeo, gura 4.10. Como se puede ver, segn aumenta el tamao del archivo, es necesario tener mayor tiempo de buering para poder visualizarlo. Despus de esta prueba, hemos podido comprobar, que si bien a mayor tasa mayor es la denicin del vdeo, ste no se ve de forma uida, sino que va dando cortes. Por ello, viendo la relacin entre la calidad de visualizacin y los tiempos de carga, los formatos ms apropiados para nuestra aplicacin seran sample_100kbit.mp4 y sample_300kbit.mp4.

68

CAPTULO 4. PRUEBAS Y RESULTADOS

Figura 4.10: Tiempo total de streaming

4.3.

Conclusiones

A la vista de los resultados obtenidos tras las realizacin de las pruebas, se pueden obtener dos conclusiones. La primera es que la funcionalidad general de la aplicacin es correcta, ya que la navegacin entre las distintas pantallas y mens se realiza de forma gil y sin errores. La segunda es que el tamao y la tasa de codicacin de las grabaciones inuyen en los tiempos de streaming, por lo que se debe llegar a un compromiso entre calidad y el tiempo para servir el vdeo, de forma que calidad del servicio de televigilancia no se vea comprometido. As, la eleccin de los parmetros de calidad de servicio (calidad del vdeo y tiempos de transmisin) depender de la red sobre la que se transmita dicho vdeo. Si se dispone de unas instalaciones en las que la velocidad de descarga sea lo sucientemente elevada, se podr optar por una codicacin de una tasa ms alta y con mayor denicin. Si no es el caso, habr que ajustarlo de forma que el vdeo se reproduzca de forma uida y sin cortes.

Captulo 5

Conclusiones y lneas futuras


5.1. Conclusiones

En este proyecto se ha creado un prototipo de sistema de videovigilancia utilizando dispositivos con sistema operativo Android y la infraestructura de cmaras IP del departamento de Telemtica de la Universidad Carlos III de Madrid. Se ha conseguido implementar el desarrollo completo del sistema con herramientas Open Source lo que lo hace accesible a todo el mundo. Se ha tratado de realizar un diseo eciente en el que no interviniesen ms dispositivos de los necesarios para abaratar costes, por ello, aparte del dispositivo mvil, solo se ha utilizado un PC que acta como servidor de vdeo RTSP y para alojar el programa Motion que procesa las imgenes recibidas por las cmaras. El uso de un chero de texto sin formato para almacenar las direcciones IP de los servidores como de las cmaras, hace que sea ms manejable ya que ocupan menos espacio que cualquier otro formato. El sistema operativo sobre el que se ejecutan las aplicaciones es Android. Esto implica que al ser libre, se pueden aadir mdulos para distintas funcionalidades as como las modicaciones que se crean necesarias. Los mayores problemas encontrados en la realizacin del proyecto vinieron derivados de la interaccin del dispositivo mvil con el servidor de vdeo, ya que Android solo soporta dos formatos de vdeo: .3gp y .mp4. Otro de los grandes problema fue el streaming para recibir vdeo, ya que Android no lo soporta y hubo que emplear el protocolo RTSP para llevarlo acabo, por lo que hubo que encontrar un servidor con dicho protocolo para servir el vdeo. Tambin se han tenido problemas con las cmaras IP, ya que las cmaras Axis, para visualizarlas, hacen falta applets, y la JVM que lleva incorporada Android es parcial, no los soporta y por lo tanto no se podan ver las imgenes, por lo que es necesario que las cmaras emitan en streaming. 69

70

CAPTULO 5. CONCLUSIONES Y LNEAS FUTURAS

Es necesario tener en cuenta la capacidad de la red para enviar el vdeo, ya que hay que dividir su capacidad por el nmero de usuarios que soliciten el historial al vez. A la hora del diseo de la infraestructura habra que especicar unos requisitos de servicio mnimo en el caso peor. Este tema es crtico ya que el tiempo de visionado del vdeo puede ser crucial cuando se produzca una alarma.

5.2.

Lneas futuras de trabajo

Las ideas principales para el futuro son:

1. Reconocimiento facial. Con esto se pretende que se remarque la cara del individuo que ha hecho saltar las alarmas de seguridad. 2. Conexin con una base de datos de la polica de forma que si el individuo est chado, poder acceder a su identidad. 3. Mayor nmero de formatos soportados por Android para la visualizacin del historial. Con ello se pretende tener ms opciones a la hora de codicar y ver el vdeo. 4. Manejar el movimiento de las cmaras desde el dispositivo mvil. Con esto podramos ver zonas del recinto que no se cubren de forma habitual con el n de realizar alguna vericacin. 5. Incorporacin de plugin que permita la visualizacin de las cmaras en applets. La ventaja es que con ello podramos ver cualquier tipo de cmara IP Axis. 6. Sistema de autenticacin. Con ello se pretendera que al sistema solo accediese personal autorizado de seguridad. Con ello se podran prevenir ataques exteriores para daar el funcionamiento del sistema. 7. Registro de las personas que acceden al sistema mediante el sistema de autenticacin citado en el punto anterior.

Captulo 6

Presupuesto
En el presente captulo se presenta un clculo aproximado del coste de este proyecto. Para la evaluacin de dicho coste es necesario un desglose del proyecto en tareas, a travs de la planicacin del mismo y la evolucin temporal que sigue. Cada tarea ser cuanticada en funcin de su duracin y los recursos consumidos, proporcionando de manera global un presupuesto aproximado del trabajo desarrollado.

6.1.

Descomposicin de actividades

A continuacin se exponen las cinco tareas llevadas a cabo: Fase 1: Documentacin para realizar el proyecto y estudio del estado del arte. Fase 2: Implementacin de la aplicacin. Fase 3: Instalacin y uso del servidor de streaming y el analizado de imgenes. Fase 4: Pruebas en entorno real. Fase 5: Documentacin y memoria. A continuacin pasamos a detallar ms en profundidad cada actividad y a especicar el tiempo que nos lleva cada una de ellas.

Fase 1: Documentacin para realizar el proyecto y estudio del estado del arte. a) Estudio de la plataforma Android y del entorno de desarrollo (Eclipse en este caso). Duracin 4 semanas. b) Bsqueda de servidores de vdeo y procesadores de imgenes. Comparacin de cada uno de ellos. Duracin 5 semanas. 71

72

CAPTULO 6. PRESUPUESTO

c) Realizacin de pequeos programas para familiarizarnos con la programacin del dispositivo y su funcionamiento. Duracin 3 semanas.

Fase 2: Implementacin de la aplicacin. a) Implementacin del gestor. Duracin 3 semanas. b) Implementacin de la clase servidor. Duracin 2 semana. c) Implementacin de la clase Web. Duracin 2 semanas. d) Implementacin de la clase Vdeo. Duracin 6 semanas. e) Implementacin de clases auxiliares. Duracin 1 semana.

Fase 3: Instalacin y uso del servidor de streaming y el analizado de imgenes. a) Estudio de la aplicacin Motion. Instalacin y uso. Duracin 2 semanas. b) Estudio de la aplicacin Darwin Stream Server. Instalacin y uso. Duracin 2 semana.

Fase 4: Pruebas en entorno real. a) Pruebas del correcto funcionamiento de la aplicacin. Duracin 2 semana. b) Pruebas relativas al servidor de vdeo RTSP y a Motion. Duracin 2 semana.

Fase 5: Documentacin y memoria. a) Redaccin de la memoria. Duracin 5 semanas. b) Correccin y revisin. Duracin 3 semana.

6.2. Resumen y duracin

73

6.2.

Resumen y duracin

En la siguiente tabla se muestra el resumen de las tareas realizadas y de su duracin.

Fase Documentacin para realizar el proyecto y estudio del estado del arte

Implementacin de la aplicacin

Instalacin y uso del servidor de streaming y el analizado de imgenes Pruebas en entorno real Documentacin y memoria TOTAL

Actividad a b c a b c d e a b a b a b

Duracin (semanas) 4 5 3 3 2 2 6 1 2 2 2 2 5 3 42

Cuadro 6.1: Tabla de tareas

6.3.

Presupuesto
PRESUPUESTO DEL PROYECTO

Autor: Ivn Alejandro Fernndez Pacheco Departamento: Ingeniera telemtica Descripcin del proyecto

Ttulo: DISEO Y DESARROLLO DE UN SISTEMA DE VDEOVIGILANCIA BASADO EN TECNOLOGA ANDROID Duracin (meses): 9.8 Presupuesto total del Proyecto (valores en Euros): 37045.66 euros

74

CAPTULO 6. PRESUPUESTO

Desglose presupuestario (costes directos)

Apellidos y Nombre

Categora

Estvez Ayres, Iria Manuela Fernndez Pacheco, Ivn Alejandro

Ingeniero senior Ingeniero TOTAL

Dedicacin (hombres/ mes) 1 9.8

Coste (hombre/ mes) 4289.54 2694.39

Coste(Euro)

4289.54 26405.02 30694.56

Cuadro 6.2: Costes directos personal

Descripcin PC Dispositivo mvil con Android PC (servidor)

Coste (Euro) 599 320 599

% Uso dedicado proyecto 100 100 100 TOTAL

Dedicacin (meses) 7 7 7

Periodo de depreciacin 60 60 60

Coste imputable 69.88 37.33 69.88 177.10

Cuadro 6.3: Costes equipos

Concepto Coste personal Amortizacin Costes indirectos (20 %) TOTAL

Presupuesto total(euros) 30694.56 177.10 6174 37045.66

Cuadro 6.4: Costes total

El coste total del proyecto es de treinta y siete mil cuarenta y cinco euros con sesenta y seis cntimos.

Legans, 22 de Junio de 2010

El ingeniero proyectista

Bibliografa
[1] Murphy, M.L., Beginning Android, 1a Edicin, Apress, Estados Unidos, 2009 [2] DiMarzio, J.F., Android. A programmers guide, 1a Edicin, McGraw Hill, Estados Unidos, 2008 [3] Android developers, Consulta ao 2009, <http://developer.android.com> [4] Open Handset Alliance, Industry Leaders Platform for Mobile Devices, Consulta <www.openhandsetalliance.com/press_110507.html> [5] Anddev, Consulta ao 2009, <www.anddev.org> [6] Android-Spa, Consulta ao 2009, <www.androidspa.com> [7] Pranevich, J., Consulta Noviembre 2008, <www.escomposlinux.org/wwol26/wwol26.html> [8] Motion-Web Home, Consulta Enero 2010, <www.lavrsen.dk/twiki/bin/view/Motion/WebHome> [9] Darwin Streaming Server <http://dss.macosforge.org/> , Consulta Febrero 2010, Announce Enero Open 2009,

[10] Wikipedia, Consulta Abril 2010, <http://es.wikipedia.org/wiki/RTSP> [11] IETF, Consulta Abril 2010, <www.ietf.org/rfc/rfc2326.txt> [12] Laboratorio Docente de Computacin, Universidad Simn Bolivar, RTSP, Consulta Abril 2010, <www.ldc.usb.ve/ poc/RedesII/Grupos/G10/transmision.htm> [13] Wikipedia, Consulta Mayo 2010, <http://es.wikipedia.org/wiki/Google> [14] Wikipedia, Consulta Diciembre 2008, <http://es.wikipedia.org/wiki/Android> [15] IETF, Consulta Marzo 2010, <www.ietf.org/rfc/rfc2326.txt> [16] Graca Paeda, X. y Melendi Palacio, D., Servicios de Comunicaciones, Consulta Abril 2010, <www.it.uniovi.es/docencia/SistemasOviedo/svccom/material/Tema4.pdf> [17] Salvacha, J. y Fumero, A., Aplicaciones y servicios multimedia, Consulta Abril 2010, <www.slideshare.net/jsalvachua/iba2008-servicios-296547> 75

76

BIBLIOGRAFA

[18] Apple, Por qu QuickTime?, <www.apple.com/es/quicktime/whyqt/>

Consulta

Junio

2009,

[19] Alvarez, M.A., Descubre la tecnologa que nos cia una Internet de radio y televisin., Consulta <http://www.desarrolloweb.com/articulos/482.php>

acerca haAbril 2010,

[20] Wikipedia, Consulta Abril 2010, <http://es.wikipedia.org/wiki/Eclipse_(software)>

Apndice A

Breve demostracin de ejecucin


A continuacin se muestran algunas salidas por pantalla al ejecutar el emulador de Android sobre Eclipse. Aqu mostramos la salida del programa ms sencillo, el HelloAndroid, gura A.1. Consiste en sacar por pantalla dicho mensaje. La pantalla negra es un LinearLayout, que es un elemento contenedor en el que se pueden posicionar distintos elementos, tales como etiquetas, botones, cuadros de texto, mens... El mensaje es una etiqueta en la que ya est escrito el mensaje.

Figura A.1: Ejecucin del Hello android 77

78

APNDICE A. BREVE DEMOSTRACIN DE EJECUCIN

Para realizar la conguracin de la pantalla y sus elementos se ha ha hecho mediante cdigo.XML, gura A.2. En el editor se especican los elementos, su ordenacin y su tamao.

Figura A.2: Cdigo XML Primero se coloca el LinearLayout que es la pantalla que lo contiene todo. Despus est el TextView que una etiqueta. El tamao de los elementos viene marcado por las etiquetas width y height. Si se utiliza el valor ll_parent, su tamao ser el mayor del contenedor padre en la direccin indicada. Si se pone wrap_content ser el ms pequeo posible. En el siguiente ejemplo, gura A.3, se muestra la salida del emulador, adems de los elementos anteriores, un botn y un cuadro para introducir texto.

Figura A.3: Ejecucin de un ejemplo sencillo Si nos jamos en el siguiente cdigo, gura A.4, vemos que todos los elementos se estructuran de forma jerrquica. Primero tenemos un LinearLayout que es el contenedor principal. Como podemos ver, dentro de l estn el resto de los elementos. Estos se ordenaran en vertical ya que as se lo indicamos en su atributo

79

Figura A.4: Cdigo XML android:orientation, dicindole que lo queremos en vertical. Dentro de este elemento tenemos en una primera lnea otro contenedor LinearLayout que a su vez contiene una etiqueta (TextView ) y un cuadro de texto (EditText ) dispuestos de forma horizontal, ya que lo indicamos en su atributo de orientacin. El tamao de cada uno de sus elementos ser el mnimo posible ya que se lo indicamos con wrap_content. Una vez tenemos situados los elementos en la pantalla, necesitamos tener algn tipo de referencia a ellos para poder usarlos y trabajar con ellos. Esto se consigue mediante el atributo android:id. Con este atributo y un segundo chero .XML en el que damos nombre y valores a los componentes, podemos referirnos a ellos para poder trabajar con ellos, gura A.5.

Figura A.5: Cdigo XML

80

APNDICE A. BREVE DEMOSTRACIN DE EJECUCIN

Como se puede observar hay unos atributos string name y un nombre entre comillas. Ese nombre es con el que referenciamos a los distintos elementos. Tambin podemos aadir un men que contenga la misma funcionalidad que los botones, gura A.6. Para ello hace falta sobreescribir el mtodo que nos proporciona Android que crea un men vaco. En el aadimos tantos elementos como queramos.

Figura A.6: Ejecucin del men

Para aadir los elementos al men hay que hacerlo programndolo en Java, gura A.7, y no mediante cdigo .XML como los objetos anteriores. Para ello se aadira el siguiente cdigo.

Figura A.7: Cdigo del men

Una vez construida la interfaz grca de la aplicacin deseada, tenemos que programar los distintos elementos para que realicen lo que nosotros queremos, gura A.8. Para ello tenemos que aadir manejadores o elementos que respondan a los eventos que se producen, tales como clicks de ratn, escritura...

81

Figura A.8: Manejador de eventos

Como podemos observar, creamos un objeto botn, referencindolo al que hemos creado en la interfaz grca. Posteriormente le aadimos en manejador de eventos, setOnClickListener, el cual, dentro de l, se programar las acciones que queremos que realice el botn cuando pinchemos en l.

Por ltimo, para completar esta miniaplicacin, tenemos que aadirle la funcin correspondiente a los elementos del men para que realicen la misma funcin que los botones, gura A.9. Para ello aadimos el siguiente cdigo.

Figura A.9: Cdigo para la funcionalidad del men

Como podemos observar, lo primero que hacemos es obtener el identicador del elemento del men sobre el que hacemos click, gura A.10. Una vez hecho esto, no tenemos ms que repetir el mismo cdigo que en los botones para que tengan la misma funcionalidad.

82

APNDICE A. BREVE DEMOSTRACIN DE EJECUCIN

(a) Men de android

(b) Internet en Android

(c) Google maps

Figura A.10: Algunas ejecuciones

Apndice B

Anlisis del API de Android


Si analizamos el ndice de los paquetes que se proporcionan para desarrollar aplicaciones nos encontramos lo siguiente[3]:

1. android: Clases usadas para las aplicaciones estndar de Android. 2. android.app: Clases de alto nivel que encapsulan el modelo de aplicacin de Android. Dentro de este paquete nos encontramos clases como:

Activity: una cosa sola, enfocada que el usuario puede hacer. ActivityGroup: pantalla que contiene mltiples activities embebidas. AlarmManager: clase que proporciona acceso a los sistemas de alarma. NoticationManager: clase que notica los eventos que ocurren. SearchManager: clase que proporciona acceso al sistema de servicios de bsqueda. Service: componente de aplicacin que corre en background, que no interactua con el usuario, durante un perodo indenido de tiempo.

3. android.content: Clases para acceso y publicacin de datos en el dispositivo. Algunas de las clases que contiene son:

BroadcastReceiver: recibe los Intents enviados por sendBroadcast.

83

84

APNDICE B. ANLISIS DEL API DE ANDROID

ComponentName: identicador para un componente de aplicacin especco. ContentProvider: uno de los bloques primarios de aplicacin de Android, preparado para contener aplicaciones. Intent: descripcin abstracta de una operacin que tiene que ser realizada. IntentFilter: descripcin de los valores de Intent para ser encontrados.

4. android.content.pm: para acceder a la informacin sobre un paquete de aplicacin. Algunas de las clases que podemos encontrar en este paquete son:

ActivityInfo: informacin que se puede restaurar sobre una activity o receiver en particular. ApplicationInfo: informacin que se puede restaurar sobre una aplicacin en concreto. PermissionInfo: informacin que se puede restaurar acerca de permiso de seguridad conocido por el sistema.

5. android.content.res: Clases para acceder a los recursos de aplicacin, como cheros, colores, elementos para dibujar, media... Algunas clase que contiene:

AssetleDescriptor: descriptor de chero de una entrada en AssetManager. AssetManager: proporciona acceso a los cheros AAAA. ColorStateList: permite mapear el estado de Views a colores. Conguration: describe la informacin de conguracin del dispositivo que puede tener impacto sobre los recursos al restaurar aplicaciones. Resource:clases para acceder a los recursos de aplicacin.

6. android.database.sqlite : Clases para manejar la base de datos de SQLite. Algunas clases que contiene el paquete son:

85

SQLiteDatabase: propone mtodos para manejar una base de datos SQLite. SQLiteCursor: implementacin de cursor que pone los resultados de una DDDD en una SQLiteDataBase. SQLiteProgram: clase base para programas SQLite compilados.

7. android.graphics: Herramientas grcas de bajo nivel. Algunas clases relevantes son:

BitmapFactory: crea objetos bitmap de varias fuentes, incluidos cheros, ujos y byte-arrays. Color: dene mtodos para y convertir colores. Matrix: matriz de 3x3 que permite transformar coordenadas. NinePatch: permite dibujar bitmap en nueve secciones. Paint: clase que mantiene el estilo y la informacin de colors acerca de como dibujar guras geomtricas, texto y bitmaps. Path: encapsula gurar geomtricas compuestas consistentes en lneas rectas, curvas cuadrticas y cbicas.

8. android.graphics.drawable: Clases para manejar los elementos visuales. Clases destacadas del paquete son:

AnimatioDrawable: objeto usado para denir animaciones frame a frame. Drawable: es una abstraccin acerca de algo que puede ser dibujado. LayerDrawable: Drawable que maneja un array de otros drawables. NinePatchDrawable: un bitmap que se puede modicar el tamao, con reas modicables que tu denes.

86

APNDICE B. ANLISIS DEL API DE ANDROID

9. android.graphics.drawable.shapes: Clases para dibujar elementos geomtricos. Algunas clases interesantes son:

ArcShape: crea un arco. OvalShape: dene un valo. RectShape: dene un rectngulo. Shape: dene una forma general.

10. android.hardware: Soporte para hardware que no est presente en los dispositivos de Android. A destacar las siguientes clases:

Camera.AutoFocusCallBack: maneja la llamada para el autofocus de la cmara. Camera.PictureCallback: maneja la llamada cuando se hace una foto. SensorLister: se usa para recibir noticaciones del SensorManager cuando los valores del sensor han cambiado.

11. android.location: Clases para usar el sistema de localizacin. Podemos destacar las siguientes clases:

Address: representa una direccin. Criteria: indica un criterio a la aplicacin para seleccionar una localizacin. Location: clase que representa una localizacin geogrca. LocationManager: proporciona acceso al servicio de localizacin.

12. android.media: Clases para manejar los interfaces de audio y video. Algunas clases destacadas son:

87

MediaPlayer.OnBueringUpdateListener: denicin de interfaz de una llamada invocada indicando status de buering de un recurso que se trae por la red. MediaPlayer.OnCompletionListener: denicin de interfaz de una llamada invocada cuando la reproduccin de un chero de audio o video ha sido completada. MediaPlayer.OnPreparedListener: indica que est listo para iniciar la reproduccin. MediaScannerConnection.MediaScannerConnectionClient: interfaz para noticar a los clientes del MediaScannerConnection cundo una conexin ha sido establecida y el escaneo ha sido nalizado.

13. android.net: Clases para el acceso a la red. Algunas clases representativas son:

Connectivitymanager: responde a las peticiones del estado de conectividad de la red. MailTo: analiza un esquema URL de mail y luego puede ser preguntada por los parmetros analizados. NervworkInfo: describe el estado de la interfaz de red de un tipo dado, mvil o Wi.

14. android.net.wi: Clases para manejar las funcionalidades Wi-Fi del dispositivo. Contiene las siguientes clases:

ScanResult: devuelve la informacin acerca de los puntos de acceso encontrados. WiConguration: representa una red Wi congurada, incluyendo la seguridad de la red. WiConguration.AuthAlgorithm: algoritmos de autenticacin. WifoConguration.Protocol: protocolos de seguridad reconocidos.

88

APNDICE B. ANLISIS DEL API DE ANDROID

WiConguration.Status: status de la conguracin de una red. WiInfo: describe el estado de una conexin Wi que est activa o que est en proceso de establecerse. WiManager: clases que proporciona el API primario para manejar los aspectos de conectividad.

15. android.os: El sistema operativo bsico, paso de mensajes e intercomunicacin entre procesos. Algunas de las clases que tiene son las siguientes:

ConditionVariable: Clase que implementa la variable de condicin del paradigma de cerrojo. CountDownTimer: planica una cuenta atrs hasta un valor futuro, con noticaciones en intervalos regulares. Debug: proporciona varias funciones de depurado para las aplicaciones. Debug.MemoryInfo: se usa para restaurar estadsticas acerca del mapeado en memoria para este proceso. Environment: proporciona acceso a las variables de entorno. Handler: permite enviar y procesar objetos Message y Runnable asociados con la cola de mensajes. HandlerThread: para empezar nuevos hilos que contienen bucles. Looper: usada para correr un bucle de mensaje para un hilo. Message: dene un mensaje que contiene una descripcin y objetos datos arbitrarios que pueden ser enviados al manejador. MessageQueue: lista de mensaje para ser despachada en un bucle. PowerManager: control del estado de la batera del dispositivo. Process: herramientas para manejar los procesos del sistema operativo.

89

Vibrator: para controlar el vibrador del dispositivo.

16. android.preference: Manejo e implementacin de las preferencias de la interfaz de usuario. Algunas clases suyas son:

CheckBoxPreference: preferencia que proporciona la funcionalidad de un checkbox. EditTextPreference: clase que permite introducir cadenas. PreferenceActivity: muestra una jerarqua de preferencias como una lista. PreferenceGroup: para almacenar mltiple preferencias. PreferenceManager: para crear jerarquas de preferencias. RingtonePreference: permite elegir uno de los tonos de llamada disponibles.

17. android.telephony: Clases para la monitorizacin de informacin bsica del telfono. Entre ellas contiene:

CellLocation: representa la localizacin del dispositivo. PhoneNumberUtils: utilidades para llamar con cadenas de nmeros. PhoneStateListener: clase que monitoriza cambios en las estados especcos del telfono, incluido el estado del servicio, la fuerza de la seal, el mensaje de espera y otros. ServiceState: contiene el estado del telfono y la informacin relacionada con el servicio. TelephonyManager: proporciona acceso a la informacin de los servicios del telfono en el dispositivo.

18. android.telephony.gsm: Clases para el uso de GSM. Algunas son:

90

APNDICE B. ANLISIS DEL API DE ANDROID

GsmCellLocation: representa la localizacin de la celda. SmsManager: maneja las operaciones sobre los SMS, como enviar datos, texto, pdu... SmsMessage: SMS.

19. android.view.animation: Clases para manejar animaciones. Su clases son:

AccelerateInterpolator: interpolador donde la tasa de cambio empieza lentamente para luego acelerar. Animation: abstraccin de una animacin que puede ser aplicada a Views, Surfaces u otros objetos. AnimationSet: grupo de animaciones que pueden ser utilizadas juntas. AnimationUtils: utilidades para trabajar con animaciones. RotateAnimation: controla la rotacin de un objeto. ScaleAnimation: controla la escala de un objeto.

20. android.webkit: Clases para recorrer la web. Estas son:

CacheManager: proporciona una cach de contenido recibido por la red. CookieSyncManager: usada para sincronizar las cookies del navegador entre la RAM y FLASH. HttpAuthHandler: manejador de autenticacin de HTTP. JsPromptResult: para manejar peticiones de javascript. WebBackForwardList: lista de Webview.

21. android.widget: Widgets para usar en las aplicaciones. Las clases que contiene son las siguientes:

91

AutoCompleteTextView.Validator: usado para vericar que el texto introducido en un TextView cumple un cierto formato. DatePicker.OnDateChangedListener: para indicar al usuario cambios de fecha. ExpandableListView.OnGroupCollapseListener: usado para ser noticado cuando se colapsa un grupo. Filter.FilterListener: usado para recibir noticaciones despus de una operacin de ltrado. ListAdapter: sirve de puente entre un ListViewy los datos que devuelve la lista. RatingBar.OnRatingBarChangeListener: notica clientes cuando la tasa ha cambiado.

22. com.google.android.maps: Paquete para usar Google maps. Sus clases son:

GeoPoint: representa la longitud y la latitud. MapActivity: clase para manejar las necesidades que tiene la vista de un mapa. MapController: para manejar el zoom de un mapa. MapView: muestra el mapa. MyLocationOverlay: dibuja la posicion del usuario en el mapa.

23. java.net:Paquetes con funcionalidades de red como streaming y sockets, manejo de direcciones de internet. 24. java.nio.channels: Clases para conectar fuentes de datos que permitan entrada y salida de datos. Algunas son:

Channels: utilidades para manejar ujos de entrada/salida.

92

APNDICE B. ANLISIS DEL API DE ANDROID

FileChannel: para interactuar con una plataforma de cheros. FileLock: regin protegida de un chero. Pipe: contiene dos canales. SelectableChannel: canal que puede ser detectado por un detector. SelectionKey: clave que representa la relacin entre un canal y un selector.

25. java.security: Clases para Java security framework. Estas son:

DomainCombiner: forma de actualizar la proteccin de dominios. Guard: interfaz implementada por los objetos que desean mantener el control de acceso a otros objetos.

26. java.security.interfaces: Clases con el cdigo necesario para generar claves para RSA, DSA, EC. 27. java.util.concurrent: Clases usadas comnmente en programacin concurrente. Algunas son:

BlockingQueue: cola que adicionalmente soporta operaciones de espera para la cola cuando esta vaca, y de espera cuando se quiere meter algo y est llena. RejectedExecutionHandler: manejador para tareas que no pueden ser ejecutadas por el ThreadPoolExecutor. ThreadFactory: objeto que crea hilos bajo demanda.

28. java.util.concurrent.atomic: Conjunto de utilidades que soportan cerrojo, hilos... Por ejemplo:

AtomicBoolean: valor que puede ser actualizado automticamente.

93

AtomicIntegerArray: array cuyos elementos pueden ser actualizados automticamente.

29. java.util.concurrent.locks: Clases que permiten mecanismos para cerrojos, esperas... que son distintas que construir sobre sincronizacin y monitores. Entre ellas tenemos:

AbstractQueuedSynchronizer: proporciona un marco de trabajo para implementar cerrojos bloqueantes y sincronizadores relacionados(semforos, eventos) que operan sobre una cola FIFO. LockSupport: primitivas para hilos bloqueantes para creacin de cerrojos y otras clases sincronizantes. ReentrantLock: cerrojo de exclusin mutua, con los mismos comportamientos bsicos y semnticos, como el acceso a monitores usando mtodos con syncrhronized, pero con capacidades extendidas.

30. java.util.logging: Paquete que permite hacer logs en cualquier aplicacin. Algunas de las clases que contiene son:

ConsoleHandler: manejador para escribir los mensajes de logueado en la salida estandar. ErrorManager: devuelve errores producidos durante el logueado. FileHandler: escribe descripciones de eventos de logging en un chero. Handler: objeto que acepta peticiones de logging y exporta el mensaje deseado a cheros, la consola... LoggingPermission: permisos requeridos para controlar el logging.

31. javax.net.ssl: Paquete que contiene todas las clases e interfaces para programar el socket de seguridad sobre la base del SSLv3.0 de protocolo de SSL o TLSv1.2. 32. javax.sql: Paquete con extensiones al interfaz estndar de acceso a bases de datos basadas en SQL. Algunas clases son:

94

APNDICE B. ANLISIS DEL API DE ANDROID

ConnectionEventListener: interfaz usada para recibir eventos generados por PolleConnection. PooledConnection: interfaz que proporciona facilidades para el manejo de conexiones a bases de datos que estn reunidas. DataSource: interfaz para la creacin de objetos Connection que representan la conexin a una base de datos. ConnectionEvent: evento enviado cuando ocurre un evento en un objeto PooledConnection.

33. org.apache.http: El ncleo de clases e interfaces de componentes HTTP. Algunas son:

ConnectionReuseStrategy: para decidir si una conexin debera mantenerse viva. FormattedHeader: cabecera HTTP formateada. Header: campo de la cabecera HTTP. HttpClientConnection: conexin HTTP usada en el lado del cliente. HttpConnection: conexin HTTP genrica til en el lado del cliente y del servidor. HttpEntity: Entity que puede ser enviada en un mensaje HTTP. HttpInetConnection: conexin HTTP sobre IP. HttpMessage: mensaje HTTP genrico. HttpRequest: peticin HTTP. HttpResponse: respuesta HTTP. HttpRequestInterceptor: procesa una peticin.

95

HttpResponseInterceptor: procesa una respuesta. HttpStatus: estado de HTTP. HttpHost: mantiene las variables necesarias para describir una conexin HTTP a un host.

34. org.apache.http.auth: API del lado del cliente para autenticacin HTTP contra el servidor. Algunas clases e interfaces interesantes son:

AuthScheme: interfaces que representan un reto orientado a un esquema de autenticacin. Credentials: nombre de usuario y contrasea basados en credenciales de autenticacin. AUTH: constantes relacionadas con la autenticacin HTTP. AuthState: informacin acerca del estado del proceso de autenticacin. BasicUserPrincipal: usuario principal bsico para la autenticacin HTTP.

Apndice C

Cdigo
C.1. Gestor

/ La c l a s e Ges tor a c t a como men p r i n c i p a l . Desde e l l a s e pueden s e l e c c i o n a r l a s cmaras y r e a l i z a r su g e s t i n . Acceder a su v i s i o n a d o en d i r e c t o o a su h i s t o r i a l , d a r l a s de a l t a y de b a j a . . . @author Ivn A l e j a n d r o Fernndez Pacheco @ v e r s i o n 1 . 0 A b r i l 2010 / // Paquete de t r a b a j o d e l p r o y e c t o package p r o y e c t o . V i d e o v i g i l a n c i a ; // Importamos l a s c l a s e s n e c e s a r i a s import j a v a . i o . F i l e ; import j a v a . u t i l . A r r a y L i s t ; import j a v a . u t i l . Vector ; import import import import import import import import import import import a n d r o i d . app . A l e r t D i a l o g ; a n d r o i d . app . D i a l o g ; a n d r o i d . app . L i s t A c t i v i t y ; a n d r o i d . c o n t e n t . Context ; android . content . D i a l o g I n t e r f a c e ; android . content . Intent ; a n d r o i d . o s . Bundle ; a n d r o i d . u t i l . Log ; a n d r o i d . view . KeyEvent ; a n d r o i d . view . L a y o u t I n f l a t e r ; a n d r o i d . view . Menu ; 97

98

APNDICE C. CDIGO

import import import import import import import import import import

a n d r o i d . view . MenuItem ; a n d r o i d . view . View ; a n d r o i d . view . ViewGroup ; a n d r o i d . w i d g e t . ArrayAdapter ; a n d r o i d . w i d g e t . Button ; a n d r o i d . w i d g e t . EditText ; a n d r o i d . w i d g e t . ImageView ; android . widget . ListView ; a n d r o i d . w i d g e t . TextView ; a n d r o i d . w i d g e t . Toast ;

// C l a s e p b l i c a que h e r e d a de L i s t A C t i v i t y e implementa l a i n t e r f a z DialogInterface . OnClickListener public c l a s s Ges tor extends L i s t A c t i v i t y implements DialogInterface . OnClickListener { // D e c l a r a c i n de a t r i b u t o s de l a c l a s e private Button camara ; private Button h i s t o r i a l ; private A r r a y L i s t <R e g i s t r o > l o c a l = null ; private GestorAdapter m_adapter ; private A l e r t D i a l o g h i s t o r i a l D i a l o g ; private A l e r t D i a l o g nuevaCamaraDialog ; private A l e r t D i a l o g e l i m i n a r C a m a r a D i a l o g ; private EditText mTiempo ; private EditText mCamara ; private R e g i s t r o l o c ; public F i c h e r o s cam ; public F i c h e r o s s e r v i d o r ; public Vector<S t r i n g > camaras ; public I n t e n t i ; public s t a t i c S t r i n g e l e c c i o n ;

public void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( s a v e d I n s t a n c e S t a t e ) ; setContentView (R. l a y o u t . menu ) ; // I n s t a n c i a m o s l o s d i s t i n t o s e l e m e n t o s cam = new F i c h e r o s ( new F i l e ( "/ s d c a r d / camaras . t x t " ) ) ; camara = ( Button ) findViewById (R. i d . camara ) ; h i s t o r i a l = ( Button ) findViewById (R. i d . h i s t o r i a l ) ; l o c a l = new A r r a y L i s t <R e g i s t r o >() ;

C.1. Gestor

99

t h i s . m_adapter = new GestorAdapter ( this , R. l a y o u t . l i n e a , local ) ; s e t L i s t A d a p t e r ( t h i s . m_adapter ) ; // I n i c i a l i z a m o s l a s cmaras segn e l f i c h e r o de configuracin inicializarLocales () ; // Aadimos un e v e n t o de c l i c k a l b o t n de cmara camara . s e t O n C l i c k L i s t e n e r ( new View . O n C l i c k L i s t e n e r ( ) { public void o n C l i c k ( View view ) { // S i s e ha s e l e c c i o n a d o una cmara , s e comienza l a actividad i f ( i != null ) { e l e c c i o n=l o c . g e t L o c a l I P ( ) ; i . putExtra ( " IP " , e l e c c i o n ) ; startActivity ( i ) ; i=null ; // Mostramos mensaje de e r r o r s i no s e ha s e l e c c i o n a d o cmara } else { selecciona () ; } } }) ; // Aadimos un e v e n t o de c l i c k a l b o t n de h i s t o r i a l h i s t o r i a l . s e t O n C l i c k L i s t e n e r ( new View . O n C l i c k L i s t e n e r ( ) { public void o n C l i c k ( View view ) { // S i s e ha s e l e c c i o n a d o una cmara , s e comienza l a actividad i f ( i != null ) { tiempoHistorial () ; h i s t o r i a l D i a l o g . show ( ) ; i=null ; // Mostramos mensaje de e r r o r s i no s e ha s e l e c c i o n a d o cmara } else { selecciona () ; } } }) ; }

100

APNDICE C. CDIGO

/ Metodo que r e g i s t r a l o s e v e n t o s de c l i c k en l a l i s t a @param lista L i s t a de e l e m e n t o s @param v Vista @param position P o s i c i n en l a l i s t a @param id Identificador / protected void o n L i s t I t e m C l i c k ( L i s t V i e w l i s t a , View v , int p o s i t i o n , long i d ) { loc = ( Registro ) l i s t a . getItemAtPosition ( position ) ; Toast . makeText ( this , l o c . getLocalName ( )+" : "+l o c . g e t L o c a l I P ( ) , Toast .LENGTH_LONG) . show ( ) ; i = new I n t e n t ( this , Web . c l a s s ) ; }

/ Metodo para i n i c i a l i z a r y mostrar l a l i s t a de cmaras / private void i n i c i a l i z a r L o c a l e s ( ) { try { l o c a l = new A r r a y L i s t <R e g i s t r o >() ; camaras = cam . l e e r F i c h e r o ( ) ; i f ( camaras != null ) { int p = 1 ; fo r ( int h=0; h<camaras . s i z e ( ) ; h++){ // Aadimos a l A r r a y L i s t cada una de l a s cmaras l o c a l . add ( new R e g i s t r o ( "Camara "+p ,R. drawable . i c o n , camaras . elementAt ( h ) ) ) ; p++; } } // Capturamos l a s e x c e p c i o n e s } catch ( E x c e p t i o n e ) {

C.1. Gestor

101

Log . e ( "BACKGROUND_PROC" , e . getMessage ( ) ) ; } i f ( l o c a l != null && l o c a l . s i z e ( ) > 0 ) { f o r ( int i =0; i <l o c a l . s i z e ( ) ; i ++) m_adapter . add ( l o c a l . g e t (i)); } // N o t i f i c a m o s l o s cambios a l a c l a s e i n t e r n a para que a c t u e oportunamente m_adapter . notifyDataSetChanged ( ) ; }

/ Metodo para a a d i r una cmara nueva a l s i s t e m a / private void newCamara ( ) { try { l o c a l = new A r r a y L i s t <R e g i s t r o >() ; camaras = cam . l e e r F i c h e r o ( ) ; cam . nuevoElemento ( g e t I P ( ) ) ; i f ( camaras != null ) { int tamao = camaras . s i z e ( ) +1; // Aadimos l a cmara l o c a l . add ( new R e g i s t r o ( "Camara"+tamao ,R. drawable . i c o n , getIP ( ) ) ) ; } // Capturamos l a s p o s i b l e s e x c e p c i o n e s } catch ( E x c e p t i o n e ) { Log . e ( "BACKGROUND_PROC" , e . getMessage ( ) ) ; } // Aadimos y n o t i f i c a m o s e l cambio a l a c l a s e i n t e r n a m_adapter . add ( l o c a l . g e t ( 0 ) ) ; m_adapter . notifyDataSetChanged ( ) ; }

102

APNDICE C. CDIGO

/ Metodo para b o r r a r una cmara de l a l i s t a / private void deleteCamara ( ) { try { cam . borraElemento ( getCamara ( ) ) ; } catch ( E x c e p t i o n e ) { Log . i ( "BACKGROUND_PROC" , e . getMessage ( ) ) ; } m_adapter . c l e a r ( ) ; inicializarLocales () ; }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e puede i n d i c a r que momento de l a g r a b a c i n s e q u i e r e v i s u a l i z a r @return h i t o r i a l D i a l o g Cuadro de d i l o g o / protected D i a l o g t i e m p o H i s t o r i a l ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t T i t l e (R. s t r i n g . tiempo ) ; LayoutInflater i n f l a t e r = getLayoutInflater () ; View view = i n f l a t e r . i n f l a t e (R. l a y o u t . tiempo , null ) ; // Caja de t e x t o donde s e aade e l tiempo mTiempo = ( EditText ) view . findViewById (R. i d . tiempo ) ; b u i l d e r . setView ( view ) ; // Botones b u i l d e r . s e t P o s i t i v e B u t t o n ( "OK" , t h i s ) ; b u i l d e r . s e t N e g a t i v e B u t t o n ( "CANCEL" , t h i s ) ; historialDialog = builder . create () ; return h i s t o r i a l D i a l o g ; }

C.1. Gestor

103

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e puede i n d i c a r l a IP de l a cmara que s e q u i e r e r e g i s t r a r @return nuevaCamaraDialog Cuadro de d i l o g o / protected D i a l o g nuevaCamara ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t T i t l e (R. s t r i n g . camara ) ; LayoutInflater i n f l a t e r = getLayoutInflater () ; View view = i n f l a t e r . i n f l a t e (R. l a y o u t . camara , null ) ; // Caja de t e x t o donde s e e s c r i b e l a d i r e c c i n IP mCamara = ( EditText ) view . findViewById (R. i d . camara ) ; b u i l d e r . setView ( view ) ; // Botones b u i l d e r . s e t P o s i t i v e B u t t o n ( "OK" , t h i s ) ; b u i l d e r . s e t N e g a t i v e B u t t o n ( "CANCEL" , t h i s ) ; nuevaCamaraDialog = b u i l d e r . c r e a t e ( ) ; return nuevaCamaraDialog ; }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e puede indicar el identificador de l a cmara que s e q u i e r e s u p r i m i r @return elimina rCamaraDialog Cuadro de d i l o g o / protected D i a l o g eliminarCamara ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t T i t l e (R. s t r i n g . camara ) ; LayoutInflater i n f l a t e r = getLayoutInflater () ; View view = i n f l a t e r . i n f l a t e (R. l a y o u t . camara , null ) ; // Caja de t e x t o donde s e i n d i c a e l i d e n t i f c a d o r de cmara mCamara = ( EditText ) view . findViewById (R. i d . camara ) ;

104

APNDICE C. CDIGO

b u i l d e r . setView ( view ) ; b u i l d e r . s e t P o s i t i v e B u t t o n ( "OK" , t h i s ) ; b u i l d e r . s e t N e g a t i v e B u t t o n ( "CANCEL" , t h i s ) ; eliminarCamaraDialog = b u i l d e r . c r e a t e ( ) ; return e l i m i n a r C a m a r a D i a l o g ; }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e puede indicar s i se q u i e r e s a l i r d e l programa o no @return d i a l o g Cuadro de d i l o g o / protected D i a l o g s a l i r ( ) { final Dialog dialog ; d i a l o g = new A l e r t D i a l o g . B u i l d e r ( t h i s ) . s e t M e s s a g e ( " Est s e g u r o que d e s e a s a l i r ? " ) . s e t C a n c e l a b l e ( f a l s e ) . s e t P o s i t i v e B u t t o n ( " S " , new D i a l o g I n t e r f a c e . OnClickListener () { // Botn d e l S public void o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , int i d ) { Ges tor . t h i s . f i n i s h ( ) ; } }) . s e t N e g a t i v e B u t t o n ( "NO" , new D i a l o g I n t e r f a c e . OnClickListener () { // Botn d e l NO public void o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , int i d ) { dialog . cancel () ; } }) . c r e a t e ( ) ; return d i a l o g ; }

C.1. Gestor

105

/ Metodo que g e s t i o n a l o s e v e n t o s de l a s d i s t i n t a s t e c l a s d e l PAD @param keyCode C l av e de l a t e c l a @param event Evento @return s u p e r . onKeyDown ( keyCode , e v e n t ) / public boolean onKeyDown ( int keyCode , KeyEvent e v e n t ) { i f ( keyCode == KeyEvent .KEYCODE_BACK) { s a l i r ( ) . show ( ) ; return true ; } return super . onKeyDown ( keyCode , e v e n t ) ; }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e puede i n d i c a r que s e d e b e s e l e c c i o n a r una cmara / public void s e l e c c i o n a ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t M e s s a g e ( " Por f a v o r , s e l e c c i o n e una cmara " ) ; builder . setCancelable ( false ) ; b u i l d e r . s e t N e u t r a l B u t t o n ( "Ok" , new D i a l o g I n t e r f a c e . OnClickListener () { public void o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , int i d ) { } }) ; builder . create () ; b u i l d e r . show ( ) ; }

106

APNDICE C. CDIGO

/ Metodo que g e s t i o n a l o s c l i c k s que s e hacen en l o s d i s t i n t o s c u a d r o s de d i l o g o que s e generan @param dialog Cuadro de d i l o g o @param which I n d i c a que b o t n / public void o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , int which ) { // Opcin de h i s t o r i a l i f ( d i a l o g == h i s t o r i a l D i a l o g ) { switch ( which ) { case D i a l o g I n t e r f a c e .BUTTON_POSITIVE: i f ( S e r v i d o r . s e r v e r != null ) { // S i hay un s e r v i d o r s e l e c c i o n a d o , s e i n i c i a l a a c t i v i d a d Rtsp f i n a l I n t e n t j = new I n t e n t ( this , Rtsp . c l a s s ) ; S t r i n g f i c h= l o c . getLocalName ( ) ; int t=getTiempo ( ) ; //Le i n d i c a m o s e l nombre d e l f i c h e r o a c a r g a r j . putExtra ( " camara " , f i c h ) ; j . putExtra ( " tiempo " , t ) ; startActivity ( j ) ; } else { // S i no hay s e r v i d o r s e l e c c i o n a d o , s e i n i c i a l a actividad // S e r v i d o r para s e l e c c i o n a r e l c o r r e s p o n d i e n t e f i n a l I n t e n t h = new I n t e n t ( this , S e r v i d o r . c l a s s ) ; S t r i n g f i c h= l o c . getLocalName ( ) ; int t=getTiempo ( ) ; //Le i n d i c a m o s e l nombre d e l f i c h e r o a c a r g a r j . putExtra ( " camara " , f i c h ) ; j . putExtra ( " tiempo " , t ) ; startActivity (h) ; } break ; case D i a l o g I n t e r f a c e .BUTTON_NEGATIVE: // Cancelamos dialog . dismiss () ;

C.1. Gestor

107

break ; } } // Opcin de a g r e g a r cmara i f ( d i a l o g == nuevaCamaraDialog ) { switch ( which ) { case D i a l o g I n t e r f a c e .BUTTON_POSITIVE: // Agregamos nueva cmara i f ( ! cam . v e r i f i c a I P ( g e t I P ( ) ) ) { Toast . makeText ( this , " D i r e c c i n IP i n c o r r e c t a " , Toast .LENGTH_LONG) . show ( ) ; dialog . dismiss () ; } else { newCamara ( ) ; } break ; case D i a l o g I n t e r f a c e .BUTTON_NEGATIVE: // Cancelamos dialog . dismiss () ; break ; } } // Opcin de e l i m i n a r cmara i f ( d i a l o g == e l i m i n a r C a m a r a D i a l o g ) { switch ( which ) { case D i a l o g I n t e r f a c e .BUTTON_POSITIVE: // Eliminamos cmara deleteCamara ( ) ; break ; case D i a l o g I n t e r f a c e .BUTTON_NEGATIVE: // Cancelamos dialog . dismiss () ; break ; } } }

108

APNDICE C. CDIGO

Metodo que o b t i e n e e l tiempo i n t r o d u c i d o en l a c a j a de t e x t o d e l cuadro de dilogo del histo rial @return Tiempo i n t r o d u c i d o / private int getTiempo ( ) { S t r i n g s t r i n g V a l u e = S t r i n g . v a l u e O f ( mTiempo . getText ( ) ) ; i f ( s t r i n g V a l u e . l e n g t h ( ) != 0 ) { try { return I n t e g e r . p a r s e I n t ( s t r i n g V a l u e ) ; } catch ( NumberFormatException e ) { } } return 0 ; }

/ Metodo que o b t i e n e e l i d e n t i f i c a d o r de cmara de l a c a j a de texto s i t u a d a en e l cuadro de d i l o g o de e l i m i n a r cmara @return I d e n t i f i c a d o r de cmara / private int getCamara ( ) { S t r i n g s t r i n g V a l u e = S t r i n g . v a l u e O f (mCamara . getText ( ) ) ; i f ( s t r i n g V a l u e . l e n g t h ( ) != 0 ) { try { return I n t e g e r . p a r s e I n t ( s t r i n g V a l u e ) ; } catch ( NumberFormatException e ) { } } return 0 ; }

/ Metodo que o b t i e n e e l tiempo i n t r o d u c i d o en l a c a j a de t e x t o d e l cuadro de

C.1. Gestor

109

dilogo del histo rial @return D i r e c c i n IP de l a cmara / private S t r i n g g e t I P ( ) { return S t r i n g . v a l u e O f (mCamara . getText ( ) ) ; }

/ Metodo que c r e a un men con d i s t i n t a s o p c i o n e s @param menu @return t r u e / public boolean onCreateOptionsMenu (Menu menu ) { // Opcin d e l S e r v i d o r de Vdeo MenuItem s e r v i d o r = menu . add (Menu .NONE, 1 , Menu .NONE, " VIDEOSERVER" ) ; s e r v i d o r . s e t I c o n ( a n d r o i d .R. drawable . ic_menu_save ) ; // Opcin de a a d i r cmara MenuItem a a d i r = menu . add (Menu .NONE, 2 , Menu .NONE, "AADIR CAMARA" ) ; a a d i r . s e t I c o n ( a n d r o i d .R. drawable . btn_plus ) ; // Opcin de e l i m i n a r cmara MenuItem e l i m i n a r = menu . add (Menu .NONE, 3 , Menu .NONE, " ELIMINARCAMARA" ) ; e l i m i n a r . s e t I c o n ( a n d r o i d .R. drawable . ic_menu_delete ) ; return true ; }

/ Metodo que c o n f i g u r a cada una de l a s a c c i o n e s d e l men @param item

110

APNDICE C. CDIGO

@return t r u e o s u p e r . o n O p t i o n s I t e m S e l e c t e d ( item ) / public boolean o n O p t i o n s I t e m S e l e c t e d ( MenuItem item ) { switch ( item . g e t I t e m I d ( ) ) { case 1 : // Se i n i c i a l a a c t i v i d a d e l s e r v i d o r f i n a l I n t e n t j = new I n t e n t ( this , S e r v i d o r . c l a s s ) ; startActivity ( j ) ; return true ; case 2 : // Se muestra e l cuadro de d i l o g o para a a d i r cmara nuevaCamara ( ) ; nuevaCamaraDialog . show ( ) ; return true ; case 3 : // Se muestra e l cuadro de d i o l o g o para e l i m i n a r cmara eliminarCamara ( ) ; e l i m i n a r C a m a r a D i a l o g . show ( ) ; return true ; default : return super . o n O p t i o n s I t e m S e l e c t e d ( item ) ; } }

/ C l a s e i n t e r n a para g e s t i o n a r l o s e v e n t o s de l a l i s t a / public c l a s s GestorAdapter extends ArrayAdapter <R e g i s t r o > { // A t r i b u t o de l a c l a s e private A r r a y L i s t <R e g i s t r o > i t e m s ;

/ Metodo c o n s t r u c t o r de l a c l a s e @param c o n t e x t Contexto @param t e x t V i e w R e s o u r c e I d Identificador @param i t e m s Array de r e g i s t r o s @return o b j e t o de l a c l a s e /

C.1. Gestor

111

public GestorAdapter ( Context c o n t e x t , int t e x t V i e w R e s o u r c e I d , A r r a y L i s t <R e g i s t r o > i t e m s ) { super ( c o n t e x t , t e x t V i e w R e s o u r c e I d , i t e m s ) ; this . items = items ; }

/ Metodo que d e v u e l v e l a v i s t a de l a l i s t a @param p o s i t i o n Posicin d e l elemento @param c o n v e r t V i e w @param p a r e n t @return v Vista / public View getView ( int p o s i t i o n , View convertView , ViewGroup parent ) { View v = convertView ; i f ( v == null ) { LayoutInflater vi = ( LayoutInflater ) getSystemService ( Context .LAYOUT_INFLATER_SERVICE) ; v = v i . i n f l a t e (R. l a y o u t . l i n e a , null ) ; } // Se o b t i e n e l a p o s i c i n d e l e l e m e n t o Registro o = items . get ( p o s i t i o n ) ; i f ( o != null ) { // Texto e imagen de cada f i l a TextView t t = ( TextView ) v . findViewById (R. i d . row_toptext ) ; ImageView im = ( ImageView ) v . findViewById (R. i d . i c o n ) ; i f ( im!= null ) { // Obtenemos l a imagen im . s e t I m a g e R e s o u r c e ( o . g e t L o c a l I m a g e ( ) ) ; } i f ( t t != null ) { // Obtenemos e l t e x t o t t . s e t T e x t ( o . getLocalName ( ) ) ;

112

APNDICE C. CDIGO

} } return v ; } } }

C.2.

Servidor

/ La c l a s e S e r v i d o r a c t a como g e s t o r de l o s d i s t i n t o s s e r v i d o r e s . Desde e l l a s e pueden s e l e c c i o n a r l o s s e r v i d o r e s y r e a l i z a r su g e s t i n . D a r l e s de a l t a y de b a j a . . . @author Ivn A l e j a n d r o Fernndez Pacheco @ ve r si o n 1 . 0 A b r i l 2010 / // Paquete de t r a b a j o d e l p r o y e c t o package p r o y e c t o . V i d e o v i g i l a n c i a ; // Importamos l a s c l a s e s n e c e s a r i a s import j a v a . i o . F i l e ; import j a v a . u t i l . A r r a y L i s t ; import j a v a . u t i l . Vector ; import import import import import import import import import import import import import import import import import import a n d r o i d . app . A l e r t D i a l o g ; a n d r o i d . app . D i a l o g ; a n d r o i d . app . L i s t A c t i v i t y ; a n d r o i d . c o n t e n t . Context ; android . content . D i a l o g I n t e r f a c e ; android . content . Intent ; a n d r o i d . o s . Bundle ; a n d r o i d . u t i l . Log ; a n d r o i d . view . KeyEvent ; a n d r o i d . view . L a y o u t I n f l a t e r ; a n d r o i d . view . Menu ; a n d r o i d . view . MenuItem ; a n d r o i d . view . View ; a n d r o i d . view . ViewGroup ; a n d r o i d . w i d g e t . ArrayAdapter ; a n d r o i d . w i d g e t . EditText ; a n d r o i d . w i d g e t . ImageView ; android . widget . ListView ;

C.2. Servidor

113

import a n d r o i d . w i d g e t . TextView ; import a n d r o i d . w i d g e t . Toast ; // C l a s e p b l i c a que h e r e d a de L i s t A C t i v i t y e implementa l a i n t e r f a z DialogInterface . OnClickListener public c l a s s S e r v i d o r extends L i s t A c t i v i t y implements DialogInterface . OnClickListener { // D e c l a r a c i n de a t r i b u t o s de l a c l a s e private A r r a y L i s t <R e g i s t r o > l o c a l = null ; private GestorAdapter m_adapter ; private A l e r t D i a l o g n u e v o S e r v i d o r D i a l o g ; private A l e r t D i a l o g e l i m i n a r S e r v i d o r D i a l o g ; private EditText mServidor ; private R e g i s t r o l o c ; public F i c h e r o s s e r v i d o r ; public Vector<S t r i n g > s e r v i d o r e s ; public Bundle e x t r a s ; public s t a t i c S t r i n g s e r v e r ;

public void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( s a v e d I n s t a n c e S t a t e ) ; setContentView (R. l a y o u t . m e n u s e r v i d o r ) ; // I n s t a n c i a m o s l o s d i s t i n t o s e l e m e n t o s extras = getIntent () . getExtras () ; s e r v i d o r = new F i c h e r o s ( new F i l e ( "/ s d c a r d / s e r v i d o r e s . t x t " ) ) ; l o c a l = new A r r a y L i s t <R e g i s t r o >() ; t h i s . m_adapter = new GestorAdapter ( this , R. l a y o u t . l i n e a , local ) ; s e t L i s t A d a p t e r ( t h i s . m_adapter ) ; // I n i c i a l i z a m o s l a s cmaras segn e l f i c h e r o de configuracin inicializarLocales () ; }

/ Metodo que r e g i s t r a l o s e v e n t o s de c l i c k en l a l i s t a

114

APNDICE C. CDIGO

@param @param @param @param /

lista v position id

L i s t a de e l e m e n t o s Vista P o s i c i n en l a l i s t a Identificador

protected void o n L i s t I t e m C l i c k ( L i s t V i e w l i s t a , View v , int p o s i t i o n , long i d ) { loc = ( Registro ) l i s t a . getItemAtPosition ( position ) ; i f ( Ge stor . e l e c c i o n != null ) { f i n a l I n t e n t i = new I n t e n t ( this , Rtsp . c l a s s ) ; s e r v e r=l o c . g e t L o c a l I P ( ) ; i . putExtra ( " S e r v i d o r " , l o c . g e t L o c a l I P ( ) ) ; startActivity ( i ) ; Ges tor . e l e c c i o n=null ; } else { s e r v e r=l o c . g e t L o c a l I P ( ) ; selecciona () ; } }

/ Metodo para i n i c i a l i z a r y mostrar l a l i s t a de cmaras / private void i n i c i a l i z a r L o c a l e s ( ) { try { l o c a l = new A r r a y L i s t <R e g i s t r o >() ; servidores = servidor . leerFichero () ; i f ( s e r v i d o r e s != null ) { fo r ( int h=0; h<s e r v i d o r e s . s i z e ( ) ; h++){ // Aadimos a l A r r a y L i s t cada una de l o s s e r v i d o r e s l o c a l . add ( new R e g i s t r o ( s e r v i d o r e s . elementAt ( h ) ,R. drawable . i c o n ) ) ; } } // Capturamos l a s e x c e p c i o n e s } catch ( E x c e p t i o n e ) { Log . e ( "BACKGROUND_PROC" , e . getMessage ( ) ) ;

C.2. Servidor

115

} i f ( l o c a l != null && l o c a l . s i z e ( ) > 0 ) { f o r ( int i =0; i <l o c a l . s i z e ( ) ; i ++) m_adapter . add ( l o c a l . g e t (i)); } // N o t i f i c a m o s l o s cambios a l a c l a s e i n t e r n a para que a c t u e oportunamente m_adapter . notifyDataSetChanged ( ) ; }

/ Metodo para a a d i r un s e r v i d o r nuevo a l s i s t e m a / private void newServer ( ) { try { l o c a l = new A r r a y L i s t <R e g i s t r o >() ; s e r v i d o r . nuevoElemento ( g e t I P S e r v e r ( ) ) ; i f ( s e r v i d o r e s != null ) { int tamao = s e r v i d o r e s . s i z e ( ) +1; // Aadimos e l s e r v i d o r l o c a l . add ( new R e g i s t r o ( " S e r v i d o r "+tamao ,R. drawable . icon , getIPServer ( ) ) ) ; } // Capturamos l a s p o s i b l e s e x c e p c i o n e s } catch ( E x c e p t i o n e ) { Log . e ( "BACKGROUND_PROC" , e . getMessage ( ) ) ; } // Aadimos y n o t i f i c a m o s e l cambio a l a c l a s e i n t e r n a m_adapter . add ( l o c a l . g e t ( 0 ) ) ; m_adapter . notifyDataSetChanged ( ) ; }

/ Metodo para b o r r a r un s e r v i d o r de l a l i s t a /

116

APNDICE C. CDIGO

private void d e l e t e S e r v e r ( ) { try { s e r v i d o r . borraElemento ( g e t S e r v i d o r ( ) ) ; } catch ( E x c e p t i o n e ) { Log . e ( "BACKGROUND_PROC" , e . getMessage ( ) ) ; } m_adapter . c l e a r ( ) ; inicializarLocales () ; }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e i n d i c a r l a IP d e l servidor @return h i t o r i a l D i a l o g Cuadro de d i l o g o / protected D i a l o g n u e v o S e r v i d o r ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t T i t l e (R. s t r i n g . s e r v i d o r ) ; LayoutInflater i n f l a t e r = getLayoutInflater () ; View view = i n f l a t e r . i n f l a t e (R. l a y o u t . s e r v i d o r , null ) ; // Caja de t e x t o donde s e aade l a IP d e l s e r v i d o r mServidor = ( EditText ) view . findViewById (R. i d . s e r v i d o r ) ; b u i l d e r . setView ( view ) ; // Botones b u i l d e r . s e t P o s i t i v e B u t t o n ( "OK" , t h i s ) ; b u i l d e r . s e t N e g a t i v e B u t t o n ( "CANCEL" , t h i s ) ; nuevoServidorDialog = builder . create () ; return n u e v o S e r v i d o r D i a l o g ; }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e i n d i c a r e l identificador del servidor a eliminar

C.2. Servidor

117

@return /

hitorialDialog

Cuadro de d i l o g o

protected D i a l o g e l i m i n a r S e r v i d o r ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t T i t l e (R. s t r i n g . s e r v i d o r ) ; LayoutInflater i n f l a t e r = getLayoutInflater () ; View view = i n f l a t e r . i n f l a t e (R. l a y o u t . s e r v i d o r , null ) ; // Caja de t e x t o donde s e aade i d e n t i f i c a d o r d e l s e r v i d o r mServidor = ( EditText ) view . findViewById (R. i d . s e r v i d o r ) ; b u i l d e r . setView ( view ) ; // Botones b u i l d e r . s e t P o s i t i v e B u t t o n ( "OK" , t h i s ) ; b u i l d e r . s e t N e g a t i v e B u t t o n ( "CANCEL" , t h i s ) ; eliminarServidorDialog = builder . create () ; return e l i m i n a r S e r v i d o r D i a l o g ; }

/ Metodo que g e s t i o n a l o s c l i c k s que s e hacen en l o s d i s t i n t o s c u a d r o s de d i l o g o que s e generan @param dialog Cuadro de d i l o g o @param which I n d i c a que b o t n / public void o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , int which ) { // Opcin de nuevo s e r v i d o r i f ( d i a l o g == n u e v o S e r v i d o r D i a l o g ) { switch ( which ) { case D i a l o g I n t e r f a c e .BUTTON_POSITIVE: // Aadimos s e r v i d o r i f ( ! servidor . v e r i f i c a I P ( getIPServer () ) ){ Toast . makeText ( this , " D i r e c c i n IP i n c o r r e c t a " , Toast .LENGTH_LONG) . show ( ) ; dialog . dismiss () ; } else {

118

APNDICE C. CDIGO

newServer ( ) ; } break ; case D i a l o g I n t e r f a c e .BUTTON_NEGATIVE: // Cancelamos dialog . dismiss () ; break ; } } // Opcin de e l i m i n a r e l s e r v i d o r i f ( d i a l o g == e l i m i n a r S e r v i d o r D i a l o g ) { switch ( which ) { case D i a l o g I n t e r f a c e .BUTTON_POSITIVE: // Borramos s e r v i d o r deleteServer () ; break ; case D i a l o g I n t e r f a c e .BUTTON_NEGATIVE: // Cancelamos dialog . dismiss () ; break ; } } }

/ Metodo que c r e a e l cuadro de d i l o g o en e l que s e puede i n d i c a r que s e d e b e s e l e c c i o n a r una cmara / public void s e l e c c i o n a ( ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r ( t h i s ) ; b u i l d e r . s e t M e s s a g e ( " Por f a v o r , p r i m e r o debe s e l e c c i o n a r una cmara " ) ; builder . setCancelable ( false ) ; b u i l d e r . s e t N e u t r a l B u t t o n ( "Ok" , new D i a l o g I n t e r f a c e . OnClickListener () {

C.2. Servidor

119

public void o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , int i d ) { Servidor . this . f i n i s h () ; } }) ; builder . create () ; b u i l d e r . show ( ) ; }

/ Metodo que o b t i e n e e l tiempo i n t r o d u c i d o en l a c a j a de t e x t o d e l cuadro de dilogo @return D i r e c c i n IP d e l s e r v i d o r / private S t r i n g g e t I P S e r v e r ( ) { return S t r i n g . v a l u e O f ( mServidor . getText ( ) ) ; }

/ Metodo que o b t i e n e e l i d e n t i f i c a d o r d e l s e r v i d o r de l a c a j a de t e x t o s i t u a d a en e l cuadro de d i l o g o de e l i m i n a r s e r v i d o r @return I d e n t i f i c a d o r de cmara / private int g e t S e r v i d o r ( ) { S t r i n g s t r i n g V a l u e = S t r i n g . v a l u e O f ( mServidor . getText ( ) ) ; i f ( s t r i n g V a l u e . l e n g t h ( ) != 0 ) { try { return I n t e g e r . p a r s e I n t ( s t r i n g V a l u e ) ; } catch ( NumberFormatException e ) { } } return 0 ; }

120

APNDICE C. CDIGO

/ Metodo que c r e a un men con d i s t i n t a s o p c i o n e s @param menu @return t r u e / public boolean onCreateOptionsMenu (Menu menu ) { MenuItem a a d i r = menu . add (Menu .NONE, 1 , Menu .NONE, "AADIR SERVIDOR" ) ; a a d i r . s e t I c o n ( a n d r o i d .R. drawable . btn_plus ) ; MenuItem e l i m i n a r = menu . add (Menu .NONE, 2 , Menu .NONE, " ELIMINARSERVIDOR" ) ; e l i m i n a r . s e t I c o n ( a n d r o i d .R. drawable . ic_menu_delete ) ; return true ; }

/ Metodo que c o n f i g u r a cada una de l a s a c c i o n e s d e l men @param item @return t r u e o s u p e r . o n O p t i o n s I t e m S e l e c t e d ( item ) / public boolean o n O p t i o n s I t e m S e l e c t e d ( MenuItem item ) { switch ( item . g e t I t e m I d ( ) ) { case 1 : // Se muestra e l cuadro de nuevo s e r v i d o r nuevoServidor () ; n u e v o S e r v i d o r D i a l o g . show ( ) ; return true ; case 2 : // Se muestra e l cuadro de b o r r a r s e r v i d o r eliminarServidor () ; e l i m i n a r S e r v i d o r D i a l o g . show ( ) ; return true ; default :

C.2. Servidor

121

return super . o n O p t i o n s I t e m S e l e c t e d ( item ) ; } }

/ Metodo que g e s t i o n a l o s e v e n t o s de l a s d i s t i n t a s t e c l a s d e l PAD @param keyCode C l av e de l a t e c l a @param event Evento @return s u p e r . onKeyDown ( keyCode , e v e n t ) / public boolean onKeyDown ( int keyCode , KeyEvent e v e n t ) { i f ( keyCode == KeyEvent .KEYCODE_BACK) { Servidor . this . f i n i s h () ; return true ; } return super . onKeyDown ( keyCode , e v e n t ) ; }

/ C l a s e i n t e r n a para g e s t i o n a r l o s e v e n t o s de l a l i s t a / public c l a s s GestorAdapter extends ArrayAdapter <R e g i s t r o > { // A t r i b u t o de l a c l a s e private A r r a y L i s t <R e g i s t r o > i t e m s ;

/ Metodo @param @param @param

c o n s t r u c t o r de l a c l a s e context textViewResourceId items Contexto Identificador Array de r e g i s t r o s

122

APNDICE C. CDIGO

@return o b j e t o de l a c l a s e / public GestorAdapter ( Context c o n t e x t , int t e x t V i e w R e s o u r c e I d , A r r a y L i s t <R e g i s t r o > i t e m s ) { super ( c o n t e x t , t e x t V i e w R e s o u r c e I d , i t e m s ) ; this . items = items ; } / Metodo que d e v u e l v e l a v i s t a de l a l i s t a @param p o s i t i o n Posicin d e l elemento @param c o n v e r t V i e w @param p a r e n t @return v Vista / public View getView ( int p o s i t i o n , View convertView , ViewGroup parent ) { View v = convertView ; i f ( v == null ) { LayoutInflater vi = ( LayoutInflater ) getSystemService ( Context .LAYOUT_INFLATER_SERVICE) ; v = v i . i n f l a t e (R. l a y o u t . l i n e a , null ) ; } Registro o = items . get ( p o s i t i o n ) ; i f ( o != null ) { TextView t t = ( TextView ) v . findViewById (R. i d . row_toptext ) ; ImageView im = ( ImageView ) v . findViewById (R. i d . i c o n ) ; i f ( im!= null ) { im . s e t I m a g e R e s o u r c e ( o . g e t L o c a l I m a g e ( ) ) ; } i f ( t t != null ) { tt . setText ( o . getLocalIP () ) ; } } return v ; } } }

C.3. Web

123

C.3.

Web

/ La c l a s e Web p e r m i t e v i s u a l i z a r l a s d i s t i n t a s cmaras web d e l s i s t e m a de s e g u r i d a d , a s como h a c e r zoom s o b r e l a s imgenes . @author Ivn A l e j a n d r o Fernndez Pacheco @ v e r s i o n 1 . 0 A b r i l 2010 / // Paquete de t r a b a j o d e l p r o y e c t o package p r o y e c t o . V i d e o v i g i l a n c i a ; // Importamos l a s c l a s e s n e c e s a r i a s import j a v a . i o . FileOutputStream ; import j a v a . i o . OutputStream ; import import import import import import import import import import import import a n d r o i d . app . A c t i v i t y ; a n d r o i d . c o n t e n t . ContentValues ; a n d r o i d . g r a p h i c s . Bitmap ; a n d r o i d . g r a p h i c s . Canvas ; android . graphics . Picture ; a n d r o i d . g r a p h i c s . Bitmap . C o n f i g ; a n d r o i d . n e t . Uri ; a n d r o i d . o s . Bundle ; a n d r o i d . view . KeyEvent ; a n d r o i d . view . View ; a n d r o i d . webkit . WebView ; a n d r o i d . w i d g e t . Button ;

// C l a s e p b l i c a que h e r e d a de A c t i v i t y public c l a s s Web extends A c t i v i t y { // D e c l a r a c i n de a t r i b u t o s de l a c l a s e WebView wv ; Uri u r i ; ContentValues v a l u e s ; Bitmap bitmap ; Canvas mCanvas ; private Button pausa ; public void onCreate ( Bundle i c i c l e ) {

124

APNDICE C. CDIGO

super . onCreate ( i c i c l e ) ; Bundle e x t r a s = g e t I n t e n t ( ) . g e t E x t r a s ( ) ; // I n s t a n c i a m o s l o s d i s t i n t o s e l e m e n t o s setContentView (R. l a y o u t . main ) ; pausa = ( Button ) findViewById (R. i d . pausa ) ; // f a c e = new FaceView ( t h i s ) ; S t r i n g cam = e x t r a s . g e t S t r i n g ( " IP " ) ; wv = ( WebView ) findViewById (R. i d . web ) ; wv . g e t S e t t i n g s ( ) . s e t J a v a S c r i p t E n a b l e d ( true ) ; wv . l o a d U r l ( " h t t p : / / "+cam+" : 8 0 8 0 " ) ; // Aadimos un e v e n t o de c l i c k a l b o t n de pausa / reanudar pausa . s e t O n C l i c k L i s t e n e r ( new View . O n C l i c k L i s t e n e r ( ) { public void o n C l i c k ( View view ) { i f ( pausa . getText ( )==" Pausa " ) { pausa . s e t T e x t ( " Reanudar " ) ; } else { pausa . s e t T e x t ( " Pausa " ) ; } } }) ; }

/ Metodo que g e s t i o n a l o s e v e n t o s de l a s d i s t i n t a s t e c l a s d e l PAD @param keyCode C l a v e de l a t e c l a @param event Evento / public boolean onKeyUp ( int keyCode , KeyEvent e v e n t ) { i f ( keyCode == KeyEvent .KEYCODE_DPAD_DOWN) { } // Hacer +Zoom i f ( keyCode == KeyEvent .KEYCODE_DPAD_LEFT) {

C.3. Web

125

wv . zoomIn ( ) ; return super . onKeyUp ( keyCode , e v e n t ) ; } // Hacer Zoom i f ( keyCode == KeyEvent .KEYCODE_DPAD_RIGHT) { wv . zoomOut ( ) ; return super . onKeyUp ( keyCode , e v e n t ) ; } i f ( keyCode == KeyEvent .KEYCODE_DPAD_UP) { return super . onKeyUp ( keyCode , e v e n t ) ; } // Botn de v o l v e r a t r s i f ( keyCode == KeyEvent .KEYCODE_BACK) { Ges tor . e l e c c i o n=null ; Web . t h i s . f i n i s h ( ) ; return true ; } return f a l s e ; }

/ Metodo que g e s t i o n a e l b o t n de v o l v e r a t r s / public void onBackPressed ( ) { Ges tor . e l e c c i o n=null ; Web . t h i s . f i n i s h ( ) ; } }

126

APNDICE C. CDIGO

C.4.

Rtsp

/ La c l a s e Rtsp implementa e l r e p r o d u c t o r de v d e o para visualizar e l s t r e a m i n g s e r v i d o mediante RTSP @author Ivn A l e j a n d r o Fernndez Pacheco @ ve r si o n 1 . 0 A b r i l 2010 /

// Paquete de t r a b a j o d e l p r o y e c t o package p r o y e c t o . V i d e o v i g i l a n c i a ; // Importamos l a s c l a s e s n e c e s a r i a s import a n d r o i d . app . A c t i v i t y ; import a n d r o i d . media . AudioManager ; import a n d r o i d . media . MediaPlayer ; import a n d r o i d . media . MediaPlayer . O n B u f f e r i n g U p d a t e L i s t e n e r ; import a n d r o i d . media . MediaPlayer . OnCompletionListener ; import a n d r o i d . media . MediaPlayer . O n P r e p a r e d L i s t e n e r ; import a n d r o i d . media . MediaPlayer . OnVideoSizeChangedListener ; import a n d r o i d . o s . Bundle ; import a n d r o i d . u t i l . Log ; import a n d r o i d . view . KeyEvent ; import a n d r o i d . view . S u r f a c e H o l d e r ; import a n d r o i d . view . S u r f a c e V i e w ; import a n d r o i d . view . View ; import a n d r o i d . view . View . O n C l i c k L i s t e n e r ; import a n d r o i d . w i d g e t . ImageButton ;

// C l a s e que h e r e d a de A c t i v i t y e implementa O n B u f f e r i n g U p d a t e L i s t e n e r , OnCompletionListener , OnPreparedListener , OnVideoSizeChangedListener , SurfaceHolder . Callback , OnClickListener public c l a s s Rtsp extends A c t i v i t y implements O n B u f f e r i n g U p d a t e L i s t e n e r , OnCompletionListener , OnPreparedListener , OnVideoSizeChangedListener , S u r f a c e H o l d e r . Callback , O n C l i c k L i s t e n e r {

C.4. Rtsp

127

// D e c l a r a c i n de a t r i b u t o s de l a c l a s e private s t a t i c f i n a l S t r i n g TAG = " MediaPlayerDemo " ; private int mVideoWidth ; private int mVideoHeight ; private MediaPlayer mp; private S u r f a c e V i e w mPreview ; private S u r f a c e H o l d e r h o l d e r ; private boolean mIsVideoSizeKnown = f a l s e ; private boolean mIsVideoReadyToBePlayed = f a l s e ; private ImageButton a d e l a n t e ; private ImageButton a t r a s ; private ImageButton pausa ; private ImageButton s t o p ; public Bundle e x t r a s ; public void onCreate ( Bundle i c i c l e ) { super . onCreate ( i c i c l e ) ; setContentView (R. l a y o u t . s t r e a m i n g ) ; extras = getIntent () . getExtras () ; // I n s t a n c i a m o s l o s d i s t i n t o s e l e m e n t o s pausa = setupImageButton (R. i d . pausa ) ; s t o p = setupImageButton (R. i d . s t o p ) ; a t r a s = setupImageButton (R. i d . a d e l a n t e ) ; a d e l a n t e = setupImageButton (R. i d . a t r a s ) ; mPreview = ( S u r f a c e V i e w ) findViewById (R. i d . s u r f a c e ) ; h o l d e r = mPreview . g e t H o l d e r ( ) ; h o l d e r . addCallback ( t h i s ) ; h o l d e r . setType ( S u r f a c e H o l d e r .SURFACE_TYPE_PUSH_BUFFERS) ; }

/ Metodo que c r e a e l MediaPlayer y l o e j e c u t a / private void p l a y V i d e o ( ) { doCleanUp ( ) ; mp = new MediaPlayer ( ) ; try { mp. s e t D a t a S o u r c e ( " r t s p : / / "+e x t r a s . g e t S t r i n g ( " S e r v i d o r " )+" /"+e x t r a s . g e t S t r i n g ( " camara " )+" t "+e x t r a s . g e t I n t ( "

128

APNDICE C. CDIGO

tiempo " ) ) ; mp. s e t D i s p l a y ( h o l d e r ) ; mp. p r e p a r e ( ) ; mp. s e t O n B u f f e r i n g U p d a t e L i s t e n e r ( t h i s ) ; mp. s e t O n C o m p l e t i o n L i s t e n e r ( t h i s ) ; mp. s e t O n P r e p a r e d L i s t e n e r ( t h i s ) ; mp. s e t O n V i d e o S i z e C h a n g e d L i s t e n e r ( t h i s ) ; mp. setAudioStreamType ( AudioManager .STREAM_MUSIC) ; } catch ( E x c e p t i o n e ) { e . printStackTrace () ; }

/ Metodo que implementa l a i n t e r f a z y c o n t r o l a l a actualizacin del buffer @param ar g0 MediaPlayer @param percent Porcentaje del b u f f e r / public void o n B u f f e r i n g U p d a t e ( MediaPlayer arg0 , int p e r c e n t ) { Log . d (TAG, " o n B u f f e r i n g U p d a t e p e r c e n t : " + p e r c e n t ) ; }

/ Metodo que implementa l a i n t e r f a z y v e r e f i c a s i e s t a completo @param ar g0 MediaPlayer / public void onCompletion ( MediaPlayer a r g 0 ) { Log . d (TAG, " onCompletion c a l l e d " ) ; }

/ Metodo que implementa l a i n t e r f a z y c o n t r o l a l o s cambios de tamao @param mp MediaPlayer

C.4. Rtsp

129

@param @param /

width height

Ancho Altura

public void onVideoSizeChanged ( MediaPlayer mp, int width , int height ) { Log . v (TAG, " onVideoSizeChanged c a l l e d " ) ; i f ( width == 0 | | h e i g h t == 0 ) { Log . e (TAG, " i n v a l i d v i d e o width ( " + width + " ) o r h e i g h t ( " + height + ")") ; return ; } mIsVideoSizeKnown = true ; mVideoWidth = width ; mVideoHeight = h e i g h t ; i f ( mIsVideoReadyToBePlayed && mIsVideoSizeKnown ) { startVideoPlayback () ; } }

/ Metodo que implementa l a i n t e r f a z y v e r i f i c a que e l reproductor e s t preparado @param mediaplayer MediaPlayer / public void onPrepared ( MediaPlayer m e d i a p l a y e r ) { Log . d (TAG, " onPrepared c a l l e d " ) ; mIsVideoReadyToBePlayed = true ; i f ( mIsVideoReadyToBePlayed && mIsVideoSizeKnown ) { startVideoPlayback () ; } }

130

APNDICE C. CDIGO

/ Metodo que implementa l a i n t e r f a z e i n d i c a que l a s u p e r c i e ha cambiado @param surfaceholder Superficie @param i @param j @param k / public void s u r f a c e C h a n g e d ( S u r f a c e H o l d e r s u r f a c e h o l d e r , int i , int j , int k ) { Log . d (TAG, " s u r f a c e C h a n g e d c a l l e d " ) ; }

/ Metodo que implementa l a i n t e r f a z y c o n t r o l a l a d e s t r u c c i n del buffer @param surfaceholder Superfice / public void s u r f a c e D e s t r o y e d ( S u r f a c e H o l d e r s u r f a c e h o l d e r ) { Log . d (TAG, " s u r f a c e D e s t r o y e d c a l l e d " ) ; }

/ Metodo que implementa l a i n t e r f a z y c o n t r o l a l a c r e a c i n de la superficie @param holder Superfice / public void s u r f a c e C r e a t e d ( S u r f a c e H o l d e r h o l d e r ) { Log . d (TAG, " s u r f a c e C r e a t e d c a l l e d " ) ; p la yV i d e o ( ) ; }

C.4. Rtsp

131

/ Metodo que implementa l a pausa en e l r e p r o d u c t o r / protected void onPause ( ) { super . onPause ( ) ; releaseMediaPlayer () ; doCleanUp ( ) ; }

/ Metodo que implementa e l f i n d e l r e p r o d u c t o r @param ar g0 MediaPlayer @param percent Porcentaje del b u f f e r / protected void onDestroy ( ) { super . onDestroy ( ) ; releaseMediaPlayer () ; doCleanUp ( ) ; }

/ Metodo que implementa l a c o n t i n u a c i n d e l r e p r o d u c t o r / private void r e l e a s e M e d i a P l a y e r ( ) { i f (mp != null ) { mp. r e l e a s e ( ) ; mp = null } }

/ Metodo que implementa e l r e s e t e o d e l r e p r o d u c t o r

132

APNDICE C. CDIGO

@param @param /

ar g0 percent

MediaPlayer Porcentaje del b u f f e r

private void doCleanUp ( ) { mVideoWidth = 0 ; mVideoHeight = 0 ; mIsVideoReadyToBePlayed = f a l s e ; mIsVideoSizeKnown = f a l s e ; }

/ Metodo que implementa e l p l a y d e l r e p r o d u c t o r / private void s t a r t V i d e o P l a y b a c k ( ) { Log . v (TAG, " s t a r t V i d e o P l a y b a c k " ) ; h o l d e r . s e t F i x e d S i z e ( mVideoWidth , mVideoHeight ) ; mp. s t a r t ( ) ; }

/ Metodo que g e s t i o n a l a s imgenes de l o s b o t o n e s @param viewId MediaPlayer / private ImageButton setupImageButton ( int v i e w I d ) { ImageButton button = ( ImageButton ) findViewById ( v i e w I d ) ; i f ( button != null ) { button . s e t O n C l i c k L i s t e n e r ( t h i s ) ; } return button ; }

C.4. Rtsp

133

/ Metodo que g e s t i o n a l o s c l i c k s de l o s b o t o n e s / public void o n C l i c k ( View v ) { i f ( v == a d e l a n t e ) { try { int tiempo=e x t r a s . g e t I n t ( " tiempo " ) 1; mp. s e t D a t a S o u r c e ( " r t s p : / / "+e x t r a s . g e t S t r i n g ( " S e r v i d o r " ) +" /"+e x t r a s . g e t S t r i n g ( " camara " )+" t "+tiempo ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace () ; } } e l s e i f ( v == s t o p ) { mp. pause ( ) ; } e l s e i f ( v == pausa ) { mp. r e l e a s e ( ) ; } e l s e i f ( v == a t r a s ) { try { int tiempo=e x t r a s . g e t I n t ( " tiempo " ) +1; mp. s e t D a t a S o u r c e ( " r t s p : / / "+e x t r a s . g e t S t r i n g ( " S e r v i d o r " ) +" /"+e x t r a s . g e t S t r i n g ( " camara " )+" t "+tiempo ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace () ; } } }

/ Metodo que g e s t i o n a l o s e v e n t o s de l a s d i s t i n t a s t e c l a s d e l PAD @param keyCode C l av e de l a t e c l a @param event Evento @return s u p e r . onKeyDown ( keyCode , e v e n t ) / public boolean onKeyDown ( int keyCode , KeyEvent e v e n t ) { i f ( keyCode == KeyEvent .KEYCODE_BACK) Rtsp . t h i s . f i n i s h ( ) ;

134

APNDICE C. CDIGO

return true ; } }

C.5. Registro

135

C.5.

Registro

/ La c l a s e R e g i s t r o r e p r e s e n t a cada una de l o s e l e m e n t o s de l a lnea y correspondientes a t r i b u t o s de cada l n e a de l a s l i s t a s @author Ivn A l e j a n d r o Fernndez Pacheco @ v e r s i o n 1 . 0 A b r i l 2010 / // Paquete de t r a b a j o d e l p r o y e c t o package p r o y e c t o . V i d e o v i g i l a n c i a ; // D e c l a r a c i n de l a c l a s e public c l a s s R e g i s t r o { // D e c l a r a c i n de l o s a t r i b u t o s de l a c l a s e private S t r i n g localName ; private int l o c a l I m a g e ; private S t r i n g IP ;

/ Metodo c o n s t r u c t o r de l a c l a s e @param localName Nombre i d e n t i f i c a d o r @param l o c a l I m a g e Icono @param IP D i r e c c i n IP / public R e g i s t r o ( S t r i n g localName , int l o c a l I m a g e , S t r i n g IP ) { t h i s . localName = localName ; this . localImage = localImage ; t h i s . IP=IP ; }

/ Metodo c o n s t r u c t o r de l a c l a s e @param l o c a l I m a g e Icono @param IP D i r e c c i n IP

136

APNDICE C. CDIGO

/ public R e g i s t r o ( S t r i n g IP , int l o c a l I m a g e ) { this . localImage = localImage ; t h i s . IP=IP ; }

/ Metodo c o n s t r u c t o r de l a c l a s e por d e f e c t o / public R e g i s t r o ( ) { }

/ Metodo que d e v u e l v e e l nombre d e l e l e m e n t o @return localName Nombre d e l e l e m e n t o / public S t r i n g getLocalName ( ) { return localName ; }

/ Metodo para a s i g n a r e l nombre d e l e l e m e n t o @param localName Nombre d e l e l e m e n t o / public void setLocalName ( S t r i n g localName ) { t h i s . localName = localName ; }

/ Metodo que d e v u e l v e l a imagen

C.5. Registro

137

@return l o c a l I m a g e /

Imagen

public int g e t L o c a l I m a g e ( ) { return l o c a l I m a g e ; }

/ Metodo para a s i g n a r l a imagen @param l o c a l I m a g e Imagen / public void s e t L o c a l I m a g e ( int l o c a l I m a g e ) { this . localImage = localImage ; }

/ Metodo que d e v u e l v e l a IP @return IP D i r e c c i n IP / public S t r i n g g e t L o c a l I P ( ) { return IP ; }

/ Metodo para a s i g n a r l a IP @param IP D i r e c c i n IP / public void s e t L o c a l I I P ( S t r i n g IP ) { t h i s . IP = IP ; } }

138

APNDICE C. CDIGO

C.6.

Ficheros

/ La c l a s e F i c h e r o s c o n t i e n e l a s u t i l i d a d e s n e c e s a r i a s para escribir y leer l o s f i c h e r o s de c o n f i g u r a c i n t a n t o de l a s cmaras como de los servidores , a s como i n t e r a c t u a r con e l l o s @author Ivn A l e j a n d r o Fernndez Pacheco @ ve r si o n 1 . 0 A b r i l 2010 / // Paquete de t r a b a j o d e l p r o y e c t o package p r o y e c t o . V i d e o v i g i l a n c i a ;

// Importamos l a s c l a s e s n e c e s a r i a s import j a v a . i o . B u f f e r e d R e a d e r ; import j a v a . i o . B u f f e r e d W r i t e r ; import j a v a . i o . F i l e ; import j a v a . i o . F i l e R e a d e r ; import j a v a . i o . F i l e W r i t e r ; import j a v a . i o . IOException ; import j a v a . u t i l . Vector ; import a n d r o i d . u t i l . Log ;

// D e c l a r a c i n de l a c l a s e public c l a s s F i c h e r o s { // D e c l a r a c i n de l o s a t r i b u t o s de c l a s e B u f f e r e d R e a d e r br ; B u f f e r e d W r i t e r bw ; File f ;

/ Metodo c o n s t r u c t o r de l a c l a s e @param f F i c h e r o de c o n f i g u r a c i n /

C.6. Ficheros

139

public F i c h e r o s ( F i l e f ) { t h i s . f=f ; i f ( f . i s D i r e c t o r y ( ) ) Log . i ( " E r r o r " , " El f i c h e r o de camaras dado e s un d i r e c t o r i o " ) ; i f ( ! f . e x i s t s ( ) ) Log . i ( " E r r o r " , " El f i c h e r o de camaras esta vacio ") ; }

/ Metodo para l e c t u r a d e l f i c h e r o @return elementos Elementos l e d o s d e l f i c h e r o / public Vector<S t r i n g > l e e r F i c h e r o ( ) throws E x c e p t i o n { S t r i n g s="" ; // Creacin d e l v e c t o r a d e v o l v e r Vector<S t r i n g > e l e m e n t o s = new Vector<S t r i n g >() ; try { // Creacin d e l B u f f e r e d R e a d e r para l e e r d e l f i c h e r o br=new B u f f e r e d R e a d e r ( new F i l e R e a d e r ( f ) ) ; //Comprobamos que no haya l n e a s a l p r i n i c i p i o i f ( s . equals ( "" ) ) { while ( s . e q u a l s ( " " ) && s != null ) { s=br . r e a d L i n e ( ) ; } } //Comprobamos que no haya l n e a s v a c i a s n i n u l a s while ( s != null && ! s . e q u a l s ( "" ) ) { e l e m e n t o s . add ( s ) ; s=br . r e a d L i n e ( ) ; } br . c l o s e ( ) ; } catch ( E x c e p t i o n e x c e p c i o n ) {

140

APNDICE C. CDIGO

Log . i ( " E r r o r " , " Se ha p r o d u c i d o e r r o r e s en l a l e c t u r a d e l f i c h e r o : " ) ; Log . i ( " E r r o r " , e x c e p c i o n . getMessage ( ) ) ; return null ; } return e l e m e n t o s ; }

/ Metodo que d e v u e l v e un e l e m e n t o d e l f i c h e r o @param i d I d e n t i f i c a d o r d e l elemento @param s D i r e c c i n IP / public S t r i n g getElemento ( int i d ) { int i = 1 ; String s ; try { // Creacin d e l B u f f e r e d R e a d e r para l e e r d e l f i c h e r o br = new B u f f e r e d R e a d e r ( new F i l e R e a d e r ( f ) ) ; s = br . r e a d L i n e ( ) . t r i m ( ) ; //Comprobamos que no haya l n e a s v a c a s n i n u l a s while ( s != null && ! s . e q u a l s ( "" ) ) { i f ( i d == i ) return s ; e l s e s = br . r e a d L i n e ( ) . t r i m ( ) ; } br . c l o s e ( ) ; } catch ( IOException e x c e p c i o n ) { Log . i ( " E r r o r " , " Se ha p r o d u c i d o e r r o r e s en l a l e c t u r a d e l f i c h e r o : " ) ; Log . i ( " E r r o r " , e x c e p c i o n . getMessage ( ) ) ; } return null ; }

C.6. Ficheros

141

/ Metodo para a a d i r un nuevo e l e m e n t o @param IP / public void nuevoElemento ( S t r i n g IP ) { try { // Leemos e l f i c h e r o de c o n f i g u r a c i n Vector<S t r i n g > c = l e e r F i c h e r o ( ) ; i f ( c==null ) c= new Vector<S t r i n g >() ; c . addElement ( IP ) ; // Creamos un B u f f e r e d W r i t e r para e s c r i b i r bw=new B u f f e r e d W r i t e r ( new F i l e W r i t e r ( f ) ) ; f o r ( int i = 0 ; i <c . s i z e ( ) ; i ++){ bw . w r i t e ( ( S t r i n g ) c . elementAt ( i ) ) ; bw . newLine ( ) ; } bw . c l o s e ( ) ; bw . f l u s h ( ) ; } catch ( E x c e p t i o n e ) { Log . i ( " E r r o r " , " Se ha p r o d u c i d o un e r r o r a l a a d i r l a camara : " ) ; Log . i ( " E r r o r " , e . getMessage ( ) ) ; } }

/ Metodo para b o r r a r un e l e m e n t o @param i d I d e n t i f i c a d o r d e l elemento / public void borraElemento ( int i d ) {

142

APNDICE C. CDIGO

try { // Leemos e l f i c h e r o de c o n f i g u r a c i n Vector<S t r i n g > c = l e e r F i c h e r o ( ) ; Vector<S t r i n g >nuevo=new Vector<S t r i n g >() ; fo r ( int i = 0 ; i <c . s i z e ( ) ; i ++){ i f ( i d !=( i +1) ) { nuevo . addElement ( ( S t r i n g ) c . elementAt ( i ) ) ; } } // R e e s c r i b i m o s e l f i c h e r o con l o s cambios r e a l i z a d o s bw=new B u f f e r e d W r i t e r ( new F i l e W r i t e r ( f ) ) ; fo r ( int i = 0 ; i <nuevo . s i z e ( ) ; i ++){ bw . w r i t e ( ( S t r i n g ) nuevo . elementAt ( i ) ) ; bw . newLine ( ) ; } bw . c l o s e ( ) ; } catch ( E x c e p t i o n e ) { Log . i ( " E r r o r " , " Se ha p r o d u c i d o un e r r o r a l b o r r a r l a camara : " ) ; Log . i ( " E r r o r " , e . getMessage ( ) ) ; } }

/ Metodo para v e r i f i c a r que l a e s t r u c t u r a de l a d i r e c c i n IP es correcta . @param i p Direccin a v a e r i f i c a r / public boolean v e r i f i c a I P ( S t r i n g i p ) { String octetos [ ] = ip . s p l i t (" \\. ") ; int num ; i f ( o c t e t o s . l e n g t h !=4) { return f a l s e ; }

C.6. Ficheros

143

else { f o r ( int i =0; i <o c t e t o s . l e n g t h ; i ++){ try { num = I n t e g e r . p a r s e I n t ( o c t e t o s [ i ] ) ; System . out . p r i n t l n ( o c t e t o s [ i ] ) ; i f (num>255 | | num <0) throw new E x c e p t i o n ( " E r r o r " ) ; } catch ( E x c e p t i o n e ) { return f a l s e ; } } return true ; } } }

Vous aimerez peut-être aussi