Una metodología basada en XML para la configuración y
Transcripción
Una metodología basada en XML para la configuración y
Escuela Técnica Superior de Ingenierı́as Informática y de Telecomunicación Una metodologı́a basada en XML para la configuración y despliegue de aplicaciones DDS Javier Sánchez Monedero Dirigido por: Juan Manuel López Soler Departamento de Teorı́a de la Señal, Telemática y Comunicaciones Universidad de Granada Granada, 22 de septiembre de 2008 Resumen En las últimas décadas, las redes de ordenadores han mejorado en prestaciones y calidad. Estos avances tecnológicos han permitido, y permiten, nuevos paradigmas en el desarrollo de programas, como son las aplicaciones distribuidas. Entre otras tecnologı́as, para facilitar el desarrollo de estas aplicaciones han aparecido los denominados middlewares: una capa software que facilita al programador la construcción del sistema distribuido abstrayéndole de las tareas de comunicación. Este es el caso de la tecnologı́a DDS (Data Distribution Service), un middleware orientado a la difusión de mensajes en entornos distribuidos con restricciónes de tiempo-real. DDS se utiliza con éxito en redes relativamente pequeñas en las que intervienen unas decenas o centenares de nodos sobre los que ejecutan aplicaciones distribuidas. Actualmente se plantea conocer si DDS puede implantarse en entornos mayores y si mejorará las tecnologı́as existentes en este campo. El presente proyecto afronta algunos de los retos que aparecen en el desarrollo de grandes escenarios DDS mediante la propuesta de una nueva metodologı́a en el desarrollo de aplicaciones DDS. La metodologı́a planteada minimiza el esfuerzo de programación permitiendo especificar gran parte del escenario DDS mediante XML. En consecuencia, el tiempo de desarrollo de sistemas distribuı́dos y la probabilidad de que aparezcan errores de programación se reducen. Especialmente para el campo de la experimentación, en el que deben lanzarse muchas pruebas variando las aplicaciones distribuı́das, este proyecto resulta de gran interés. La metodologı́a se complementa con el desarrollo de aplicaciones para la coordinación de nodos de la red sobre la que se ejecuta el escenario. Estas herramientas presentan al desarrollador una vista global y de alto nivel para el control del escenario distribuido. Agradecimientos En primer lugar quiero agradecer a mi familia, Luis, Maria Jesús y Amaya, el apoyo, el ánimo y la comprensión que me han dado durante mis años de estudios en Córdoba y Granada. En segundo lugar, agradecer los ánimos de mis amigos, en especial el de Carmen. Gracias a ella por aguantar mis dos proyectos y por ayudarme con la documentación. Gracias a todos por asistir a los ensayos de mis presentaciones. Gracias a la gente que hoy en dı́a pasa por la universidad con la intención de aprender, enseñar, debatir y participar activamente en todos sus ámbitos. Gracias a los representantes de alumnos que han compartido su tiempo conmigo en el Consejo de Estudiantes de la Escuela Politécnica de la Universidad de Córdoba, la Delegación de Alumnos de la E.T.S. de Ingenierı́as Informática y de Telecomunicación de la Universidad de Granada y de la sectorial de estudiantes de Informática (RITSI). No todo tiene que ser lucrativo en esta vida. Dar las gracias mi tutor, Juanma, por el tiempo e interés que ha dedicado a este proyecto. Por último, me gustarı́a agradecer a Gerardo y Fernando de RTI la resolución de dudas, aportación de ideas y la revisión continua del proyecto. Resulta un verdadero lujo contar con el soporte de personas con gran conocimiento técnico y experiencia. Sinceramente, gracias. ÍNDICE GENERAL 1. Introducción 1.1. Presentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Contextualización . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1. La empresa Real-Time Innovations . . . . . . . . . . . 1.2.2. La plataforma PASITO . . . . . . . . . . . . . . . . . . 1.2.3. Experimentación con DDS sobre PASITO . . . . . . . 1.3. Definición del problema . . . . . . . . . . . . . . . . . . . . . 1.4. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5. Recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1. Humanos . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.2. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.3. Software . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6. Fases de Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . 1.7. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7.1. Factores dato . . . . . . . . . . . . . . . . . . . . . . . 1.7.2. Factores estratégicos . . . . . . . . . . . . . . . . . . . 1.8. Antecedentes y estado del arte . . . . . . . . . . . . . . . . . 1.8.1. Antecedentes en distribución de datos . . . . . . . . . 1.8.2. El lenguaje XML . . . . . . . . . . . . . . . . . . . . . 1.8.3. Herramientas para el desarrollo de aplicaciones DDS 1.9. Aproximación a la solución propuesta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 3 3 4 5 6 7 7 8 8 8 9 9 10 11 11 12 14 16 2. Especificación de Requisitos 2.1. Requisitos Funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Requisitos no Funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 21 3. Planificación 23 I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Análisis de Requisitos 4.1. Casos de uso del sistema . . . . . . . . . . . . . 4.1.1. Identificación de los actores del sistema 4.1.2. Diagrama de casos de uso . . . . . . . . 4.1.3. Listado de los casos de uso . . . . . . . 4.2. Gramática de interacción con el escenario . . . 4.2.1. Definición de la gramática . . . . . . . . 4.2.2. Estructura de datos de órdenes . . . . . 4.3. Lenguaje de descripción de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. Diseño 5.1. Arquitectura del sistema . . . . . . . . . . . . . . . . . . . . . . . 5.1.1. ¿Cómo describir un escenario DDS? . . . . . . . . . . . . 5.1.2. La interacción y coordinación del escenario . . . . . . . . 5.1.3. Funcionalidades para mejorar la flexibilidad del sistema 5.2. Modelo de interacción de objetos . . . . . . . . . . . . . . . . . . 5.2.1. Acción cargar escenario . . . . . . . . . . . . . . . . . . . . 5.2.2. Acción crear entidad DDS . . . . . . . . . . . . . . . . . . . 5.2.3. Acción iniciar comportamiento . . . . . . . . . . . . . . . . 5.3. Diagrama de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 27 27 28 29 30 31 32 33 . . . . . . . . . 37 37 37 41 42 45 46 47 51 58 6. Implementación 6.1. Implementación de la orientación a objetos en C . . . . . . 6.2. Implementación del analizador de gramática semi-natural 6.3. Estructuración modular del código . . . . . . . . . . . . . . 6.3.1. Modelo Estático: clases DDS XML y parser XML . . 6.3.2. Modelo Dinámico . . . . . . . . . . . . . . . . . . . . 6.3.3. Módulo de coordinación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 63 65 65 65 68 70 7. Pruebas 7.1. Herramientas para la realización de pruebas 7.2. Pruebas unitarias . . . . . . . . . . . . . . . . 7.3. Pruebas de integración . . . . . . . . . . . . . 7.4. Pruebas de sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 74 74 75 75 8. Resultados y Trabajo Futuro 8.1. Principales contribuciones de este trabajo . . . . . . . . . . . . . . . . . . . 8.2. Trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 77 78 A. Introducción a DDS 85 B. Despliegue y desarrollo de un escenario incrementalmente 93 II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C. Ficheros utilizados en las pruebas 103 C.1. Fichero de definición de tipo de documento (DTD) . . . . . . . . . . . . . . 103 C.2. Fichero de prueba scenario.xml . . . . . . . . . . . . . . . . . . . . . . . 104 Glosario 109 III IV ÍNDICE DE FIGURAS 1.1. Mapa de la plataforma PASITO . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Especificación de entidades DDS con Enterprise Architect . . . . . . . . . . 1.3. Descripción de escenarios DDS mediante los modelos Estático y Dinámico . 4 15 18 3.1. Detalle del diagrama de Gantt de la planificación inicial del proyecto . . . 3.2. Planificación inicial del proyecto en formato tabular . . . . . . . . . . . . . 24 25 4.1. Diagrama de casos de uso del sistema . . . . . . . . . . . . . . . . . . . . . 28 Descripción de aplicaciones DDS mediante los modelos Estático y Dinámico Árbol del el Modelo Estático para una aplicación DDS . . . . . . . . . . . . Coordinación del escenario distribuidos utilizando DDS . . . . . . . . . . Ejemplo explicativo del funcionamiento de las instancias y parámetros de recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5. Diagrama de secuencia cargar escenario . . . . . . . . . . . . . . . . . . . . . 5.6. Diagrama de secuencia crear entidad DDS, parte genérica. . . . . . . . . . . 5.7. Diagrama de secuencia crear entidad DDS, DDS XMLDomainParticipant . 5.8. Diagrama de secuencia crear entidad DDS, DDS XMLDomainPublisher . . 5.9. Diagrama de secuencia crear entidad DDS, DDS XMLDomainSubscriber . 5.10. Diagrama de secuencia iniciar comportamiento, parte genérica. . . . . . . . . 5.11. Diagrama de secuencia iniciar comportamiento, DDS XMLDomainParticipant 5.12. Diagrama de secuencia iniciar comportamiento, DDS XMLDomainPublisher 5.13. Diagrama de secuencia iniciar comportamiento, DDS XMLDomainSubscriber 5.14. Vista general del diagrama de clases . . . . . . . . . . . . . . . . . . . . . . 5.15. Detalle del diagrama de clases: DDS XMLApplication . . . . . . . . . . . . 5.16. Detalle del diagrama de clases: DDS XMLParticipant . . . . . . . . . . . . 5.17. Detalle del diagrama de clases: DDS XMLPublisher . . . . . . . . . . . . . 5.18. Detalle del diagrama de clases: DDS XMLSubscriber . . . . . . . . . . . . 5.19. Detalle del diagrama de clases: DDS XMLTopic . . . . . . . . . . . . . . . . 5.20. Detalle del diagrama de clases: DDS XMLDataWriter . . . . . . . . . . . . 39 40 42 5.1. 5.2. 5.3. 5.4. V 44 47 49 50 52 52 53 55 56 57 58 59 59 60 60 60 61 5.21. Detalle del diagrama de clases: DDS XMLDataReader . . . . . . . . . . . . 5.22. Detalle del diagrama de clases: CommandPublisher . . . . . . . . . . . . . 5.23. Detalle del diagrama de clases: CommandSubscriber . . . . . . . . . . . . 61 62 62 A.1. A.2. A.3. A.4. A.5. 86 86 87 88 90 Arquitectura de un sistema de distribución de datos sin DDS . Arquitectura de un sistema de distribución de datos con DDS Infraestructura de DDS . . . . . . . . . . . . . . . . . . . . . . . Entidades DDS participantes en un Dominio (Domain) . . . . . Modelo conceptual de las entidades DDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.1. Representación de despliegue de un escenario: estado inicial . . . . . . . . 94 B.2. Representación de despliegue de un escenario: distribución del escenario y asignación de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 B.3. Representación de despliegue de un escenario: creación varias entidades DDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 B.4. Representación de despliegue de un escenario: creación de dos DataWriters 98 B.5. Representación de despliegue de un escenario: inicio de la actividad de algunas entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 B.6. Representación de despliegue de un escenario: incremento del número de entidades y actividad en el escenario . . . . . . . . . . . . . . . . . . . . . . 100 B.7. Representación de despliegue de un escenario: destrucción de las entidades DDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 B.8. Representación de despliegue de un escenario: finalización de la ejecución de los CommandSubscribers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 VI ÍNDICE DE CÓDIGO 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 6.1. 6.2. 6.3. 6.4. 6.5. 6.6. C.1. C.2. Gramática BNF definida para interacción con el escenario . . . . . . . . . . 31 Fichero IDL correspondiente al tema de control . . . . . . . . . . . . . . . . . 32 Descripción de una aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Descripción de un participante de dominio (Domain Participant) . . . . . . . . 34 Descripción de un tema (Topic) . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Descripción de un publicador (Publisher) . . . . . . . . . . . . . . . . . . . . 35 Descripción de un subscriptor (Subscriber) . . . . . . . . . . . . . . . . . . . 36 Código XML para mostrar el funcionamiento de la herencia . . . . . . . . 66 Código XML para mostrar el funcionamiento de la herencia . . . . . . . . 66 Estructura DDS XMLDataReader . . . . . . . . . . . . . . . . . . . . . . . . 67 Tablas del Modelo Dinámico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Entradas de las tablas del Modelo Dinámico . . . . . . . . . . . . . . . . . . . 69 Integración de CommandPublisher con las reglas de análisis sintáctico de Yacc 70 Fichero de definición de tipo de documento (DTD) . . . . . . . . . . . . . . 103 Fichero de prueba scenario.xml . . . . . . . . . . . . . . . . . . . . . . . 105 VII VIII CAPÍTULO 1 INTRODUCCIÓN 1.1. Presentación En las últimas décadas, las redes de ordenadores han mejorado en prestaciones y calidad. Estos avances tecnológicos han permitido, y permiten, nuevos paradigmas en el desarrollo de aplicaciones. Este es el caso de las aplicaciones distribuidas: aplicaciones que se ejecutan en plataformas diferentes y que tı́picamente están conectadas a través de una red, sistemas de ficheros o memoria compartida. Las aplicaciones distribuidas han permitido el desarrollo de soluciones que han supuesto un salto en cuanto al aumento de la capacidad de cómputo y a la conexión entre gran cantidad de productores y consumidores de información. Ejemplos de aplicaciones distribuidas son el correo electrónico, la navegación web, los servicios de mensajerı́a instantánea, la trazabilidad de mercancı́as, las aplicaciones de cálculo cientı́fico distribuidas o el control de tráfico aéreo entre otras. Dependiendo del objeto de la aplicación que se distribuye, la tecnologı́a subyacente en la que se apoya varı́a sustancialmente. Por ejemplo, un servicio de mensajerı́a instantánea no tiene los mismos requerimientos que una sistema para coordinar vehı́culos aéreos. Ası́, han ido surgiendo diferentes tecnologı́as para dar soporte a distintos sistemas con diferentes requerimientos. Estas tecnologı́as proporcionan funcionalidades orientadas a satisfacer problemas generales de aplicaciones distribuidas, liberando al desarrollador de las tareas comunes en este tipo de software, de manera que el desarrollo puede centrarse en lo especı́fico del proyecto. Por lo general, estas tecnologı́as entran dentro del concepto de middleware. Este proyecto se centra en el middleware orientado a mensajes, cuyo objetivo es la distribución de datos a las distintas entidades, productores y consumidores de información, que componen la aplicación distribuida. Al delegarse la comunicación entre aplicaciones 1 1. Introducción al middleware, el diseñador de software puede centrarse en la resolución del problema en si. Ejemplos de tecnologı́as de distribución de datos son los servicios web[1] [2], los servicios de mensajerı́a de Java (JMS, Java Message Service)[3], CORBA (Common Object Request Broker Architecture)[4], MPI (Message Passing Interface, interfaz de paso de mensajes)[5] o DDS (Data Distribution Service)[6]. Muchas aplicaciones con restricciones de tiempo real (RT, Real-Time) utilizan un middleware para resolver las cuestiones de comunicación. Para estas aplicaciones no sólo es importante la capacidad de distribución de datos, sino también la manera en que se distribuyen estos en cuanto a eficiencia, determinismo, seguridad, fiabilidad y notificación y gestión de errores. En este campo se han diseñado soluciones para satisfacer tales restricciones, y este es el caso de la tecnologı́a DDS. DDS son las siglas del estándar Data Distribution Service for Real-Time Systems o servicio de distribución de datos para sistemas de tiempo real[6], estándar mantenido por la OMG (Object Management Group)[7]. DDS es el primer estándar internacional abierto que trata las comunicaciones de publicación–subscripción para sistemas de tiempo real y sistemas empotrados. Las implementaciones más conocidas son NDDS[8] de Real–Time Innovations[9], OpenSplice DDS[10] de PrismTech[11] y OpenDDS[12] de la empresa Object Computing[13]. Puede consultarse información sobre estas y otras implementaciones en el portal web sobre DDS[14] que mantiene la OMG. RTI Data Distribution Service, también conocido como NDDS, es un middleware de red que implementa un modelo de comunicaciones en tiempo real basado en el paradigma publicación-suscripción que permite a un proceso en un entorno distribuido compartir datos independientemente de la localización fı́sica o la arquitectura del resto de procesos. Incluye soporte para comunicaciones deterministas (best-effort) y comunicaciones fiables (reliable), incluyendo comunicaciones fiables basadas en multidifusión (multicast), ası́ como también soporte para comunicaciones cliente-servidor. Una explicación detallada de DDS se proporciona en el Apéndice A. DDS se ha utilizado con éxito en redes relativamente pequeñas en las que intervienen unas decenas o centenares de nodos sobre los que ejecutan aplicaciones distribuidas. Conforme los sistemas distribuidos aumentan en número de nodos participantes, redes que unen estos nodos, y cantidad de entidades DDS que se encargan de la distribución de los datos, aparecen una serie de retos que deben superarse. Aspectos como la configuración de la capa de transporte, la gestión de la seguridad, la definición interfaces de interacción y monitorización de cientos o miles de aplicaciones, la especificación formal del sistema, la escalabilidad, los protocolos de descubrimiento[15] y más constituyen desafı́os para las plataformas DDS. A dı́a de hoy, no existen estudios sobre los problemas y lı́mites que DDS puede encontrar en grandes escenarios. Independientemente de los nuevos retos para los fabricantes de productos DDS, el paso a grandes escenarios distribuidos necesita de metodologı́as y herramientas de prototipado rápido de aplicaciones que permitan hacer uso de todas las funcionalidades ofre2 1.2. Contextualización cidas por un middleware DDS. Gracias a estas técnicas, el despliegue y gestión de escenarios DDS permitirá identificar cuellos de botella de las implementaciones concretas o de diversas configuraciones posibles en cuanto a dominios, particiones, parámetros de calidad de servicio, temas, etc. El presente proyecto trata de dar solución al despliegue masivo de entidades DDS en redes de gran escala. El objetivo es proporcionar una metodologı́a y herramientas que permitan el desarrollo rápido y libre de errores de aplicaciones distribuidas con la intención de realizar pruebas empı́ricas con plataformas DDS en redes de grandes dimensiones. 1.2. Contextualización 1.2.1. La empresa Real-Time Innovations El proyecto se enmarca dentro del convenio de colaboración del Departamento de Teorı́a de la Señal, Telemática y Comunicaciones (TSTC en adelante) de la Universidad de Granada con la empresa Real-Time Innovations, inc (también conocida como RTI)1 situada en Sunnyvale, en el estado de California de los Estados Unidos de América. El Departamento forma parte del programa de universidades de RTI (Real-Time Innovations University Program)2 , por lo que se dispone de licencias de desarrollo gratuitas del middleware RTI Data Distribution Service (o NDDS). 1.2.2. La plataforma PASITO Profesores del Departamento TSTC forman parte del proyecto PASITO (plataforma de experimentación de servicios de telecomunicaciones)[16]. PASITO es un laboratorio de pruebas distribuido, que ofrece a los ingenieros la posibilidad de construir, depurar y evaluar escenarios de prueba de servicios de telecomunicaciones. PASITO es una infraestructura pública construida sobre la red académica española RedIRIS3 , utilizando tecnologı́as variadas para poder probar gran variedad de servicios de telecomunicaciones y, al mismo tiempo, garantizar que su actividad está aislada del resto de los servicios dela red académica, para evitar interferencias con otras actividades que estén en operación para la comunidad cientı́fica española. La Figura 1.1 muestra los nodos que componen en la actualidad PASITO. El propósito como laboratorio de servicios de telecomunicaciones es permitir investigaciones sobre: Arquitecturas para Internet. 1 http://www.rti.com/ http://www.rti.com/corporate/university.html 3 http://www.rediris.es/ 2 3 1. Introducción Figura 1.1: Mapa de la plataforma PASITO Protocolos de comunicaciones. Tecnologı́as de transporte con calidad de servicio. Virtualización y autoconfiguración de redes y servicios. Tecnologı́as y herramientas de monitorización de redes y servicios. Servicios ópticos para proyectos intensivos en datos. Tecnologı́as de distribución de grandes cantidades de información. Sistemas peer-to-peer. Servicios de movilidad. Tecnologı́as para mejorar la seguridad en redes. Estándares para servicios de colaboración de nueva generación. 1.2.3. Experimentación con DDS sobre PASITO PASITO ofrece un laboratorio de telecomunicaciones que brinda oportunidades de experimentación difı́ciles de conseguir si en la investigación sólo participa un centro. Si retomamos las ideas expuestas en la Sección de “Introducción” sobre la necesidad de 4 1.3. Definición del problema probar y experimentar con DDS en grandes escenarios de aplicaciones distribuidas, parece natural relacionar esto con la oportunidad que nos ofrece la plataforma PASITO. PASITO puede constituir, pues, la infrastructura necesaria para experimentar con DDS en un escenario situado sobre una red de área amplia. No obstante, tal y cómo se presenta en la Sección 1.1 y se concretará más adelante, el despliegue de grandes escenarios DDS en general, y para realizar experimentaciones en particular, requiere de herramientas de apoyo y metodologı́as de prototipado rápido de aplicaciones que liberen al experimentador de tareas tediosas y propensas a errores para dejar que se centre en el diseño del experimento. Ası́ pues, contextualizamos el desarrollo del proyecto dentro del marco de investigación del despliegue de escenarios DDS sobre redes de área amplia y grandes redes de computadores. 1.3. Definición del problema El desarrollo de aplicaciones DDS, en general, conlleva una serie de tareas que deben realizarse programando, mediante el API proporcionada por la plataforma DDS, la aplicación que se ejecutará en cada nodo. Llamaremos despliegue y desarrollo de un escenario a una serie de tareas necesarias para la construcción, distribución y ejecución de un escenario DDS. Esta tareas incluyen: La creación de aplicaciones con un gran número de entidades DDS asociadas a nodos concretos de la red sobre la que se sitúa al sistema distribuido. La descripción de los parámetros de configuración (dominio, nombres de temas y tipos de tatos, parámetros de QoS. . . ) para cada una de las entidades DDS que se ejecutarán en cada nodo. El establecimiento de relaciones entre las entidades DDS a nivel intranodo e internodo. La descripción de cada entidad DDS del sistema y la definición de su comportamiento. Se entiende por comportamiento a la actividad que desarrollará la entidad. Por ejemplo, un DataWriter se dedicará a escribir datos en la red. La coordinación y sincronizado del ciclo de vida de de entidades DDS. Además, deben realizarse las tareas habituales en la construcción de una aplicación genérica (escritura del código fuente, compilación y enlazado, etc.) cada vez que se quiera modificar el comportamiento de la misma o los parámetros de uso de las bibliotecas utilizadas. Tras este proceso, se necesita distribuir el resultado de la construcción a los nodos correctos y ejecutar cada aplicación en el nodo adecuado y momento adecuado. 5 1. Introducción Este procedimiento a pequeña escala puede realizarse de forma manual. Sin embargo, cuando se trata de escenarios “masivos” en entornos de área amplia, como el que se propone en la Sección 1.2.2, aparecen problemas que este proyecto trata de resolver. Estos problemas son: 1. Aumento del tiempo de desarrollo con el tamaño del escenario. 2. Garantı́a de la consistencia relacionada con la probabilidad de cometer errores de programación en si, por un lado, y, por otro, en la correcta asignación de entidades DDS a nodos. 3. Dificultad para reproducir pruebas. El presente proyecto tratará de dar solución a los problemas que se han descrito. Ası́ pues, como resultado final se deberá proporcionar al usuario, el desarrollador de un escenario distribuido de gran tamaño, un conjunto de herramientas que le permita: Automatizar la mayor parte posible de las tareas anteriormente enumeradas. Minimizar la tarea de programación del diseñador de pruebas y liberarle, en la medida de lo posible, del conocimiento profundo del API de DDS. De esta forma se pretende que el usuario se centre en el diseño del sistema y las pruebas, y no en las labores de desarrollo. Coordinar la realización y dar consistencia a las pruebas sobre escenarios en entornos reales. 1.4. Objetivos Descrito ya el problema, en este apartado se detallarán los objetivos que persigue el proyecto: Proporcionar una manera flexible de describir escenarios DDS. Se trata de proporcionar al usuario un conjunto de herramientas que permitan describir un escenario distribuido compuesto por aplicaciones que se comunican utilizando un middleware DDS. Este objetivo se divide en tres subobjetivos: Diseñar un lenguaje de descripción de aplicaciones, esto es, especificar un lenguaje que permita al usuario describir los elementos que conforman el escenario y sus parámetros de configuración. Como resultado, se espera facilitar la descripción de aplicaciones minimizando al mismo tiempo los conocimientos necesarios del API de DDS. 6 1.5. Recursos Proporcionar una interfaz de descripción del comportamiento de las aplicaciones. Este objetivo complementa el anterior, puesto que añade a la descripción de entidades DDS en si, la descripción del comportamiento que éstas tendrán en el escenario. Proporcionar al usuario una metodologı́a de desarrollo rápido de aplicaciones DDS. El proyecto ofrece una alternativa al desarrollo tradicional de aplicaciones4 , ası́ pues, deberá proponerse una nueva metodologı́a de desarrollo de aplicaciones DDS. Dicha metodologı́a establecerá los pasos necesarios para la construcción y despliegue de un escenario distribuido utilizando el sistema desarrollado. Proporcionar mecanismos de control sobre un escenario DDS. El sistema debe proporcionar interfaces de interacción con el escenario de forma que el usuario sea capaz de: Distribuir la descripción del escenario entre los nodos y asignar las aplicaciones DDS adecuadas a los nodos adecuados. Controlar de manera conjunta los procesos de creación o destrucción de las entidades DDS que componen el escenario, esto es, el ciclo de vida de las entidades DDS. Controlar de manera global el comportamiento que tendrán las diferentes entidades DDS del escenario. 1.5. Recursos Definido el problema, en esta sección se describen los recursos humanos, de hardware y de software que se emplearán en el desarrollo del proyecto. 1.5.1. Humanos Prof D. Juan Manuel López Soler , profesor del Departamento de Teorı́a de la Señal, Telemática y Comunicaciones de la Universidad de Granada, como tutor del proyecto. D. Javier Sánchez Monedero , alumno de la Escuela Técnica Superior de Ingenierı́as Informática y de Telecomunicación de la Universidad de Granada, que será el encargado de realizar dicho proyecto siguiendo las directrices definidas por el tutor del mismo. 4 Entendemos como desarrollo tradicional al que se realiza programando, compilando y distribuyendo aplicaciones. 7 1. Introducción 1.5.2. Hardware Para el desarrollo del proyecto se dispone de: Ordenador portátil. Impresora láser. Conexión a Internet. 1.5.3. Software Sistema Operativo GNU/Linux Ubuntu 8.04 Hardy Heron Paquete de utilidades GNU (GNU Binutils) Paquete procesador de textos LATEX[17]. Entorno de trabajo Kile[18] para documentos escritos con LATEX. Compilador GCC v3.4 y v4.2. Entorno de desarrollo integrado para C/C++ Eclipse C/C++ Development Tooling CDT[19]. Depurador GDB v6.8[20]. Herramienta de depuración de problemas de memoria y rendimiento de programas Valgrind[21]. Alleyoop[22], interfaz gráfica para Valgrind. Biblioteca de distribución de datos RTI DDS 4.3b y 4.3e[23]. 1.6. Fases de Desarrollo Para el desarrollo de este proyecto se han considerado una serie de fases bien diferenciadas: 1. Revisión del estado del arte: en esta fase se realizará un estudio del campo de middleware y tecnologı́as relacionadas con DDS, se estudiarán alternativas en la descripción no programática de aplicaciones, ası́ como de los alternativas en despliegue de aplicaciones distribuidas. Para esto se utilizarán todos los recursos bibliográficos y electrónicos disponibles. 8 1.7. Restricciones 2. Especificación: del proyecto para delimitar su ámbito. Para esto se identificarán objetivos y se capturarán los requerimientos funcionales y no funcionales del sistema. Tras esta fase se procederá a la estimación de la planificación temporal. 3. Análisis: de los requerimientos para sentar las bases de una solución al problema. Esta fase incluye la identificación a alto nivel de las necesidades del sistema. Esto incluye la especificación el lenguaje de descripción de escenarios. 4. Diseño: del sistema. Esta etapa incluye el diseño arquitectónico del sistema, la especificación de operaciones, el diagrama de clases del sistema, etc. 5. Implementación: esta etapa consiste en la implementación de los modelos descritos en las fases anteriores. 6. Evaluación: durante esta fase se evaluarán las prestaciones de las herramientas desarrolladas en entornos reales, valorando especialmente su flexibilidad. 7. Documentación: coincidente en el tiempo con las etapas anteriores, se procederá a la generación de la documentación de los resultados pertinentes. 1.7. Restricciones Las restricciones inherentes al proyecto se clasifican en factores dato y factores estratégicos. Ambos factores influyen a la hora de tomar decisiones y delimitan el desarrollo del proyecto. 1.7.1. Factores dato Se expondrán en esta sección una serie de factores limitativos que condicionan la realización del proyecto. Estas restricciones (también conocidas como factores dato) son limitaciones impuestas que no pueden ser modificadas a lo largo del desarrollo del proyecto, y cuya imposición no tiene por qué estar justificada. Para el presente proyecto son: Económicos: economizar el coste del sistema, tanto hardware como software. Tiempo: el proyecto deberá estar finalizado para septiembre de 2008. Hardware: para el desarrollo y simulación del sistema se dispondrá de: • Dos ordenadores personales pertenecientes al autor del proyecto. • Red LAN conectada mediante un switch Ethernet de 8 puertos 10/100 Mbit/s. Software: 9 1. Introducción • Plataforma de desarrollo. El desarrollo del proyecto deberá realizarse sobre una de las plataformas (combinación de arquitectura, sistema operativo y versiones de compilador soportadas por NDDS). Considerando el hardware y software habitual en un ordenador personal, una combinación de plataforma de desarrollo aceptable es i86Linux2.6gcc3.4.3, que se traduce en arquitectura Intel 86, sistema operativo Linux 2.6 y la versión 3.4.3 del compilador GCC. • Lenguaje de descripción de aplicaciones. NDDS ya utiliza XML para la configuración de algunas de sus funcionalidades. Es un requerimiento que la descripción de aplicaciones DDS se realice mediante el lenguaje XML para posibilitar la integración de funcionalidades actuales y futuras. • Implementación del parser. En la actualidad, el procesado de ficheros XML que se hace en el producto NDDS utiliza la biblioteca EXPAT[24] para construir el reconocedor. Es un requerimiento utilizar esta biblioteca para implementar el procesador de ficheros XML dada su portabilidad a arquitecturas utilizadas por NDDS, entre otras caracterı́sticas. • Lenguaje de programación de la aplicación. El lenguaje de programación del prototipo será el lenguaje C, ya que es el lenguaje que debe utilizarse con la biblioteca EXPAT. Además, dada la manera en que integran las interfaces para diferentes lenguajes de programación en NDDS, el desarrollo base debe hacerse siempre en C. Humanos: en el desarrollo del proyecto participarán un alumno y el director del proyecto. 1.7.2. Factores estratégicos Los Factores estratégicos son factores que no dependen de la naturaleza del problema y, por tanto, permiten tomar decisiones entre varias alternativas, lo que abre la posibilidad de mejorar aspectos como por ejemplo los costes, la calidad o la extensibilidad del proyecto. Para este proyecto, consideramos como decisiones estratégicas: Plataforma de desarrollo. Se ha elegido Ubuntu GNU/Linux como plataforma de desarrollo por ser un entorno libre e ideal para el desarrollo de aplicaciones. Muchas herramientas y bibliotecas son compatibles con este sistema operativo, entre ellas NDDS. Entorno de programación. Se ha elegido el entorno de desarrollo libre para C/C++ Eclipse C/C++ Development Tooling - CDT. Eclipse es un entorno de desarrollo excelente, además de por sus funcionalidades como editor y gestor de código, por integrarse a la perfección con otras herramientas libres como el depurador GDB, la herramienta GNU make y el compilador GCC. Además, Eclipse puede extender su funcionalidad para el tratamiento de ficheros XML. 10 1.8. Antecedentes y estado del arte Depuración de errores y rendimiento. Se incluirán opciones de compilación condicional para activar mensajes de depuración en el código, a fin de facilitar la detección de errores durante el desarrollo. Además, se utilizará la herramienta Valgrind para comprobar la correcta liberación de recursos en los momentos adecuados. Portabilidad del desarrollo. Para asegurar la portabilidad de desarrollo a otras plataformas a las que no tenemos acceso, como sistemas operativos de tiempo–real, se utilizará de manera estricta el estándar del lenguaje C. El uso de algunas opciones de activación de advertencias del compilador puede ayudar a esto. Construcción del analizador sintáctico. Como se explicará durante el presente documento, se implementará un analizador de lenguaje semi-natural para facilitar la interacción del desarrollador con el escenario. Este analizador sintáctico se construirá utilizando las herramientas Lex y Yacc ya que, no sólo facilitarán la tarea, sino que generarán un analizador óptimo, robusto y fácilmente extensible. 1.8. Antecedentes y estado del arte El problema abordado se centra inicialmente en el prototipado rápido de aplicaciones y reutilización de componentes software. Desde este punto de vista, se pueden encontrar ideas de interés en algunas herramientas de automatización de pruebas distribuidas para DDS. Estas herramientas pueden configurarse, en mayor o menor medida, para adaptarse al tipo de prueba que el usuario quiere realizar. Para situar adecuadamente el trabajo realizado, en el apartado siguiente se examinan los antecedentes en sistemas de distribución de datos. A continuación se presentará brevemente el lenguaje XML y, en último lugar, se examinarán los trabajos más recientes en la configuración y prototipado de aplicaciones DDS. 1.8.1. Antecedentes en distribución de datos El desarrollo de aplicaciones distribuidas ha merecido grandes esfuerzos de investigación durante ya varias décadas. Entre las herramientas desarrolladas es de especial mención la API Berkeley Socket Distribution[25]. A partir de este punto, se han propuesto numerosos middleware, especificados para verificar los objetivos de simplificar los costes de desarrollo, optimizar las prestaciones y la utilización de los recursos de la red, ofrecer mayor escalabilidad, fiabilidad y disponibilidad, ası́ como potencial interoperatividad entre diferentes plataformas. Mencionar especı́ficamente la librerı́a RPC (Remote Procedure Call[26]), desarrollada para facilitar la ejecución de procedimientos remotos. Recientemente, RPC ha evolucionado para aprovechar la extensibilidad de XML, dando lugar a XML-RPC, middleware que tı́picamente hace uso del protocolo HTTP para transportar las transacciones. El intercambio de mensajes basados en XML sobre HTTP[27] ha dado lugar al protocolo SOAP 11 1. Introducción (Simple Object Access Protocol)[28], el cual es parte fundamental de la pila de protocolos que da soporte a los ası́ denominados Web Services[1], definidos por el consorcio W3C. En esta aproximación, se utiliza WSDL (Web Services Description Language)[2] para describir la interfaz a los objetos remotos. Es también destacable la API RMI (Remote Method Invocation)[29] para Java, la cual proporciona una funcionalidad parecida a RPC. Finalmente, no puede faltar mención a la arquitectura CORBA (Common Object Request Broker Architecture)[4] definida por el consorcio OMG. CORBA proporciona una aproximación basada en objetos, accesibles de forma remota a través de la interfaz IDL (Interface Definition Language)[30]. Todas las tecnologı́as anteriormente citadas tienen en común la adopción del ası́ denominado paradigma cliente-servidor. Alternativamente, y especialmente diseñado para su utilización en aplicaciones con requisitos de tiempo-real, se ha propuesto middleware que adopta un paradigma distinto al anterior basado en una metodologı́a publicaciónsubscripción. Este modelo se fundamenta en el intercambio ası́ncrono de mensajes. Aquı́, las entidades generadoras declaran los temas que están dispuestas a publicar, y las consumidoras se subscriben a los temas que les sean de interés. Cuando un productor publica un dato en un tópico dado, todos los subscriptores lo recibirán de forma transparente a la aplicación. De esta forma, este paradigma adopta una aproximación denominada datacentric, ya que desacopla (en el tiempo y el espacio) la interacción entre los participantes (consumidores o generadores de información), y se enfoca en la distribución de los datos, con independencia de la localización y el instante del origen o del destino de los mismos. Para la distribución de datos de acuerdo con un paradigma publicación–subscripción, la OMG ha especificado recientemente el estándar DDS (Data Distribution Service for RealTime Systems)[6] lo que, dada la solvencia y reconocimiento de esta institución, ha venido a consolidar definitivamente este nuevo paradigma o modelo de interacción alternativo. 1.8.2. El lenguaje XML Antecedentes y relevancia de XML XML son las siglas en inglés de Extensible Markup Language (“lenguaje de marcas ampliable”)[31]. Es un metalenguaje extensible de etiquetas desarrollado por el W3C (World Wide Web Consortium) y proviene de un lenguaje, inventado por IBM en los años setenta, llamado GML (General Markup Language), que surgió por la necesidad que tenı́a la empresa de almacenar grandes cantidades de información. XML se propone como un estándar para el intercambio de información estructurada entre diferentes plataformas. Se puede usar en bases de datos, editores de texto, hojas de cálculo, etc. XML es una simplificación y adaptación del SGML que permite definir la gramática de lenguajes especı́ficos. Por lo tanto XML no es realmente un lenguaje en particular, sino una manera de definir lenguajes para diferentes necesidades. Ejemplos de estos lenguajes que usan XML para su definición son XHTML, SVG o MathML. Una manera de describir la gramática de un lenguaje especı́fico basado en XML es 12 1.8. Antecedentes y estado del arte la definición de tipo de documento (DTD, Document Type Definition), que es una descripción de estructura y sintaxis de un documento XML. DTD se incluye dentro del estándar de XML inicial, aunque el propio W3C ha propuesto XSD (XML Schema Definition)[32] como alternativa que supera las limitaciones de DTD. XML presenta varias ventajas como tecnologı́a: Se basa en estándares internacionales y como tal es un estándar abierto. Puede representar estructuras de datos comunes en el campo de la informática: registros, listas y árboles. Los algoritmos de análisis sintáctico son simples, eficientes y consistentes dadas sus restricciones de sintaxis y análisis. XML se utiliza se utiliza masivamente para el almacenamiento y procesamiento de documentos. La adopción de XML en la industria e campos de investigación es alta, y es por ello que existen multitud de herramientas libres para trabajar con XML desde la generación de documentos hasta el procesado de la información almacenada en XML. Un lenguaje basado en XML puede ser fácilmente modificado de manera incremental y sin perder compatibilidad hacia atrás. La validación de documentos mediante lenguajes de esquema como DTD o XSD facilita, entre otras tareas, las relacionadas con la especificación y construcción de software. La estructura jerárquica de XML se utiliza con éxito para representar conocimiento en multitud de campos de trabajo, si bien esta estructura jerárquica no siempre es válida para un dominio de conocimiento. Desventajas de XML y alternativas Existen multitud de debates sobre las ventajas de XML que ponen en relieve circunstancias ante las cuales el uso de XML presenta más desventajas que ventajas[33]. Algunas de estas son: La sintaxis de XML es redundante o grande, en términos de tamaño, en comparación con representaciones de datos alternativos, especialmente si se utiliza para representar datos tabulares. Esta redundancia afecta al rendimiento de las aplicaciones al aumentar el tamaño de almacenamiento y transferencia, ası́ como al coste de procesamiento. 13 1. Introducción La sintaxis presenta sobrecarga de información para un lector humano en comparación con otros formatos de transferencia de datos. El modelo jerárquico de representación del conocimiento es limitado en comparación con otras alternativas, como por ejemplo, las orientadas a grafos. La expresión de solapamientos entre relaciones de los nodos requiere un esfuerzo extra. Promueve el uso de estructuras de datos no relacionales (datos no normalizados). XML introduce un fuerte acoplo entre la representación elegida y el procesamiento de la información, a diferencia de las alternativas de almacenamiento relacional y SQL. La mayor parte de las desventajas, como podemos ver, están relacionadas con la validez de XML para representar datos completos y relaciones entre estos datos. Especialmente para representar grandes cantidades de datos que deben procesarse y/o transferirse a través de una red, XML presenta una sobrecarga en el tamaño que ocupa la información al serializarse. En este sentido, han aparecido alternativas como JSON (JavaScript Object Notation, notación de objetos de JavaScript)[34][35]. JSON es un formato ligero para el intercambio de datos que puede sustituir a XML para la representación y transferencia de datos. JSON mejora notablemente el espacio de almacenamiento y ancho de banda durante la transferencia de información, aunque, a cambio, presenta limitaciones respecto a XML[36]. 1.8.3. Herramientas para el desarrollo de aplicaciones DDS Soporte para DDS de la aplicación Enterprise Architect La empresa Sparx Systems[37] ha desarrollado un complemento de soporte de DDS para su programa de diseño software Enterprise Architect llamado MDG technology for DDS [38]. Esta herramienta es capaz de generar código válido para su compilación mediante la especificación de la aplicación utilizando de la tecnologı́a MDA (Model-driven architecture, arquitectura dirigida por modelos)[39]. La arquitectura dirigida por modelos es un nuevo enfoque para el diseño y desarrollo de sistemas software propuesto por la OMG. MDA es una arquitectura que proporciona un conjunto de guı́as para estructurar especificaciones expresadas como modelos. Bajo este enfoque, la funcionalidad del sistema se define mediante los modelos independientes de plataforma (PIM, Platform-Independent Model) utilizando un lenguaje especı́fico para un dominio o de propósito general. Para diversas plataformas como CORBA, entornos Web o DDS se define un modelo de definición de plataforma (PDM, Platform Definition 14 1.8. Antecedentes y estado del arte Figura 1.2: Especificación de entidades DDS con Enterprise Architect Model). Un modelo PDM es capaz de traducir los modelos PIM en modelos especı́ficos de plataforma (PSM, Platform-Specific Models). Los PSM pueden ser ejecutados directamente en un ordenador. Enterprise Architect permite especificar los modelos a partir de una serie de formularios y diagramas UML (ver Figura 1.2). A partir de esta representación genera código DDS listo para compilarse en la plataforma NDDS. Enterprise Architect es interesante como forma de especificación de parámetros para las entidades DDS sin especificar el comportamiento de estas. Al fin y al cabo, lo que genera esta herramienta es el esqueleto de una aplicación distribuida sobre la que empezar el desarrollo. DDS Benchmark Project El grupo de investigación Distributed Object Computing (DOC) Group for Distributed Real-time and Embedded (DRE) Systems[40] es un grupo compuesto por las universidades 15 1. Introducción estadounidenses de Vanderbilt, Washington y California. Este grupo ha desarrollado una herramienta para comparar el rendimiento de diferentes implementaciones del estándar DDS llamada DDS Benchmark Project[41]. DDS Benchmark Project tiene como objetivo evaluar las siguientes caracterı́sticas de un producto DDS: El rendimiento respecto a la latencia (latency) y tasa de transferencia (throughput). La facilidad de programación de las interfaces ofrecidas. Las diferencias de rendimiento respecto a otros sistemas de publicación–subscripción. Este conjunto de herramientas permiten al usuario configurar la ejecución de pruebas distribuidas. Este sistema cuenta con varias aplicaciones DDS y cada aplicación tiene una serie de entidades DDS predefinidas. Estas entidades admiten una serie de parámetros que se especifican mediante ficheros XML, aunque estos parámetros sólo incluyen la frecuencia de publicación de datos, el tamaño de los datos y algunos parámetros de configuración QoS para DDS. No se puede especificar, por ejemplo, el tipo de datos que se publica, ni combinar varios de estos tipos en un mismo escenario. La distribución del escenario se realiza ubicando una serie de ficheros ejecutables en un sistema de ficheros de red (NFS en concreto) al que todos los nodos tienen acceso. Por otro lado, la creación de entidades DDS y su actividad se controlan mediante una serie de guiones que se ejecutan en cada nodo que participa en la prueba para ejecutar el programa adecuado. El acceso a los nodos se realiza mediante conexiones SSH. El punto fuerte de DDS Benchmark Project es que crea una capa software que adapta los algoritmos genéricos de cada prueba a la interfaz de programación de cada producto DDS, lo que permite desarrollar pruebas idénticas para comparar el rendimiento de diferentes implementaciones de DDS. En la actualidad el proyecto funciona con los productos NDDS[8], OpenSplice[10] y OpenDDS[12] y los resultados experimentales son públicos[42]. 1.9. Aproximación a la solución propuesta Antes de entrar en el desarrollo del proyecto, a modo de resumen, se ofrece una visión general de la solución propuesta. La motivación del proyecto se puede resumir como la búsqueda de una solución al prototipado rápido y masivo de aplicaciones DDS. Ésta solución plantea una serie de retos. El primer reto corresponde a la descripción de aplicaciones que componen el escenario. Para ello, se propone dividir la descripción del escenario en dos modelos: 16 1.9. Aproximación a la solución propuesta El Modelo Estático describe las entidades DDS mediante un lenguaje basado en XML que especificará tanto las entidades en sı́, como las relaciones entre éstas. El Modelo Dinámico describe el comportamiento de las entidades DDS mediante un lenguaje de programación. Los Modelo Estático y Dinámico son independientes. Esto es, el Modelo Estático de una entidad podrá asociarse a un Modelo Dinámico distinto en momentos diferentes. Esto permitirá cambiar por completo el comportamiento de una aplicación distribuida cambiando el Modelo Dinámico de sus entidades. La Figura 1.3 representa los conceptos de Modelo Estático, Modelo Dinámico y cómo un escenario puede cambiar su comportamiento reemplazando el Modelo Dinámico de sus entidades. El segundo reto corresponde al despliegue y ejecución del escenario. Para ello se dividen los nodos de la red en dos tipos: el nodo “Command Master” se encarga de publicar instrucciones para el despliegue del escenario, mientras que los nodos que del tipo “Command Slaves” estarán subscritos a las instrucciones que distribuya este nodo. El problema de la distribución de instrucciones se resuelve utilizando el propio middleware DDS. Los nodos “Command Slaves” desarrollarán aplicaciones ejecutando las órdenes que reciban los modelos estáticos y dinámicos que se les asocien. El último problema a resolver se refiere a la interacción del desarrollador con el escenario mediante una gramática semi-natural. Esta gramática permitirá especificar las órdenes que se quiere hacer llegar a los nodos del escenario. De esta forma se ofrece una interfaz para controlar el despliegue y permite una visión global del escenario. En resumen, se pretende simplificar la tarea del despliegue de uno o varios escenarios DDS de grandes dimensiones a: La descripción del escenario o escenarios mediante modelos estáticos y dinámicos. El uso los nodos “Command Master” y “Command Slaves” para desarrollar estos escenarios. El Apartado 5.1, de arquitectura del sistema, profundiza más en las ideas aquı́ expuestas. 17 1. Introducción 18Figura 1.3: Descripción de escenarios DDS mediante los modelos Estático y Dinámico CAPÍTULO 2 ESPECIFICACIÓN DE REQUISITOS Este capı́tulo tiene como objetivo identificar el conjunto de requerimientos que el sistema debe de cumplir, diferenciándose en dos tipos: Requisitos funcionales, que son los que se encuentran orientados a la funcionalidad que debe desempeñar la aplicación de cara al usuario final. Requisitos no funcionales, orientados al funcionamiento final de la aplicación. Son requisitos que no tienen que ver con la funcionalidad de la aplicación, sino como se verá más adelante, están más orientados a caracterı́sticas que debe cumplir el funcionamiento de la aplicación. El sistema en desarrollo consiste en la creación de un conjunto de herramientas para el desarrollador de aplicaciones que utilicen DDS. El usuario será, pues, un investigador o un desarrollador que pretenda comprobar la adecuación del middleware DDS a la red sobre la que experimenta o sobre el que planea implantar un sistema en producción. 2.1. Requisitos Funcionales Descripción de los parámetros de todas las entidades DDS existentes mediante XML. El punto de partida del proyecto lo constituye la descripción de entidades DDS. Esto se hará mediante la especificación de todos los parámetros que el API de DDS admite para la creación de entidades. Estos parámetros pueden ser datos simples u otras entidades DDS de manera que implı́citamente quede definida la relación de jerarquı́a entre entidades necesaria para que el sistema funcione. Debe tener mención especial la especificación de los parámetros de calidad de servicio (QoS) que se quieran aplicar a las entidades. Es un requerimiento que la descripción de todo este conocimiento se haga mediante un 19 2. Especificación de Requisitos documento XML. Este requerimiento implica la definición de tipo de documento (DTD, Document Type Definition) para validar los ficheros XML que el usuario cree. Creación de un parser o analizador sintáctico para los documentos XML definidos. Puesto que se va a trabajar con XML, deberá crearse un analizador sintáctico que permita validar el documento y crear una representación en memoria del mismo que contenga la información del fichero XML de forma estructurada. Esta estructura en memoria será el resultado del proceso de análisis sintáctico del fichero. Es un requerimiento que el analizador sintáctico se implemente extendiendo el actual analizador construido sobre la biblioteca EXPAT (ver 1.7.1 Factores Dato). Creación de un API de interacción con el documento XML. Deberá proporcionarse una API que permita al usuario consultar o modificar la información resultante del proceso de análisis sintáctico. Puesto que esta información se almacenará en una estructura de tipo árbol el API debe permitir operaciones comunes que permitan, partiendo de un nodo, acceder a nodos padres, hermanos o hijos. Esto incluye ofrecer al usuario métodos especializados de recorrido del árbol, esto es, dado, por ejemplo, un Tema, debe poder realizarse una operación de acceso directo al nodo del Participante del que es hijo. Complementando a las operaciones de navegación por el árbol, deben proporcionarse métodos de acceso a los datos almacenados en cada nodo. Creación un API que permita integrar métodos escritos por el usuario en el sistema. Como ya se argumentó en la redacción de los Objetivos (1.4), para la especificación del comportamiento será necesario el uso de métodos que describan programáticamente la actividad de cada entidad DDS. Será necesario crear una interfaz de integración de estos métodos del usuario en el sistema, ası́ como definir los lı́mites que el usuario tendrá para escribir este código. Interfaces de programación para la creación y destrucción de entidades DDS. Se debe proporcionar una interfaz de programación que permita la creación y destrucción de las entidades DDS descritas en el documento XML dado un identificador de la entidad o de entidades padres a las que pertenece. Interfaces de programación para la asignación y control del comportamiento de una entidad DDS. Se debe proporcionar una interfaz de programación que permita la asignación de métodos y listeners a entidades DDS descritas en el documento XML dado un identificador de la entidad o de entidades padres a las que pertenece. Interfaz de usuario para coordinar el ciclo de vida y actividad de las entidades DDS del escenario. Puesto que una de las aplicaciones directa del proyecto es la experimen20 2.2. Requisitos no Funcionales tación escenarios DDS compuestos de muchas entidades, será necesario proporcionar al usuario una interfaz de interacción con el escenario. Esto es decidir en qué momento se crean todas o algunas de las entidades DDS, ası́ como el momento en el que se destruyen o el momento en el que inician su actividad. Podemos adelantar que esta interfaz se encargará de producir órdenes que los nodos del escenario deberán procesar correctamente. 2.2. Requisitos no Funcionales Ejecución de tareas concurrentes. La programación de aplicaciones que procesan flujos de datos diferentes, tanto para leerlos desde la red como para enviarlos a través de la red, de manera simultánea implica el diseño, programación y prueba del software para la ejecución de tareas concurrentes de manera correcta. Rendimiento y consumo de recursos. El uso del proyecto al crear y destruir entidades DDS, hebras de tareas, etc. conllevará la asignación y liberación constante de recursos. Ésta deberá hacerse de forma eficaz y eficiente para no degradar las prestaciones de la máquina donde se ejecuta el proceso y afectar a posteriores usos de la propia aplicación. Flexibilidad. El conjunto de herramientas desarrolladas y la biblioteca de funciones deberán ser flexibles para permitir la descripción de la mayor diversidad de escenarios posibles. Portabilidad. Se deberán cuidar los aspectos de portabilidad respecto de sistemas operativos, compiladores, versiones del compilador y respecto del estándar DDS. Fácil instalación. Puesto que las herramientas deberán distribuirse a muchos nodos de red, el procedimiento de instalación de las herramientas deberá ser lo más sencillo posible. Transparencia y abstracción. Deberá abstraerse al usuario al máximo respecto a las tareas de programación y la especificación de parámetros de las entidades DDS, ası́ como de la difusión de órdenes. 21 2. Especificación de Requisitos 22 CAPÍTULO 3 PLANIFICACIÓN Una vez obtenidos los requisitos del sistema, se presenta una estimación inicial de las tareas en que se descompone el desarrollo del proyecto. La planificación del proyecto se gestiona con ayuda de la aplicación Planner[43]. La planificación se hizo mediante un diagrama de Gantt. Debido a el tamaño de este tipo de diagramas sólo se mostrará un detalle del mismo a modo de ejemplo (Ver Figura 3.1), mientras que la planificación completa se muestra en forma de tabla de datos. La estimación inicial de tareas y duración de las mismas se muestra en la Figura 3.2. 23 3. Planificación Figura 3.1: Detalle del diagrama de Gantt de la planificación inicial del proyecto 24 Figura 3.2: Planificación inicial del proyecto en formato tabular 25 3. Planificación 26 CAPÍTULO 4 ANÁLISIS DE REQUISITOS Una vez descrito el problema mediante la identificación de requisitos, funcionales y no funcionales, el siguiente paso es realizar un análisis más detallado de estos. En este capı́tulo se analizan los requerimientos de la aplicación mediante la identificación y descripción gráfica y textual de casos de uso. De esta forma obtendremos una descripción a alto nivel de las operaciones que debe realizar el sistema. Además, se abordan las necesidades de la gramática de interacción con el escenario, ası́ como la definición de formato de ficheros XML. 4.1. Casos de uso del sistema Cada caso de uso proporciona uno o más escenarios que indican cómo deberı́a interactuar el sistema con el usuario o con otro sistema para conseguir un objetivo especı́fico. 4.1.1. Identificación de los actores del sistema Usuario Se identifica con el usuario de la aplicación, que en este caso es el desarrollador de aplicaciones distribuidas que quiere desplegar e interaccionar con el servicio de distribución de datos. El usuario interactúa con el sistema para distribuir la descripción del escenario y controlar el ciclo de vida y actividad de las entidades DDS que componen el escenario. Nodo El rol de este actor se identifica con un nodo que participa en el sistema distribuido. Un actor del tipo Nodo interactúa con el Usuario, del que obtiene las acciones a realizar, y mantiene contacto con el actor DDS Middleware para desarrollar las tareas que le asigne el usuario. 27 4. Análisis de Requisitos Figura 4.1: Diagrama de casos de uso del sistema DDS XMLParser El rol de este actor se identifica con el software encargado de procesar los ficheros XML que describen el escenario. Como resultado de este procesamiento el DDS XMLParser devolverá el árbol que representa el escenario. DDS Middleware El rol de este actor se identifica con el software encargado de gestionar la funcionalidad relacionada con un servicio de distribución de datos. Conceptualmente, cada Nodo mantendrá contacto con el actor DDS Middleware para realizar las gestiones pertinentes. 4.1.2. Diagrama de casos de uso En la Figura 4.1 se muestra el diagrama de casos de uso del sistema. En este se expone, con un gran nivel de abstracción, la interacción entre los tres actores del sistema y en qué casos participa cada uno. 28 4.1. Casos de uso del sistema 4.1.3. Listado de los casos de uso A continuación se describen brevemente los casos de usos identificados en la Figura 4.1. Nótese que la descripción se hace a muy alto nivel. La descripción de estas operaciones se refinará en capı́tulos posteriores. Cargar escenario. Es un caso de uso base. El objetivo de este caso de uso es hacer llegar la descripción del escenario a todos los nodos que participan en la aplicación distribuida, y que estos seleccionen la aplicación que les corresponda. Este caso de uso se compone de los casos de uso distribuir escenario e interpretar escenario, descritos a continuación. Distribuir escenario. Este caso de uso está incluido en el caso anterior. Hace referencia a la distribución del escenario que el usuario quiere asignar a los nodos participantes. Interpretar escenario. Este caso de uso está incluido en el caso Cargar escenario. Representa las acciones que deben desarrollarse en cada nodo ante la recepción del escenario que se está distribuyendo. Tı́picamente un nodo que recibe la descripción de un escenario seleccionará una aplicación de entre las descritas en el escenario, dicha selección se hará en base a la información de asignación de aplicaciones a nodos que se etiquete en el fichero. Gestión entidades DDS. Caso de uso base. Abarca todas las operaciones relacionadas con la gestión de la creación y destrucción de las entidades DDS. En él participan todos los actores ya que las entidades se crean y destruyen ante peticiones del Usuario que cada Nodo interpreta. El Nodo se comunicará con el actor DDS para la realizar las operaciones de gestión pertinentes. Crear entidad DDS. Este caso de uso extiende al caso de uso Gestión entidades DDS. La operación consiste en la orden de creación de una entidad DDS dado el identificador de la entidad DDS XML que la envuelve. El Usuario proporciona un identificador de la entidad DDS XML que será utilizado por cada Nodo para buscar esa entidad dentro de la aplicación que tiene asignada. Los Nodos cuya aplicación contengan la entidad DDS XML buscada crearán la entidad DDS que se describe en la misma. Destruir entidad DDS. Este caso de uso extiende al caso de uso Gestión entidades DDS. El objetivo del caso es destruir las entidades DDS a partir de un identificador que proporciona el Usuario. La localización de la entidad se hace de manera similar al caso de uso Crear entidad DDS. La destrucción de una entidad implica el cese de su actividad. Gestión del comportamiento. Es un caso de uso base cuyo objetivo es el control del comportamiento que las entidades tienen en la red. 29 4. Análisis de Requisitos Iniciar comportamiento. Este caso de uso extiende al caso Gestión del comportamiento para controlar el inicio del comportamiento de las entidades. La localización de la entidad sobre la que aplicar la operación se realiza como en Crear entidad DDS. Cada Nodo deberá gestionar correctamente la ejecución paralela de tareas de cada entidad DDS que pertenezca a la aplicación que está desarrollando. Parar comportamiento. Este caso de uso extiende al caso Gestión del comportamiento para controlar el fin de la actividad de una entidad. El funcionamiento es el contrario a Iniciar comportamiento. 4.2. Gramática de interacción con el escenario Una de las partes esenciales del proyecto es la interacción que el desarrollador debe tener con el escenario. Como se comentó en la Sección 1.9, se ha optado por un método de interacción con el escenario basado un lenguaje semi-natural. Este lenguaje de interacción debe ser diseñado considerando los casos de uso presentados y las ideas aportadas en el Apartado 1.9. La gramática debe proporcionar mecanismos que hagan que el acceso al escenario DDS por parte del usuario sea lo más sencillo posible. Además de sencilla, debe de ser intuitiva, para que la curva de aprendizaje sea mı́nima. Es por ello que las palabras que se reconocerán estarán escritas en inglés y tratarán de coincidir con las palabras representativas de acciones similares en otros sistemas como “load” para indicar la carga de un fichero o “create” para indicar una acción de creación. Tras estas consideraciones, la gramática debe soportar las siguientes operaciones: Carga, distribución y asignación de aplicaciones. Esta operación deberá distribuir el fichero XML que describe el escenario. La participación en esta operación depende del actor: • La aplicación de interacción con el usuario deberá leer el fichero que se le proporciona y distribuirlo, mediante el uso de DDS, al resto de nodos de la red. Si es necesario, el fichero deberá ser dividido en fragmentos para su transmisión dadas las limitaciones de NDDS en este sentido[23]. • Los nodos de la red deberán leer, reconstruir y procesar la descripción del escenario para seleccionar una aplicación. Creación y destrucción de entidades DDS dado un identificador de una entidad. Creación y destrucción de todas las entidades DDS del escenario. En este caso es obvio que no se necesita identificador alguno. Inicio y parada de la actividad de entidades DDS dado un identificador de una entidad. 30 4.2. Gramática de interacción con el escenario Inicio y parada de la actividad de todas las entidades DDS del escenario. En este caso es obvio que no se necesita identificador alguno. Liberación de recursos y finalización de la ejecución. El sistema debe proveer de una manera de terminar todas las aplicaciones remotas. Las aplicaciones deberán liberar todos los recursos en uso antes de finalizar la ejecución. Aclarar que una instancia DDS sobre la que aplicar una orden queda identificada por el nombre del objeto DDS XML que la envuelve más un número que indica a qué instancia, de entre las descritas por el objeto DDS XML, se aplica la operación. 4.2.1. Definición de la gramática Una vez que descritas las operaciones que debe soportar la gramática estamos en disposición de especificarla para dar soporte a estas operaciones. La definición de la gramática se realizará mediante la notación BNF (Backus-Naur form) por ser la forma de especificación más conocida. El Listado 4.1 muestra esta gramática en BNF. <commands> ::= <commands> | <command> <command> ::= LOAD <string> | CREATE <xml_entity_id> <dds_instance_number> | DESTROY <xml_entity_id> <dds_instance_number> | START <xml_entity_id> <dds_instance_number> | STOP <xml_entity_id> <dds_instance_number> | CREATEALL | DESTROYALL | STARTALL | STOPALL | TERMINATE <xml_entity_id> ::= <string> <dds_instance_number> ::= [0-9]* <string> ::= [a-zA-Z\._ 0-9]* Listado 4.1: Gramática BNF definida para interacción con el escenario El siguiente paso es identificar cada tipo de orden o comando con cada una de las operaciones que debe soportar nuestra aplicación: <commands> Es el sı́mbolo inicial de la gramática. Cada lı́nea de texto escrita en el terminal de entrada a la aplicación se considerará como una nueva orden. <command> Aglutina al conjunto de órdenes que son reconocidas. Estas son: LOAD <string>: cargar y distribuir el escenario cuyo fichero se indica como parámetro. Los siguientes parámetros se aplican bajo la premisa de haber cargado un escenario. CREATE <xml_entity_id> <dds_instance_number>: crear la entidad con el primer parámetro como identificador y segundo parámetro como número de instancia DDS. 31 4. Análisis de Requisitos DESTROY <xml_entity_id> <dds_instance_number>: destruir la entidad con el primer parámetro como identificador y segundo parámetro como número de instancia DDS. START <xml_entity_id> <dds_instance_number>: iniciar el comportamiento de la entidad con identificador <xml entity id> y número de instancia DDS <dds_instance_number>. STOP <xml_entity_id> <dds_instance_number>: detener el comportamiento de la entidad con identificador <xml entity id> y número de instancia DDS <dds_instance_number>. CREATEALL: crear todas las entidades del escenario. DESTROYALL: destruir todas las entidades del escenario. STARTALL: iniciar el comportamiento de todas las entidades del escenario. STOPALL: detener el comportamiento de todas las entidades del escenario. TERMINATE: destruye todas las entidades, libera recursos y finaliza la ejecución en todos los nodos del escenario. 4.2.2. Estructura de datos de órdenes Para poder transmitir datos en DDS, estos deben definirse previamente mediante el formato IDL[30]. Como se ha mencionado, las órdenes se transfieren a todos los nodos participantes utilizando un tema de control creado para el middleware NDDS, ası́ que debemos definir el tipo de datos asociado al tema de control. El Listado 4.2 presenta el fichero IDL correspondiente al tema de control. // Valores maximos para los tipos de datos de tamanno variable const unsigned long CMD_ENTITY_NAME_SIZE_MAX = 256; const unsigned long CMD_DATA_NAME_SIZE_MAX = 256; const unsigned long CMD_DATA_MAX_SIZE = 1024; //@top-level false enum CommandKind{ CMD_NOCOMMAND, CMD_START, CMD_START_ALL, CMD_STOP, CMD_STOP_ALL, CMD_CREATE_ENTITIES, CMD_CREATE_ENTITIES_ALL, CMD_DESTROY_ENTITIES, CMD_DESTROY_ENTITIES_ALL, CMD_LOAD_SCENARIO, CMD_TERMINATE, CMD_EXIT }; 32 4.3. Lenguaje de descripción de aplicaciones struct Command { // Tipo de orden que contiene la instancia de // datos transferida CommandKind command; // ID de la entidad XML e ID de la instancia DDS a // la que aplicar la orden string <CMD_ENTITY_NAME_SIZE_MAX> entity_name; short instance_id; // Variables para la transferencia de datos auxiliares // como el contenido de un fichero XML string <CMD_DATA_NAME_SIZE_MAX>data_id; string <CMD_DATA_MAX_SIZE> data; }; Listado 4.2: Fichero IDL correspondiente al tema de control 4.3. Lenguaje de descripción de aplicaciones El lenguaje de descripción de escenarios será un lenguaje basado en XML, tal y como se indicó en el Apartado de Factores Dato, y lo describiremos mediante un documento DTD. En esta sección analizaremos la información necesaria que deben manejar los ficheros XML y que debe quedar reflejada en el DTD, junto con las restricciones en las relaciones entre entidades DDS. Comenzaremos introduciendo los atributos comunes a los elementos XML que definiremos más adelante: name: es el nombre o identificador del elemento XML. base name: es el nombre de la clase base para un elemento XML. Esto es, la clase de la que este objeto hereda. Los atributos y etiquetas de la clase base se utilizarán en la clase que hereda de ella, aunque podrán sobreescribirse. Los siguientes elementos podrán estar presentes en todas las entidades: listener: identifica a un listener del Modelo Dinámico que se utilizará con la entidad. behaviour: dentifica a un método del Modelo Dinámico que define el comportamiento de la entidad. instances: número máximo de instancias DDS que se pueden crear para el objeto XML definido. 33 4. Análisis de Requisitos El elemento raı́z del escenario será dds. Este estará compuesto por una o varias aplicaciones DDS tal y como se muestra en el Listado 4.3. A su vez, estas aplicaciones estarán compuestas por uno o varios participantes de dominio. En el mismo listado también se muestran los elementos comunes enumerados antes. <!-- dds --> <!ELEMENT dds (application)*> <!-- Scenario description: an application --> <!-- Application (contains DDS Entities) --> <!ELEMENT application (participant+)> <!ATTLIST application name CDATA #IMPLIED> <!ATTLIST application base_name CDATA #IMPLIED> <!ELEMENT listener (#PCDATA)> <!ELEMENT behaviour (#PCDATA)> <!-- Number of instances which are going to be created of an entity. This is not mandatory so the default value if not present is 1 --> <!ELEMENT instances (#PCDATA)> Listado 4.3: Descripción de una aplicación El Listado 4.4 muestra cómo un participante de dominio está compuesto de varias entidades hijas que pueden ser temas, publicadores o subscriptores. <!-- participant --> <!ELEMENT participant (domain_id, participant_entities, listener?, behaviour?, instances?)> <!ATTLIST participant name CDATA #IMPLIED> <!ATTLIST participant base_name CDATA #IMPLIED> <!ELEMENT domain_id (#PCDATA)> <!ELEMENT participant_entities (topic|publisher|subscriber)* > Listado 4.4: Descripción de un participante de dominio (Domain Participant) El Listado 4.5 ilustra la estructura de un tema. No se ha considerado que un tema pueda tener varias instancias puesto que no tiene sentido que haya más de un tema por parti34 4.3. Lenguaje de descripción de aplicaciones cipante de dominio[44]. Además de los datos comunes a todas las entidades, la descripción de un tema incluye: topic name: el nombre del tema. type: el tipo de datos asociado al tema. <!-- topic --> <!ELEMENT topic (topic_name?, type?, listener?, behaviour?)> <!ATTLIST topic name CDATA #IMPLIED> <!ATTLIST topic base_name CDATA #IMPLIED> <!ELEMENT topic_name (#PCDATA)> <!ELEMENT type (#PCDATA)> Listado 4.5: Descripción de un tema (Topic) El Listado 4.6 muestra, además de los elementos comunes a otras entidades, cómo un publicador estará compuesto de varias entidades hijas escritoras. El mismo listado incluye la definición de un escritor o DataWriter. Destacar que el elemento datawriter topic correspondará a un tema previamente definido. Este tema será el que el DataWriter utilice para publicar datos. El Listado 4.7 es el equivalente al Listado 4.6, pero aplicado a los subscriptores y los lectores de datos. <!-- publisher --> <!ELEMENT publisher (datawriter*, listener?, behaviour?, instances?)> <!ATTLIST publisher name CDATA #IMPLIED> <!ATTLIST publisher base_name CDATA #IMPLIED> <!-- writer --> <!ELEMENT datawriter ( datawriter_topic, listener?, behaviour?, instances?)> <!ATTLIST datawriter name CDATA #IMPLIED> <!ATTLIST datawriter base_name CDATA #IMPLIED> 35 4. Análisis de Requisitos <!ELEMENT datawriter_topic (#PCDATA)> Listado 4.6: Descripción de un publicador (Publisher) <!-- subscriber --> <!ELEMENT subscriber (datareader*, listener?, behaviour?, instances?)> <!ATTLIST subscriber name CDATA #IMPLIED> <!ATTLIST subscriber base_name CDATA #IMPLIED> <!-- reader --> <!ELEMENT datareader (datareader_topic?, listener?, behaviour?, instances?)> <!ATTLIST datareader name CDATA #IMPLIED> <!ATTLIST datareader base_name CDATA #IMPLIED> <!ELEMENT datareader_topic (#PCDATA)> Listado 4.7: Descripción de un subscriptor (Subscriber) 36 CAPÍTULO 5 DISEÑO Tras la fase de análisis, en la que se identifica qué se quiere hacer, el siguiente paso es cómo se debe hacer. Durante este capı́tulo se proporcionan los detalles más relevantes del diseño de nuestro sistema. 5.1. Arquitectura del sistema El propósito de esta sección es describir, desde un punto de vista de alto nivel, la solución al problema que este proyecto propone. Esta sección de arquitectura del sistema constituye la parte central del diseño propuesto, y la más importante. En ella se apoya todo el desarrollo realizado. 5.1.1. ¿Cómo describir un escenario DDS? El primer reto es encontrar la manera de describir un escenario DDS. Si consideramos que un escenario DDS es una gran aplicación distribuida que a su vez se compone de varias aplicaciones, se puede considerar como un primer nivel de descripción a la división del escenario en aplicaciones DDS. Estas aplicaciones DDS podrán ejecutarse en uno o muchos nodos, y a su vez, en un nodo podrán ejecutarse una o varias aplicaciones DDS distintas. Una aplicación DDS estará compuesta por un conjunto de entidades DDS de las identificadas en la Figura A.4 (Apéndice A), estas son: participante de dominio o participante (Domain Participant o Participant), tema (Topic), publicador (Publisher), subscriptor (Subscriber), escritor (DataWriter) y lector (DataReader). Las entidades se crean mediante llamadas al API de DDS ofrecida por el middleware. 37 5. Diseño En esta API, salvo algunos parámetros de calidad de servicio, los parámetros son estáticos, es decir, una vez que se crea una entidad con unos parámetros estos no pueden modificarse a no ser que la entidad se destruya y se cree de nuevo. La configuración y creación de entidades DDS constituye la preparación de la infraestructura de comunicación entre aplicaciones que se va a utilizar. Por otro lado, las entidades presentan métodos para realizar acciones en el sistema. Los más utilizados son los métodos para escribir datos en la red, utilizando un DataWriter, y los métodos para leer datos de la red mediante un DataReader. El uso de estos métodos, es decir, los datos que se escriben y se leen, representan la actividad del sistema distribuido y constituyen el punto de conexión entre el middleware DDS y el sistema que se distribuye en si. Por ejemplo, un publicador de información de sensores de temperatura comprobará los sensores de la plataforma en la que se ejecuta y utilizará los métodos de publicación para enviar los datos que recogen de los sensores. Esta división funcional nos lleva a identificar dos modelos necesarios para la descripción de una aplicación DDS: el Modelo Estático y el Modelo Dinámico. El Modelo Estático se corresponde con la especificación de todas las entidades DDS que servirán de soporte a la comunicación entre las aplicaciones distribuidas. El Modelo Dinámico define cómo se comporta cada una de las entidades DDS del escenario. Nuestra propuesta es describir las aplicaciones DDS mediante sus modelos estático y dinámico. Ası́, el escenario DDS global lo constituirán un conjunto de aplicaciones descritas con estos dos modelos. La Figura 5.1 presenta un escenario DDS compuesto de un conjunto de aplicaciones DDS. Como se puede observar, cada aplicación puede especificarse con los dos modelos propuestos. A continuación se describirán las responsabilidades que se asocian a cada modelo dentro del desarrollo global del escenario. El Modelo Estático El Modelo Estático de una aplicación tiene como objetivo describir la arquitectura de comunicación DDS que utilizará la aplicación distribuida. Esta descripción se hará mediante un fichero XML que especificará los parámetros necesarios de las entidades pertenecientes a la aplicación. Se definirá, pues, un lenguaje de descripción de aplicaciones basado en XML. Esto incluye la definición del tipo de documento (DTD) y la creación de un analizador sintáctico que extraiga información del fichero XML para construir el Modelo Estático de la aplicación. En términos de estructuras de datos, el Modelo Estático de la aplicación es una estructura jerárquica en forma de árbol en la que el nodo raı́z es una aplicación DDS. De esta aplicación parten los nodos que representan a las entidades DDS que componen la apli38 5.1. Arquitectura del sistema Figura 5.1: Descripción de aplicaciones DDS mediante los modelos Estático y Dinámico 39 5. Diseño cación. La estructura jerárquica del árbol, definida en el DTD, respeta las relaciones entre entidades definidas en el estándar de DDS[6] (ver Apéndice A). El Modelo Estático se compone de una serie de clases que van a envolver a las entidades DDS. El procesamiento de un fichero XML que describa una aplicación dará lugar a la creación de un árbol cuyos objetos van a ser instancias estas clases. Estas clases reciben el nombre de Entidades DDS XML y existirá una por cada entidad DDS: DDS XMLDomainParticipant para el participante de dominio, DDS XMLPublisher para el publicador, etc. La Figura 5.2 muestra un ejemplo de un árbol que representa una aplicación DDS. Figura 5.2: Árbol del el Modelo Estático para una aplicación DDS Como puede observarse en la Figura 5.2, el Modelo Estático presenta una interfaz de navegación por esta estructura en árbol que facilita el recorrido del mismo y el acceso a la información contenida. Por ejemplo, la clase DDS XMLDataReader tendrá un método llamado get xml subscriber() que permite obtener el nodo del tipo DDS XMLSubscriber del que cuelga. Cada entidad DDS XML es capaz de controlar tanto el ciclo de vida (crear y destruir una entidad) y como el comportamiento de un tipo de entidad DDS (iniciar o detener las acciones que realiza la entidad). Para ello, gestiona información diversa que agrupamos de la siguiente manera: Datos de configuración para la creación de la entidad DDS (identificador de dominio, nombre del tema. . . ). Parámetros de conexión de la entidad con el Modelo Dinámico correspondiente. 40 5.1. Arquitectura del sistema Otros datos, como los relacionados con la gestión de hebras en la ejecución concurrente de tareas. El Modelo Dinámico El Modelo Dinámico de una aplicación DDS describe el comportamiento que tendrán las entidades que forman la aplicación. El comportamiento se define como la actividad que realiza una entidad. Esto abarca no sólo a la ejecución de tareas programadas sino también la reacción de la entidad a eventos que se produzcan en el sistema. En el caso de la programación de tareas de una entidad, la especificación puede hacerse programando un método que podrá ser utilizado por una o varias entidades. En el caso de la reacción ante eventos se hará utilizando la interfaz de DDS para configurar qué eventos atiende un listener y cómo los gestiona. Un evento puede ser, por ejemplo, la llegada de datos a una cola de recepción o la pérdida de muestras de datos entre los recibidos. El sistema dispondrá de un Modelo Dinámico global que almacene todos los modelos dinámicos que se quieran utilizar. El conjunto de modelos dinámicos definidos formará una tabla sobre la que se podrán realizar búsquedas y obtener elementos que asociar a las Entidades DDS XML para su posterior uso. Mediante esta asociación el Modelo Estático y el Modelo Dinámico quedan conectados. 5.1.2. La interacción y coordinación del escenario Presentadas las cuestiones relativas a la descripción del escenario, esta sección presenta cómo abordar la coordinación entre las aplicaciones que componen el escenario, ası́ como la interfaz de interacción que el desarrollador tendrá con él. Dicho problema puede ser dividido en dos subproblemas: La distribución de órdenes o comandos a todos los nodos para indicar qué acciones realizar. Para ello se propone delegar esta tarea en el propio middleware DDS. De esta forma se define un tema de control sobre el cual se publicarán datos para la coordinación del escenario. Todos los nodos participantes se subscribirán a este tema de control de forma que recibirán las órdenes publicadas. La interpretación y desarrollo de estas órdenes, que se realizará mediante los nodos Command Slave explicados más adelante. Para desplegar la infraestructura de coordinación necesaria, los nodos de la red participantes en el futuro escenario DDS lo harán con dos roles bien definidos. El papel de “Command Master” se encarga de publicar órdenes utilizando el tema de control. El resto de nodos participarán como “Command Slaves” y estarán subscritos al tema de control. Como puede deducirse, sólo puede haber un “Command Master” para un escenario. 41 5. Diseño Figura 5.3: Coordinación del escenario distribuidos utilizando DDS La aplicación que actúe como Command Master tiene dos funciones: interpretar órdenes del usuario y distribuirlas. Para implementar la primera, se propone la creación de una gramática de lenguaje semi-natural que permita al usuario interaccionar con el sistema. Respecto a la distribución de órdenes, se delegará esta función en el propio DDS. El rol de Command Slave implica la subscripción al tema de control para recibir órdenes de la red. El nodo deberá interpretar estas órdenes para desarrollar la parte del escenario que le corresponda. Para ello utilizará la funcionalidad ofrecida por Modelos Estáticos y Dinámicos. La Figura 5.3 ilustra los dos tipos de roles de los nodos participantes en el escenario. En la figura se introducen dos aplicaciones que deben ser lanzadas en los nodos correspondientes: cmdmaster, que se ejecutará en el nodo que juega el papel de Command Master. cmdslave, que se ejecutará en los nodos que actúan como Command Slaves. 5.1.3. Funcionalidades para mejorar la flexibilidad del sistema Para finalizar este capı́tulo se introducen algunas ideas de diseño que mejoran la flexibilidad y potencia descriptiva del sistema. 42 5.1. Arquitectura del sistema Distribución del escenario y asignación automática de aplicaciones a nodos La distribución del fichero XML que describe un escenario se hará utilizando también DDS para la transferencia. De esta forma se evitan dependencias de mecanismo externos, tal y como ocurre con algunas alternativas estudiadas en la Sección 1.8. Por otro lado, la asignación de aplicaciones DDS a nodos se realiza de forma automática. Cuando un nodo recibe un fichero XML que contiene la lista de aplicaciones de un escenario selecciona una de ellas para desarrollarla. Sobre esta aplicará, a partir de entonces, los órdenes recibidas. La asignación se especifica incluyendo una lista de atributos en las etiquetas XML que representan una aplicación. Estos atributos forman una lista de direcciones IP y nombres de máquina. Cuando un nodo recibe el fichero XML, comprueba si su nombre o dirección IP está en la lista de cada aplicación y ası́ selecciona la aplicación adecuada. Creación de varias instancias, recursividad y herencia Una manera de aumentar la capacidad expresiva del Modelo Estático, y en consecuencia de las acciones que se pueden ejecutar con la interfaz que ofrece, es el soporte para: La especificación de un número máximo de instancias DDS que se pueden crear a partir de un objeto DDS XML. Esto significa que se podrán especificar descripciones del tipo “crear 5 DataWriter como ’writer a’ en la aplicación ’a”’. Este número se especificará como una etiqueta más en el fichero XML. La aplicación recursiva de acciones en las entidades. Esto es, incluir un parámetro que permita especificar si una acción se aplica sobre una sola entidad o también sobre todos sus descendientes en el árbol. Herencia entre objetos DDS XML. A partir de un objeto DDS XML se podrán definir otros objetos como él, que heredarán sus atributos. De esta forma se consigue minimizar el código necesario para describir aplicaciones al permitir la reutilización de componentes anteriormente descritos.. La Figura 5.4 a modo de ejemplo ilustra de manera conjunta los conceptos de instancias y recursividad. Siguiendo la Figura 5.4, se presenta el siguiente subárbol dentro de una aplicación. Aparecen las siguientes entidades DDS XML: un DomainParticipant que tiene un Subscriber que a su vez tiene 2 DataReaders, cada uno de estos con un número diferente de instancias. El DDS XMLDataReader “string reader” podrá crear hasta 3 instancias DDS y el denominado como “octet reader” podrá crear hasta 2 instancias DDS. Este número se habrá fijado en la descripción de cada entidad en el fichero XML. Para crear las entidades DDS contenidas en el subárbol caben dos opciones: 43 5. Diseño Figura 5.4: Ejemplo explicativo del funcionamiento de las instancias y parámetros de recursividad 44 5.2. Modelo de interacción de objetos a) Explı́citamente, crear las entidades una por una realizando 3 operaciones como se muestra en la Figura 5.4, a). Al final de este proceso se habrán creado tres entidades DDS: un DomainParticipant, un Subscriber y un DataReader (indicado con el ı́ndice “1” y resaltado en la figura). b) Crear las entidades de manera implı́cita utilizando la opción de recursividad. En este caso sólo serı́a necesario ejecutar la acción sobre el primer objeto DDS XMLDomainParticipant. Gracias al parámetro para aplicar la operación recursivamente, todos los objetos DDS XML hijos ejecutarán la misma acción. Como muestra la Figura 5.4, b), al final del proceso se habrán creado siete entidades DDS: un DomainParticipant, un Subscriber y 5 DataReaders (3 del tipo “string reader” y 2 del tipo “octet reader”). Como puede comprobarse, de esta forma se puede interaccionar con el escenario de manera flexible. Granularidad de las operaciones Por último, el diseño de las operaciones a todos los niveles debe hacerse con la granularidad más fina posible. Cuanta más fina sea la granularidad mayor flexibilidad se permitirá en la interacción con el escenario. Para conseguir esto, el proceso de creación y destrucción de las entidades se separará de la activación y parada de la actividad de estas. Además, utilizando el concepto de instancias antes presentado se permitirá seleccionar con precisión entidades DDS concretas del árbol. 5.2. Modelo de interacción de objetos Para explicar el funcionamiento y operaciones del sistema, se opta por una descripción formal basada en diagramas de secuencia. Un diagrama de secuencia es una forma de diagrama de interacción que muestra los objetos como lı́neas de vida a lo largo de la página y con sus interacciones en el tiempo. Las interacciones se represetentan como mensajes dibujados como flechas desde la lı́nea de vida origen hasta la lı́nea de vida destino. Con esta notación, se pretende mostrar qué objetos se comunican con qué otros objetos. Esta representación sigue siendo una representación de alto nivel ya que no se considera la ubicación de cada objeto en el sistema distribuido, puesto que a este nivel no es relevante. Tampoco se consideran las operaciones que no implican la comunicación entre objetos, y que, por tanto, carecen de interés en esta sección. Por último, aclarar que no se mostrarán todos los diagramas de secuencia posibles, 45 5. Diseño sino los más representativos, ya que el flujo de muchas acciones es prácticamente idéntico. Ası́, la lista de diagramas de secuencia considerados como representativos es: Operación cargar escenario. Operación crear entidad DDS. Esta operación es equivalente a destruir entidad DDS. Se representará la secuencia crear entidad DDS cuando la entidad es un DomainParticipant DDS. Las simplificaciones de esta operación que no repetiremos son: • crear o destruir una entidad DDS cuando la entidad es un Topic DDS • crear o destruir una entidad DDS cuando la entidad es un Publisher DDS • crear o destruir una entidad DDS cuando la entidad es un Subscriber DDS • crear o destruir una entidad DDS cuando la entidad es un DataWriter DDS • crear o destruir una entidad DDS cuando la entidad es un DataReader DDS Operación iniciar comportamiento. Esta operación es equivalente a parar comportamiento. Se representará la secuencia iniciar comportamiento cuando la entidad es un DomainParticipant DDS. Las simplificaciones de esta operación que no repetiremos son: • iniciar o parar una entidad DDS cuando la entidad es un Topic DDS • iniciar o parar una entidad DDS cuando la entidad es un Publisher DDS • iniciar o parar una entidad DDS cuando la entidad es un Subscriber DDS • iniciar o parar una entidad DDS cuando la entidad es un DataWriter DDS • iniciar o parar una entidad DDS cuando la entidad es un DataReader DDS 5.2.1. Acción cargar escenario La Figura 5.5 muestra el diagrama de secuencia de la acción cargar escenario. Esta operación es la responsable de leer un fichero XML proporcionado por el usuario y distribuirlo a los nodos del escenario que lo utilizarán para desarrollar sus aplicaciones DDS. Como resultado de estas acciones, cada nodo seleccionará automáticamente una aplicación DDS descrita en el fichero. Se identifican las siguientes operaciones relevantes: readfile: leer un fichero XML proporcionado por el usuario. loadScenario: se produce en dos objetos: En CommandPublisher se refiere al la publicación de una orden “cargar escenario” que contiene el fichero XML. 46 5.2. Modelo de interacción de objetos En CommandSubscriber se refiere a la recepción del fichero del escenario. Esto incluye la reconstrucción del fichero, que puede haberse recibido en distintos trozos. parseScenario: es el proceso de análisis del fichero del escenario, llevado a cabo por el parser, que aquı́ consideramos el actor DDS XMLParser (ver Sección 4.1.1). El resultado de esta operación es un árbol que contiene la representación en memoria del escenario compuesta de entidades DDS XML. createApplicacions: DDS XMLParser creará un conjunto de aplicaciones DDS XML que cada CommandSubscriber (un nodo en la prueba) podrá seleccionar. lookupAndSelectApplication: sobre el árbol compuesto de DDS XMLApplications generado por DDS XMLParser se debe seleccionar una aplicación. Figura 5.5: Diagrama de secuencia cargar escenario 5.2.2. Acción crear entidad DDS La acción crear entidad DDS es compleja debido a la cantidad de objetos de distinto tipo que intervienen. Además, se debe dar soporte tanto para la aplicación recursiva de las operaciones como para la existencia de múltiples instancias DDS, tal y como se explicó en 47 5. Diseño la Sección 5.1.3. Las siguientes figuras describen un único diagrama de secuencia que se ha dividido en varias figuras para poder mostrarlo correctamente. La Figura 5.6 muestra el inicio de la acción desde CommandPublisher. La secuencia continúa en la Figura 5.7. Las operaciones identificadas en esta secuencia son: createDDSEntity: esta operación tiene como objetivo la creación de una o varias entidades DDS. Se propaga y efectúa en tres objetos: CommandPublisher: inicia la acción crear entidad DDS con los siguientes atributos que se propagarán entre el resto de objetos: • id: identificador de la entidad DDS XML a la que se hará llegar la operación en última instancia. • index: ı́ndice de la instancia DDS dentro de la entidad DDS XML a la que se aplicará la operación. • recursive: parámetro lógico para controlar si la operación se aplicará sólo a la instancia afectada o si también se aplicará a las instancias hijas de ésta en el árbol de entidades. CommandSubscriber: recibe el mensaje createDDSEntity y a su vez se lo envı́a a la DDS XMLApplication que tiene asociada. La DDS XMLApplication asociada al objeto CommandSubscriber. lookupEntity: la aplicación buscará entre el conjunto de entidades DDS XML que la componen para ver si contiene a la entidad identificada por id. Si no es ası́, la operación termina aquı́. La Figura 5.7 continúa la secuencia de la Figura 5.6 para el caso en que la entidad encontrada en la operación lookupEntity sea una entidad del tipo DDS XMLDomainParticipant. Se ha elegido este ejemplo por ser el caso más complejo posible, ya que DDS XMLDomainParticipant es la entidad que puede estar compuesta de más entidades a su vez. El diagrama de secuencia para otras entidades DDS XML será siempre una simplificación del explicado aquı́. En el diagrama de secuencia crear entidad DDS concerniente al objeto DDS XMLDomainParticipant (Figura 5.7) se identifican las siguientes operaciones: createDDSEntity: sobre el objeto DDS XMLDomainParticipant provoca la creación de un DomainParticipant DDS con los parámetros de configuración de la entidad DDS XML sobre la que se está aplicando la operación. Esta operación puede propagarse a las entidades hijas del DDS XMLDomainParticipant. createDDSEntityChilds: es una operación condicionada a que el parámetro “recursive” esté activado para propagar la operación createDDSEntity a las entidades hijas de la actual. 48 5.2. Modelo de interacción de objetos Figura 5.6: Diagrama de secuencia crear entidad DDS, parte genérica. Continúa en Figura 5.7 getChildsTopic: obtiene los DDS XMLTopic hijos del DDS XMLDomainParticipant. Sobre cada hijo obtenido se propagará la acción createDDSEntity. getChildsPublisher: obtiene los DDS XMLPublisher hijos del DDS XMLDomainParticipant. Sobre cada hijo obtenido se propagará la acción createDDSEntity. getChildsSubscriber: obtiene los DDS XMLSubscriber hijos del DDS XMLDomainParticipant. Sobre cada hijo obtenido se propagará la acción createDDSEntity. createDDSDomainParticipant: es la operación que realiza el middleware DDS para crear un DomainParticipant DDS. createDDSTopic: es la operación que realiza el middleware DDS para crear un Topic DDS. createDDSPublisher: es la operación que realiza el middleware DDS para crear un Publisher DDS. createDDSSubscriber: es la operación que realiza el middleware DDS para crear un Subscriber DDS. La Figura 5.8 representa la encadenación de operaciones a las entidades hijas de un objeto DDS XMLPublisher. En ella se identifican las operaciones no descritas anterioremente: createDDSEntityChilds: si el parámetro “recursive” está activo, la operación createDDSEntity se propaga a las entidades hijas. getChildsDataWriter: obtiene los DDS XMLDataWriter hijos del DDS XMLPublisher. Sobre cada hijo obtenido se propagará la acción createDDSEntity. 49 5. Diseño Figura 5.7: Diagrama de secuencia crear entidad DDS, DDS XMLDomainParticipant. Continúa en Figuras 5.8 y 5.9 50 detalle respecto a 5.2. Modelo de interacción de objetos createDDSDataWriter: es la operación que realiza el middleware DDS para crear un DataWriter DDS. La Figura 5.9 es análoga a la Figura 5.8 y representa la encadenación de operaciones a las entidades hijas de un objeto DDS XMLSubscriber. En ella se identifican las operaciones no descritas anterioremente: createDDSEntityChilds: es una operación condicionada a que el parámetro “recursive” esté activado para propagar la operación createDDSEntity a las entidades hijas de la actual. getChildsDataReader: obtiene los DDS XMLDataReader hijos del DDS XMLSubscriber. Sobre cada hijo obtenido se propagará la acción createDDSEntity. createDDSDataReader: es la operación que realiza el middleware DDS para crear un DataReader DDS. 5.2.3. Acción iniciar comportamiento La acción iniciar comportamiento es similar a crear comportamiento y por ello compleja. Las siguientes figuras describen un único diagrama de secuencia que se ha dividido en varias figuras para poder mostrarlo correctamente. La Figura 5.10 muestra el inicio de la acción desde CommandPublisher. La secuencia continúa en la Figura 5.11. Las operaciones identificadas en esta secuencia son: startBehaviour: esta operación tiene como objetivo iniciar la actividad de una o varias entidades DDS. Se propaga y efectúa en tres objetos: CommandPublisher: inicia la acción iniciar comportamiento con los siguientes atributos que se propagarán entre el resto de objetos: • id: identificador de la entidad DDS XML a la que se hará llegar la operación en última instancia. • index: ı́ndice de la instancia DDS dentro de la entidad DDS XML a la que se aplicará la operación. • recursive: parámetro lógico para controlar si la operación se aplicará sólo a la instancia afectada o si también se aplicará a las instancias hijas de ésta en el árbol de entidades. CommandSubscriber: recibe el mensaje startBehaviour y a su vez se lo envı́a a la DDS XMLApplication que tiene asociada. La DDS XMLApplication asociada al objeto CommandSubscriber. 51 5. Diseño secuencia crear entidad DDS, detalle respecto a Figura 5.9: Diagrama de secuencia DDS XMLDomainSubscriber. crear entidad DDS, detalle respecto a Figura 5.8: Diagrama de DDS XMLDomainPublisher. 52 5.2. Modelo de interacción de objetos Figura 5.10: Diagrama de secuencia iniciar comportamiento, parte genérica. Continúa en Figura 5.11 lookupEntity: la aplicación buscará entre el conjunto de entidades DDS XML que la componen para ver si contiene a la entidad identificada por id. Si no es ası́, la operación termina aquı́. La Figura 5.11 continúa la secuencia de la Figura 5.10 para el caso en que la entidad encontrada en la operación lookupEntity sea una entidad del tipo DDS XMLDomainParticipant. Se ha elegido este ejemplo por las mismas razones que en la acción crear entidad DDS. En el diagrama de secuencia iniciar comportamiento concerniente al objeto DDS XMLDomainParticipant (Figura 5.11) se identifican las siguientes operaciones: startBehaviour: sobre el objeto DDS XMLDomainParticipant provoca el una serie de acciones para ejecutar la actividad de este. Esta operación puede propagarse a las entidades hijas del DDS XMLDomainParticipant. lookupMethod: sobre el conjunto de modelos dinámicos del sistema, se busca el método que especifica el comportamiento y es asocia a la entidad DDS XML. Este método corresponde al especificado previamente en el fichero XML. startBehaviourMethod: una vez obtenido un método válido, se inicia el comportamiento en si de la entidad DDS adecuada, indicada con el parámetro index. Se debe permitir la ejecución concurrente de la actividad de las entidades, de modo que la ejecución del comportamiento debe lanzarse en una hebra nueva. startBehaviourChilds: es una operación condicionada a que el parámetro “recursive” esté activado para propagar la operación startBehaviour a las entidades hijas de la actual. 53 5. Diseño getChildsTopic: obtiene los DDS XMLTopic hijos del DDS XMLDomainParticipant. Sobre cada hijo obtenido se propagará la acción startBehaviour. getChildsPublisher: obtiene los DDS XMLPublisher hijos del DDS XMLDomainParticipant. Sobre cada hijo obtenido se propagará la acción startBehaviour. getChildsSubscriber: obtiene los DDS XMLSubscriber hijos del DDS XMLDomainParticipant. Sobre cada hijo obtenido se propagará la acción startBehaviour. La Figura 5.12 representa la encadenación de operaciones a las entidades hijas de un objeto DDS XMLPublisher. En ella se identifican las operaciones no descritas anterioremente: startBehaviourChilds: si el parámetro “recursive” está activo, la operación startBehaviour se propaga a las entidades hijas. getChildsDataWriter: obtiene los DDS XMLDataWriter hijos del DDS XMLPublisher. Sobre cada hijo obtenido se propagará la acción startBehaviour. La Figura 5.13 es análoga a la Figura 5.12 y representa la encadenación de operaciones a las entidades hijas de un objeto DDS XMLSubscriber. En ella se identifican las operaciones no descritas anterioremente: startBehaviourChilds: es una operación condicionada a que el parámetro “recursive” esté activado para propagar la operación startBehaviour a las entidades hijas de la actual. getChildsDataReader: obtiene los DDS XMLDataReader hijos del DDS XMLSubscriber. Sobre cada hijo obtenido se propagará la acción startBehaviour. 54 5.2. Modelo de interacción de objetos Figura 5.11: Diagrama de secuencia iniciar comportamiento, detalle respecto a DDS XMLDomainParticipant. Continúa en Figuras 5.12 y 5.13 55 5. Diseño Figura 5.12: Diagrama de secuencia iniciar comportamiento, detalle respecto a DDS XMLDomainPublisher. 56 5.2. Modelo de interacción de objetos Figura 5.13: Diagrama de secuencia iniciar comportamiento, detalle respecto a DDS XMLDomainSubscriber. 57 5. Diseño 5.3. Diagrama de clases Esta sección presenta el diagrama de clases del sistema. La representación se ha dividido en una vista general de las clases (Figura 5.14) por un lado y, por otro, la representación de cada clase por separado para poder mostrar sus detalles. Figura 5.14: Vista general del diagrama de clases El diagrama de clases general muestra las relaciones entre las clases del tipo DDS XML. Cada una de estas clases equivale a su correspondiente clase DDS. Este diagrama respeta las relaciones conceptuales de las clases tal y como se especifica en el estándar DDS[6]. Como puede verse en la Figura 5.14, queda claro cómo una aplicación DDS, representada por DDS XMLApplication, está compuesta de un conjunto de entidades DDS, representadas por clases del tipo DDS XMLEntity. Otra relación que cabe destacar es la asociación de una DDS XMLApplication a un CommandSubscriber. Como se introducı́a en capı́tulos anteriores, cada nodo que ejecuta un 58 5.3. Diagrama de clases CommandSubscriber selecciona una sola aplicación DDS para desarrollar el escenario. La relacción de la clase CommandSubscriber con un único CommandPublisher también queda reflejada. Figura 5.15: Detalle del diagrama de clases: DDS XMLApplication Figura 5.16: Detalle del diagrama de clases: DDS XMLParticipant 59 5. Diseño Figura 5.17: Detalle del diagrama de clases: DDS XMLPublisher Figura 5.18: Detalle del diagrama de clases: DDS XMLSubscriber Figura 5.19: Detalle del diagrama de clases: DDS XMLTopic 60 5.3. Diagrama de clases Figura 5.20: Detalle del diagrama de clases: DDS XMLDataWriter Figura 5.21: Detalle del diagrama de clases: DDS XMLDataReader 61 5. Diseño Figura 5.22: Detalle del diagrama de clases: CommandPublisher Figura 5.23: Detalle del diagrama de clases: CommandSubscriber 62 CAPÍTULO 6 IMPLEMENTACIÓN En este capı́tulo se describen algunos detalles de la implementación que es interesante remarcar. En particular se hace hincapié en: Cómo se ha implementado un modelo de orientación a objetos con el lenguaje C. La implementación del analizador del lenguaje de interacción con el escenario. Los módulos que componen el sistema. 6.1. Implementación de la orientación a objetos en C En esta sección se explica la metodologı́a y reglas de codificación que han permitido utilizar este paradigma de programación con un lenguaje no orientado a objetos. La lectura de este apartado permitirá poder interpretar el código fuente de una forma más clara. Hasta ahora se han utilizado constantemente tanto conceptos de orientación a objetos como notación y diagramas relacionados con la orientación objetos. Esto ha sido ası́ por varias razones: Pensando en el futuro del proyecto, la posible integración de este proyecto dentro de un middleware DDS incluirá que se porte el código actual a lenguajes como C++ o Java. Normalmente estos productos presentan un interfaz de programación que admite varios lenguajes, estando escrita la base casi siempre en C. Ası́ pues, la existencia de diagramas de clases, diagramas de secuencia y demás ayudarán a esta tarea. 63 6. Implementación Las técnicas de desarrollo de software modernas como el proceso unificado de desarrollo[45] están pensadas para trabajar con lenguajes orientados a objetos. Las metodologı́as de orientación a objetos ayudan a estructurar el código de manera funcional, algo esencial conforme la complejidad del problema aumenta. A continuación se describe cómo se organiza el código en C para poder aplicar conceptos de la orientación a objetos: Representación de clases. Cada clase del diagrama de clases se corresponde con una estructura de datos en C. Ası́, tendremos una estructura con una serie de campos que representarán los atributos de la clase. Por ejemplo: DomainParticipant Espacio de nombres. Para evitar conflictos en la definición de estructuras y métodos, se antepone al nombre de cada uno lo que se conoce como “espacio de nombres”. Esto es un prefijo que se añade al nombre de la estructura o método para indicar a qué biblioteca o módulo pertenece. Por ejemplo el prefijo “DDS” indica que lo que sigue a continuación pertenece a la biblioteca que ofrece el API del estándar DDS. En este proyecto, se añade el prefijo “DDS XML” para indicar las clases XML que envuelven a entidades DDS. El nombre de la estructura anterior, una vez añadido el espacio de nombres “DDS XML” quedarı́a: DDS_XMLDomainParticipant Asociación de métodos a clases. Para reflejar la asociación de un método de una clase, se antepone el nombre de la clase, es decir, el nombre de la estructura con el espacio de nombres, al nombre del método. Por ejemplo, el método “create dds entity” de la clase anterior se nombrarı́a en C ası́: DDS_XMLDomainParticipant_create_dds_entity Parámetros de las funciones. El primer parámetro de un método asociado a una clase será siempre un puntero a una estructura del tipo de la clase. A continuación se incluirán los parámetros de entrada y al final de la lista los parámetros de salida. De esta manera se consigue poder llamar a una serie de métodos sobre un mismo objeto (estructura en C). Por ejemplo, en el método anterior existirá el siguiente parámetro: DDS_XMLDomainParticipant_create_dds_entity( struct DDS_XMLDomainParticipant *self, <parámetros de entrada>, <parámetros de salida>) 64 6.2. Implementación del analizador de gramática semi-natural Métodos new y delete. A cada clase se le añaden métodos para la creación y destrucción de estos. En este caso estos métodos reservan o liberan memoria para los campos necesarios, e inicializan sus valores si es necesario. 6.2. Implementación del analizador de gramática semi-natural En el Apartado 4.2 de la fase de análisis se definió, mediante notación BNF, la gramática generativa del lenguaje semi-natural de interacción con el escenario. Por otro lado, en el Apartado 1.7.2 se mencionó como decisión estratégica el uso de las herramientas automatizadas para la generación de analizadores sintácticos, lo que incluye también la generación de analizadores léxicos. Partiendo de la gramática BNF estos generadores construyen analizadores sintácticos. Añadiendo código fuente a las reglas de análisis sintáctico se pueden realizar acciones cuando se reconoce una frase introducida por el usuario. La manera en que están diseñados estos generadores facilita posteriores ampliaciones o modificaciones de la gramática y/o acciones. Las gramáticas BNF se pueden implementar con el uso de un analizador sintáctico de los llamados LookAhead Left-Right (LALR). Una herramienta libre generadora de analizadores sintácticos LALR es bison, [46] la implementación GNU del popular generador de analizadores YACC. Además, será necesario integrar bison con el generador de analizadores léxicos Flex[47]. El proceso de implementación, por tanto, consiste en traducir la gramática definida en la sección 4.2 a bison y definir las acciones pertinentes para cada tipo de sentencia. 6.3. Estructuración modular del código 6.3.1. Modelo Estático: clases DDS XML y parser XML La fase de diseño concluyó con la definición del diagrama de clases del sistema (Apartado 5.3). En esta sección se explicarán algunos detalles de su implementación. Procesado de ficheros XML con las clases DDS XML. El diagrama de clases muestra un conjunto de clases DDS XML, clases que envuelven a entidades DDS. El parser para el procesado de los ficheros XML se ha construido utilizando estas clases. Según el tipo de etiqueta que se encuentre al procesar el fichero, se utilizará unas u otras clases para procesar el contenido almacenado dentro de la etiqueta. Ası́, como resultado del proceso de análisis se obtiene un árbol de objetos DDS XML. La Tabla 6.1 muestra la relación entre entidades DDS, entidades DDS XML y etiquetas. 65 6. Implementación Entidad DDS DomainParticipant Topic Publisher Subscriber DataWriter DataReader Entidad DDS XML DDS XMLDomainParticipant DDS XMLTopic DDS XMLPublisher DDS XMLSubscriber DDS XMLDataWriter DDS XMLDataReader etiqueta <participant> <topic> <publisher> <subscriber> <writer> <reader> Tabla 6.1: Relación entidades DDS, entidades DDS XML y etiquetas Implementación de la herencia El soporte para la herencia entre las entidades se implementa de la siguiente manera: 1. Como se comentó en la Sección 4.3, existe un atributo opcional llamado base name que indica al parser que la clase que está procesando hereda de otra. Cuando el parser encuentra este atributo busca una entidad en el árbol construı́do con el nombre name que coincida con base name. Esta entidad denomina clase base. 2. Antes de procesar la información contenida en la etiqueta de la clase que hereda, se copian a ésta todos los atributos de la clase base. 3. Si se encuentran valores nuevos para los atributos encontrados se sobreescriben éstos con el valor nuevo. En la implementación actual la herencia sólo afecta a los atributos de las clases que sean datos inmediatos, no se heredan las clases hijas de la clase base. Podemos explicar el funcionamiento de la herencia con el siguiente código XML: <d a t a r e a d e r name="reader1"> <d a t a r e a d e r t o p i c>h e l l o w o r l d t o p i c</ d a t a r e a d e r t o p i c> <i n s t a n c e s>5</ i n s t a n c e s> </ d a t a r e a d e r> <d a t a r e a d e r name="reader_as_reader1" base name="reader1"> </ d a t a r e a d e r> Listado 6.1: Código XML para mostrar el funcionamiento de la herencia El DataReader “reader as reader1” tendrá como Topic “hello world topic” y se crearán 5 instancias DDS si se llama al método create all dds entities() del objeto DDS XML que lo envuelve. Se puede sobreescribir cualquier parámetro de la siguiente manera: <d a t a r e a d e r name="reader1"> <d a t a r e a d e r t o p i c>h e l l o w o r l d t o p i c</ d a t a r e a d e r t o p i c> <i n s t a n c e s>5</ i n s t a n c e s> </ d a t a r e a d e r> <d a t a r e a d e r name="reader_as_reader1" base name="reader1"> <d a t a r e a d e r t o p i c>f o o t o p i c</ d a t a r e a d e r t o p i c> </ d a t a r e a d e r> 66 6.3. Estructuración modular del código Listado 6.2: Código XML para mostrar el funcionamiento de la herencia En este caso, el DataReader “reader as reader1” tendrá como Topic “foo topic”, pero el número de instancias seguirá siendo 5. Estructuras de datos para la representación de las clases DDS XML A continuación se muestra el código de ejemplo de la la estructura DDS XMLDataReader. El resto de clases no difiere demasiado de esta salvo por la inclusión de atributos para datos especı́ficos. s t r u c t DDS XMLDataReader{ s t r u c t DDS XMLObject base ; / ∗ S e t o f DDS DataReader i n s t a n c e s ∗ / DDS DataReader ∗∗ d d s d a t a r e a d e r ; / ∗ P o i n t e r t o t h e DDS XMLTopic i n t h e DOM. ∗ T h i s p o i n t e r i s s e t up d u r i n g t h e p a r s i n g ∗ p r o c e s by l o o k i n g f o r t h e d a t a w r i t e r t o p i c t a g ∗ c o n t e n t . The s e a r c h p r o c e s s s t a r t s i n ∗ t h e DDS XMLDomainParticipant o f t h e ∗ p a r e n t DDS XMLSubscriber ∗ / s t r u c t DDS XMLTopic ∗ x m l t o p i c ; / ∗ C o n t e n t o f t h e <i n s t a n c e s > t a g ∗ / short instances tag ; / ∗ T o t a l number o f i n s t a n c e s c o n s i d e r i n g t h e number o f ∗ parent i n s t a n c e s ∗/ s h o r t i ns ta n ce s n um be r ; / ∗ L i s t e n e r f o r a t t a c h i n g t o t h e DDS E n t i t y . ∗ This l i s t e n e r w i l l b e NULL o r i t w i l l b e ∗ r e t r i e v e d from t h e DataReader ∗ l i s t e n e r s t a b l e ∗/ s t r u c t DDS DataReaderListener ∗ l i s t e n e r ; / ∗ S t a t u s mask t h a t w i l l b e a p p l i e d t o t h e l i s t e n e r ∗ / DDS StatusMask l i s t e n e r m a s k ; / ∗ S e t o f t h r e a d ’ s IDs ∗ / pthread t ∗ thread ; / ∗ B e h a v i o u r method . T h i s method w i l l b e e x e c u t e d when ∗ t h e s t a r t b e h a v i o u r ( ) method i s c a l l e d ∗ / void ∗ ( ∗ behaviour ) ( void ∗ ) ; }; Listado 6.3: Estructura DDS XMLDataReader El significado y uso de los campos de datos es: struct DDS_XMLObject base: objeto base del que hereda la clase. DDS_DataReader **dds_datareader: conjunto de en entidades DDS que maneja la clase. struct DDS_XMLTopic *xml_topic: referencia al DDS XMLTopic en el árbol de la aplicación. Esta referencia se fija durante el procesamiento del fichero XML 67 6. Implementación buscando el tema indicado por la etiqueta datawriter_topic. El tema correspondiente se busca comenzando desde el DDS XMLDomainParticipant padre de la entidad. short instances_tag: contenido de la etiqueta <instances>. short instances_number: número de instancias DDS que se podrán crear. Considerando que la entidad padre de esta clase puede, a su vez tener más instancias, el total de instancias que se pueden crear será el número de instancias de la entidad padre por el número indicado en la etiqueta XML, almacenado en el atributo instances_tag. Este atributo se modifica durante el procesamiento del fichero XML. struct DDS_DataReaderListener *listener: listener que se asociará a la entidad DDS que se cree. DDS_StatusMask listener_mask: configuración de las callbacks que monitorizará el listener. pthread_t *thread: identificadores de las hebras lanzadas para ejecutar comportamiento paralelo. void *(*behaviour)(void *): puntero a un método de descripción del comportamiento. Los dos últimos atributos se refieren al comportamiento dinámico que se quiere utilizar para la entidad. Cuando se invoca al método start behaviour() en una clase DDS XML, este crea una nueva hebra para llamar al método que describe el comportamiento. Para poder detener la ejecución del comportamiento es necesario almacenar una referencia a la hebra, y esto se almacena en el vector thread. Como pueden existir varias entidades DDS en una entidad DDS XML actuando a la vez, se creará una hebra para cada entidad DDS que inicie su actividad. Ası́, para un una posición del vector de entidades DDS existirá una en el vector de hebras para identificar la hebra que utiliza una entidad DDS. 6.3.2. Modelo Dinámico El Modelo Dinámico describe el comportamiento de entidades del Modelo Estático. La descripción se hace programando un método y configurando los listeners apropiados mediante el API de DDS para el lenguaje C. El módulo del Modelo Dinámico actuará como una base de datos que almacena métodos y listeners. Esta base de datos está compuesta de una serie de tablas que gestionan información para poder acceder a los elementos dinámicos que almacenan. El módulo proporciona métodos para inicialiar estas tablas y hacer búsquedas sobre ellas. 68 6.3. Estructuración modular del código Si el usuario quiere que un conjunto de métodos y listeners puedan ser utilizados debe incluirlos en estas tablas. A continuación se muestran extractos de código de las tablas del Modelo Dinámico. s t a t i c s t r u c t BehaviourMethodEntry DM models table [ DM models table elements ] ; s t a t i c s t r u c t DataReaderListenerEntry DM datareaders listeners table [ DM datareader listeners table elements ] ; ... Listado 6.4: Tablas del Modelo Dinámico Estas tablas estás compuestas de entradas como la del Listado 6.5. typedef s t r u c t BehaviourMethodEntry { / ∗ I d e n t i f i e r / k e y o f t h e method ∗ / char ∗name ; / ∗ Type Name f o r t h e b e h a v i o u r method ∗ / char ∗type name ; / ∗ P o i n t e r t o t h e b e h a v i o u r method ∗ / void ∗ ( ∗ behaviour ) ( void ∗ ) ; } BehaviourMethodEntry ; typedef s t r u c t D a t a R e a d e r L i s t e n e r E n t r y { /∗ I d e n t i f i e r / key o f the L i s t e n e r ∗/ char ∗name ; / ∗ Type Name f o r t h e l i s t e n e r ∗ / char ∗type name ; / ∗ The l i s t e n e r t h a t i s g o i n g t o b e r e t r i e v e d ∗ / s t r u c t DDS DataReaderListener ∗ l i s t e n e r ; / ∗ D e f a u l t mask t o a p p l y t o t h e L i s t e n e r . Maybe i t ’ s u n n e c e s a r y ∗ / DDS StatusMask l i s t e n e r m a s k ; / ∗ User d e f i n e d method f o r i n i t i a l i z i n g t h e l i s t e n e r . ∗ T h i s method w i l l b e c a l l e d by t h e l o o k u p method b e f o r e ∗ returning the l i s t e n e r to the user ∗/ void ∗ ( ∗ i n i t i a l i z e m e t h o d ) ( ) ; / ∗ User d e f i n e d method f o r r e l a s e l i s t e n e r r e s o u r c e s ∗ / void ∗ ( ∗ delete method ) ( ) ; } DataReaderListenerEntry ; Listado 6.5: Entradas de las tablas del Modelo Dinámico Un ejemplo de tablas es el del Listado 6.3.2, que muestra la inicialización de una tabla de listeners para entidades DataReader. void D y n a m i c M o d e l d a t a r e a d e r i n i t i a l i z e l i s t e n e r s t a b l e ( void ) { D M d a t a r e a d e r s l i s t e n e r s t a b l e [ 0 ] . name = DDS String dup ( "DDS_StringX_listener" ) ; D M d a t a r e a d e r s l i s t e n e r s t a b l e [ 0 ] . type name = DDS String dup ( DDS StringXTypeSupport get type name ( ) ) ; D M d a t a r e a d e r s l i s t e n e r s t a b l e [ 0 ] . l i s t e n e r = NULL; D M d a t a r e a d e r s l i s t e n e r s t a b l e [ 0 ] . l i s t e n e r m a s k = DDS STATUS MASK ALL ; 69 6. Implementación DM datareaders listeners table [ 0 ] . initialize method = &D D S S t r i n g X d a t a r e a d e r l i s t e n e r i n i t i a l i z e ; } 6.3.3. Módulo de coordinación El módulo de coordinación, como su nombre indica, coordina todos los nodos del escenario utilizando un tema de control o Control Topic. El tipo de datos de este tema, Command, se describió en el capı́tulo de análisis, Sección 4.2.2. Las clases CommandPublisher y CommandSubcriber implementan la comunicación de instrucciones entre los nodos del escenario. Estas clases no son aplicaciones en si, sino que se utilizan dentro de dos aplicaciones: cmdmaster es una aplicación DDS que se ejecuta en un nodo “Command Master”. cmdmaster es una aplicación que integra a un analizador sintáctico generado por Yacc. El resultado del análisis sintáctico se utiliza para rellenar los campos de instancias de datos de la estructura Command. Estas instancias se publicarán a la red utilizando la clase CommandPublisher. La aplicación cmdslave es la única que el usuario necesita ejecutar en un nodo para desplegar el escenario. Esta, utiliza la clase CommandSubscriber para recibir y procesar instancias de datos de control que recibe de la red. Recibidas las órdenes, la clase CommandSubscriber utiliza el API de los módulos estático y dinámico para crear y destruir entidades DDS y controlar su comportamiento. Para ilustrar cómo integrar el analizador sintáctico con la clase CommandPublisher, el Listado 6.6 muestra dos reglas que ilustran la integración de CommandPublisher con las reglas de análisis sintáctico de Yacc. | CREATEALL { / ∗ CREATEALL ∗ / # i f d e f DEBUG PARSER PrintDebug ( "CREATEALL\n" ) # endif i f ( CommandPublisher set command all ( globalCommandPublisher , CMD CREATE ENTITIES ALL ) ) { / ∗ W r i t e t h e Command ∗ / CommandPublisher write command ( globalCommandPublisher ) ; CommandPublisher clear command ( globalCommandPublisher ) ; } } | CREATE STRING NUMBER { / ∗ CREATE ENTITY NAME INSTANCE ID ∗ / # i f d e f DEBUG PARSER PrintDebug ( "CREATE %s, %d\n" , $2 , $3 ) 70 6.3. Estructuración modular del código # endif i f ( CommandPublisher set command ( globalCommandPublisher , CMD CREATE ENTITIES , $2 , $3 ) ) { / ∗ W r i t e t h e Command ∗ / CommandPublisher write command ( globalCommandPublisher ) ; CommandPublisher clear command ( globalCommandPublisher ) ; } Listado 6.6: Integración de CommandPublisher con las reglas de análisis sintáctico de Yacc 71 6. Implementación 72 CAPÍTULO 7 PRUEBAS Las pruebas pretenden verificar el correcto funcionamiento del sistema y comprobar que los requisitos funcionales y no funcionales de la especificación se cumplen. Las pruebas a las que se ha sometido el sistema son: Pruebas unitarias: consiste en realizar pruebas a nivel de módulo de forma independiente. Pruebas de integración: los módulos probados en la etapa anterior se integran para comprobar sus interfaces (flujo de datos) en el trabajo conjunto. Pruebas del sistema: para comprobar que el software esté totalmente ensamblado y cumpla tanto los requisitos funcionales y no funcionales como los objetivos indicados para el sistema. Para la realización de las pruebas se ha utilizado un mismo fichero XML (scenario.xml) que hace uso de todas las funcionalidades implementadas respecto al la descripción de entidades. El fichero puede consultarse en el Apéndice C. Este fichero describe ejemplos de: Especificación de varias aplicaciones con participantes pertenecientes a dominios distintos. La herencia entre entidades. El soporte para múltiples instancias. La conexión del Modelo Estático con el Modelo Dinámico. 73 7. Pruebas 7.1. Herramientas para la realización de pruebas Durante las pruebas se han utilizado una serie de herramientas externas, son las siguientes: Valgrind[21] es un software de depuración que permite identificar recursos no liberados al finalizar la ejecución de un programa. Se utilizó con la interfaz gráfica Alleyoop. El depurador GBD, integrado con el entorno de desarrollo Eclipse[19], se utilizó para comprobar la correcta creación y destrucción de hebras internas para el control del los métodos de comportamiento. La herramienta nddsspy, incluida en el producto NDDS[8][23]. Esta herramienta permite monitorizar las los DataWriters, DataReaders y las muestras de datos que aparecen en una red. De esta forma se controla la correcta creación y destrucción de entidades remotas, ası́ como de los datos que se publican. 7.2. Pruebas unitarias Se han realizado las siguiente pruebas unitarias respecto a los siguientes módulos. Modelo Estático. Se han probado dos aspectos de este módulo: 1. El parser o analizador sintáctico para los ficheros XML. Se ha comprobado que el parser reconoce todas las etiquetas necesarias y extrae la información de manera correcta. 2. La funcionalidad ofrecida por las clases DDS XML. Para ello se ha escrito un programa de pruebas que, para el fichero scenario.xml comprobaba el correcto funcionamiento del API ofrecida por estas clases. Esto incluye: Verificación de los métodos de navegación por el árbol del escenario. Búsqueda de entidades en el árbol. Comprobación de los métodos de búsqueda y asignación de modelos dinámicos. Modelo Dinámico. Se escribió un modelo dinámico de prueba para probar la funcionalidad de búsqueda de modelos dinámicos y asignación a entidades DDS XML. Módulo de coordinación. Se han verificado las siguientes funcionalidades: El analizador sintáctico para el lenguaje de interacción con el escenario recoge correctamente las instrucciones del usuario. 74 7.3. Pruebas de integración Las instrucciones del usuario son publicadas mediante DDS y recibidas correctamente en subscriptor de órdenes (CommandSubscriber). La transferencia del fichero XML del escenario utilizando DDS para ficheros que debı́an ser transmitidos en varios mensajes debido a su tamaño. 7.3. Pruebas de integración Las pruebas de integración consistieron en la verificación de la conexión entre los tres módulos: 1. Verificación de la conexión entre el Modelo Estático y el Modelo Dinámico. Para ello se escribió un programa que iniciaba varias entidades DDS descritas y ejecutaba su comportamiento asociado. 2. Verificación de la conexión entre el módulo de coordinación y el Modelo Estático. Se comprobó la correcta traducción de órdenes del usuario recogidas en el módulos de coordinación en llamadas al API de las clases DDS XML. 7.4. Pruebas de sistema Las pruebas de sistema consistieron en el despliegue de un escenario DDS descrito por el fichero scenario.xml. Se utilizaron, para ello, dos ordenadores conectados mediante una red de área local. Las acciones que se realizaron las siguientes acciones: 1. Carga y distribución del escenario. 2. Creación de todas las entidades DDS. 3. Inicio y parada del comportamiento. 4. Destrucción de las entidades. 5. Finalización de los CommandSubscriber de los nodos. Además, se utilizó una aplicación DDS implementada de forma tradicional para comprobar la recepción correcta de datos publicados desde el escenario. 75 7. Pruebas 76 CAPÍTULO 8 RESULTADOS Y TRABAJO FUTURO 8.1. Principales contribuciones de este trabajo Los resultados del desarrollo de este proyecto han sido presentados en julio de 2008 en el IX Workshop on Distributed Object Computing for Real-time and Embedded Systems celebrado en Washington (DC, USA) bajo el tı́tulo “An XML-Based Approach to the Configuration and Deployment of DDS Applications”[48] Este encuentro, organizado por la OMG, constituye un foro para ingenieros de software e investigadores en el campo de los sistemas distribuidos y de tiempo–real. El trabajo actual ha conseguido cumplir los objetivos propuestos con las siguientes conclusiones: 1. La división entre Modelo Estático y Modelo Dinámico para la descripción de aplicaciones minimiza la tarea de programación del sistema. 2. La flexibilidad de las interfaces de programación de estos módulos y el diseño del repertorio de órdenes permite: Evaluar el tiempo de creación y descubrimiento entre entidades DDS. Desarrollar de manera gradual el número y actividad de las entidades que participan en el escenario. 3. La descripción del escenario mediante ficheros XML permite diseñar pruebas distribuidas diferentes tan solo cambiando una lı́neas en estos ficheros. 4. La implementación sobre DDS de la coordinación y distribución del escenario presenta las siguientes ventajas: 77 8. Resultados y Trabajo Futuro El desarrollador no necesita preocuparse sobre la sincronización de ficheros XML. Por un lado, no se necesitan mecanismo externos como SSH o NFS para sincronizar ficheros y órdenes, y, por otro, se puede desplegar el escenario en redes de área amplia. Se puede portar fácilmente el sistema desarrollado a cualquier plataforma soportada por un middleware DDS, incluso si la plataforma no cuenta con sistema de ficheros como ocurre con algunos sistemas de tiempo–real. 8.2. Trabajo futuro Existen una serie de funcionalidades que podrı́an mejorar notablemente el sistema desarrollado: Inclusión de un sistema de auto-validación del escenario. Aprovechando que cada nodo obtiene una copia del fichero XML que describe el escenario, ası́ como la secuencia de órdenes que se distribuyen, cada nodo puede construir localmente un esquema de qué entidades deberı́an haberse creado en el sistema. Relacionado este esquema con la información de descubrimiento que el middleware DDS genera, podrı́a detectar de manera automática si el escenario se ha desplegado de manera adecuada o, en cambio, hay nodos no accesibles. Inclusión de un sistema de gestión de la seguridad. En la implementación actual, no existen medidas de seguridad que impidan a un potencial atacante publicar información a través del tema de control Extensión del Modelo Estático para soportar perfiles de QoS. En la actualidad varias implementaciones de DDS están incorporando perfiles de QoS que se describen bien a través de ficheros XML o se incluyen de manera nativa en el producto. Estos perfiles agrupan parámetros de configuración de calidad de servicio que en su conjunto permiten configurar grupos de entidades DDS para realizar comunicaciones de baja latencia, máximo rendimiento, etc. La integración con estos proyectos permitirı́a describir con mayor potencia los escenarios DDS. 78 BIBLIOGRAFÍA [1] W3C. Web services architecture, w3c working group note, feb 2004. Disponible en la Web: http://www.w3.org/TR/wsdl. [2] Erik Christensen et al. Web services description language (wsdl) 1.1, w3c note, mar 2001. Disponible en la Web: http://www.w3.org/TR/wsdl. [3] Inc. Sun Microsystems. Java message service (jms), 2008. Disponible en la Web: http://java.sun.com/products/jms/. [4] Object Management Group. Common object request broker architecture (corba/iiop), version 3.0.3, 03 2004. Disponible en la Web: http://www.omg.org/ docs/formal/04-03-12.pdf. [5] Message Passing Interface Forum. Mpi: A message-passing interface standard, version 2.1. Technical report, Message Passing Interface Forum, 06 2008. Disponible en la Web: http://www.mpi-forum.org/docs/mpi21-report.pdf. [6] Object Management Group. Data distribution service for real-time systems specification, version 1.2, 01 2007. Disponible en la Web: http://www.omg.org/ technology/documents/formal/data_distribution.htm. [7] Object Management Group (OMG). The object management group (omg), 09 2008. Disponible en la Web: http://www.omg.org/. [8] Inc. Real-Time Innovations. Rti data distribution service, 09 2008. Disponible en la Web: http://www.rti.com/products/data_distribution/index.html. [9] Inc. Real-Time Innovations. Disponible en la Web: http://www.rti.com. [10] PrismTech Ltd. Opensplice dds, 09 2008. Disponible en la Web: http://www. prismtech.com/opensplice-dds. 79 [11] PrismTech Ltd. Prismtech ltd. Disponible en la Web: http://www.prismtech. com. [12] Inc. Object Computing. Opendds, 09 2008. Disponible en la Web: http://www. opendds.org. [13] Object Computing Inc. Object computing inc., 09 2008. Disponible en la Web: http: //www.ociweb.com. [14] Object Management Group (OMG). Dds vendors page, 09 2008. Disponible en la Web: http://portals.omg.org/dds/VendorsPage. [15] Javier Sánchez-Monedero, J.M. López-Soler, and J. Povedano-Molina. Scalable dds discovery protocols based on bloom filters. In Real-time and Embedded Systems Workshop, Arlington VA, USA, 2007. Disponible en la Web: http://www.omg.org/news/meetings/workshops/RT-2007/04-2_ Sanchez-Moder_etal-revised.pdf. [16] RedIris. Plataforma de analisis de servicios de telecomunicaciones (pasito), versión 7.0. Technical report, 2008. [17] Leslie Lamport. LaTeX: A Document Preparation System: User’s Guide and Reference Manual. Addison-Wesley, 1985. [18] Michel Ludwig et. al. Kile - an integrated latex environment, 09 2008. Disponible en la Web: http://kile.sourceforge.net/. [19] The Eclipse Foundation. Eclipse, 09 2008. Disponible en la Web: http://www. eclipse.org/. [20] Free Software Foundation. The gnu project debugger, 09 2008. Disponible en la Web: http://www.gnu.org/software/gdb/. [21] Cerion Armour-Brown et. al. valgrind.org/. Valgrind, 09 2008. Disponible en la Web: www. [22] Jeffrey Stedfast. Alleyoop, 09 2008. Disponible en la Web: http://alleyoop. sourceforge.net/. [23] Inc. Real-Time Innovations. RTI Data Distribution Service User’s Manual, Version 4.3e, 2008. [24] James Clark. The expat xml parser, 09 2008. Disponible en la Web: http://expat. sourceforge.net/. [25] IEEE. IEEE Std 1003.1-2001 Standard for Information Technology — Portable Operating System Interface (POSIX) System Interfaces, Issue 6. IEEE, New York, NY, USA, 2001. Revision of IEEE Std 1003.1-1996 and IEEE Std 1003.2-1992) Open Group Technical Standard Base Specifications, Issue 6. 80 [26] Sun Microsystems. RPC: remote procedure call protocol specification: Version 2. RFC 1057, Internet Engineering Task Force, June 1988. Disponible en la Web: http: //www.rfc-editor.org/rfc/rfc1057.txt. [27] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, and T. BernersLee. Hypertext transfer protocol – HTTP/1.1. RFC 2616, Internet Engineering Task Force, June 1999. Disponible en la Web: http://www.rfc-editor.org/rfc/ rfc2616.txt. [28] Nilo Mitra. Soap version 1.2 part 0: Primer. W3C working draft, World Wide Web Consortium (W3C), December 2001. Disponible en la Web: http://www.w3.org/ TR/soap12-part0/. [29] Sun Developer Network. RMI remote method invocation. [30] Object Management Group. Omg idl syntax and semantics - common object request broker architecture (corba), v3.0. Technical report, 2002. Disponible en la Web: http://www.omg.org/cgi-bin/doc?formal/02-06-39. [31] Tim Bray, Jean Paoli, and C. M. Sperberg-McQueen. Extensible markup language (xml) 1.0 (fourth edition). W3C Recommendation REC-xml-20001006, World Wide Web Consortium (W3C), October 2006. Disponible en la Web: http://www.w3. org/TR/2006/REC-xml-20060816/. [32] David C. Fallside and Priscilla Walmsley. XML schema part 0: Primer second edition. W3C recommendation, W3C, October 2004. http://www.w3.org/TR/2004/RECxmlschema-0-20041028/. [33] Xml (extensible markup language). Wikimedia Foundation, Inc., 09 2008. Disponible en la Web: http://en.wikipedia.org/wiki/XML#Critique_of_XML. [34] D. Crockford. Introducing json, 09 2008. Disponible en la Web: http://json. org/. [35] D. Crockford. The application/json media type for javascript object notation (json). RFC 4627, Internet Engineering Task Force, 07 2006. Disponible en la Web: http: //www.rfc-editor.org/rfc/rfc4627.txt. [36] Henry Story. The limitations of json, 07 2007. Disponible en la Web: http: //blogs.sun.com/bblfish/entry/the_limitations_of_json. [37] Sparx Systems. Sparx systems, 09 2008. Disponible en la Web: http://www. sparxsystems.com. [38] Sparx Systems Pty Ltd. Mdg technology for dds, 09 2008. Disponible en la Web: http://www.sparxsystems.com.au/products/mdg/tech/dds/ index.html. 81 [39] Jishnu Mukerji and Joaquin Miller. Mda guide version 1.0.1. Technical report, Object Management Group, 06 2003. Disponible en la Web: http://www.omg.org/ cgi-bin/doc?omg/03-06-01. [40] Douglas C. Schmidt. Distributed object computing (doc) group for distributed realtime and embedded (dre) systems, 09 2008. Disponible en la Web: http://www. dre.vanderbilt.edu/. [41] Douglas C. Schmidt. Dds benchmark project, 2008. Disponible en la Web: http: //www.dre.vanderbilt.edu/DDS/. [42] Jeff Parsons, Ming Xiong, Dr. Douglas C. Schmidt, Hieu Nguyen, Ming Xiong, , James Edmondson, and Olabode Ajiboye. Evaluating the performance of pub/sub platforms for tactical information management. In Real-time and Embedded Systems Workshop, Arlington, VA USA - July 10-13, 2006, 2006. Disponible en la Web: http://www.dre.vanderbilt.edu/DDS/DDS_RTWS06.pdf. [43] The GNOME Project. Planner, 09 2008. Disponible en la Web: http://live. gnome.org/Planner. [44] Bert Farabaugh Gerardo Pardo-Castellote. Introduction to DDS and Data Centric Communications, 2005. Disponible en la Web: www.omg.org/news/ whitepapers/Intro_To_DDS.pdf. [45] Ivar Jacobson, Grady Booch, and James Rumbaugh. El Proceso Unificado de Desarrollo de Software. 2000. [46] GNU Project, 09 2008. Disponible en la Web: http://www.gnu.org/software/ bison/. [47] The Flex Project. Flex (the fast lexical analyzer), 09 2008. Disponible en la Web: http://flex.sourceforge.net/. [48] Javier Sánchez-Monedero, J.M. López-Soler, J. Povedano-Molina, and J.M. LópezVega. An xml-based approach to the configuration and deployment of dds applications. In Workshop on Distributed Object Computing for Real-time and Embedded Systems, Washington, DC, USA, 2008. Disponible en la Web: http: //www.omg.org/news/meetings/workshops/Real-time_WS_Final_ Presentations_2008/Session%202/02-03_Monedero_et_al.pdf. [49] Real-Time Innovations Inc. RTI Data Distribution Service. Users’ Manual (version 4.1), 2007. [50] S. Shepler, Brent Callaghan, David Robinson, R. Thurlow, C. Beame, M. Eisler, and D. Noveck. Network file system (NFS) version 4 protocol. RFC 3530, Internet Engineering Task Force, April 2003. Disponible en la Web: http://www.rfc-editor. org/rfc/rfc3530.txt. 82 BIBLIOGRAFÍA [51] Sun Microsystems, Inc. RFC 1014: XDR: External Data Representation standard. Technical report, June 1987. Disponible en la Web: ftp://ftp.internic.net/ rfc/rfc1014.txt,http://www.rfc-editor.org/rfc/rfc1014.txt. Status: UNKNOWN. [52] Reinier Torenbeek. Benchmarking omg dds for large–scale distributed systems. In Real-time and Embedded Systems Workshop, Washington, DC, USA, 2008. Disponible en la Web: http://www.omg.org/news/meetings/workshops/Real-time_ WS_Final_Presentations_2008/Session%207/07-02_Torenbeek.pdf. 83 BIBLIOGRAFÍA 84 APÉNDICE A INTRODUCCIÓN A DDS Hoy en dı́a cada vez es más usual el uso de aplicaciones distribuidas. No es raro encontrarse con una serie de aplicaciones que se ejecutan en distintas máquinas de forma cooperativa dando la sensación de ser todo un mismo sistema. Dentro de estos sistemas de computación distribuida, se pueden encontrar los denominados servicios de distribución de datos. En este caso, lo que se encuentra disperso no son las aplicaciones, sino los datos de interés. Un ejemplo claro de ello puede ser la monitorización de sensores. Cada sensor puede encontrarse en un lugar distinto, los cuales se comunican con la entidad monitorizadora por medio de alguna red de conexión. Las Figuras A.1 y A.2 muestran cómo DDS crea una capa entre la aplicación y el sistema operativo y la red. En casos de datos distribuidos como los mencionados anteriormente, los requisitos de tiempo real, fiabilidad, falla ante errores suelen ser muy importantes. Una arquitectura que mantenga todas estas cualidades de una manera adecuada es muy compleja de construir. No serı́a razonable tener que diseñar para cada nueva aplicación que requiera de distribución de datos una arquitectura que la soporte. Para paliar este problema, algunas empresas han dedicado esfuerzos en diseñar una infraestructura de distribución de datos de una manera común y razonable. Este esfuerzo se ha materializado en lo que hoy se conoce como Data Distribution Service (DDS)[6][44]. DDS proporciona un middleware que abstrae al programador de aplicaciones que necesiten de datos distribuidos de las tareas necesarias para la recogida de los mismos, con máximas prestaciones. DDS deja de lado el clásico paradigma cliente/servidor , para usar un nuevo paradigma mucho más adecuado para distribución de datos: publicación/suscripción. DDS es por tanto un esfuerzo que normaliza el mecanismo de publicación/suscripción, de manera que puede ser añadido a cualquier aplicación de una manera sencilla. 85 Figura A.1: Arquitectura de un sistema de distribución de datos sin DDS Figura A.2: Arquitectura de un sistema de distribución de datos con DDS 86 A. Introducción a DDS Figura A.3: Infraestructura de DDS Las ventajas de usar DDS son: 1. Está basado en un paradigma conceptualmente sencillo como es publicación/suscripción 2. Es escalable dinámicamente 3. Está diseñado de modo que la sobrecarga del sistema sea mı́nima 4. Soporta comunicaciones de uno a uno, de uno a muchos o de muchos a muchos 5. Facilita al desarrollador enormemente la tarea de desarrollo de aplicaciones para distribución de datos La utilización de un nuevo paradigma supone cambiar la manera de trabajar de las aplicaciones en muchos aspectos. El paradigma de publicación/suscripción no se basa en la existencia de un servidor central, que es el que se encarga de satisfacer las solicitudes del cliente. En lugar de ello, lo que se hace es que cada entidad (es decir, un computador o sistema embebido que soporte DDS) que posea un dato susceptible de ser de interés para otra entidad, informa al middleware de la disponibilidad del dato y publica dicho dato (de ahı́ el término publicación). Por otro lado, existen entidades con interés hacia ciertos datos. En este caso, cuando una entidad está interesada en un dato, lo que se hace es que se informa al middleware de dicho interés, y éste se encargara de proporcionarlo. En este caso, se dice que la entidad se ha suscrito a un tipo de dato. 87 Figura A.4: Entidades DDS participantes en un Dominio (Domain) Además de estos conceptos de publicación/suscripción, para facilitar la explicación del trabajo realizado y de la arquitectura de DDS, se hace necesaria la explicación de nuevos conceptos: Descubrimiento (Discovery): Es el proceso que se realiza para identificar las entidades que están publicando datos en DDS. Este proceso se inicia de forma casi instantánea por DDS, y sólo requiere que el usuario proporcione un punto de partida donde comenzar la búsqueda. Tema (Topic) : Se define como tema cada uno de los distintos tipos de datos que son publicados en DDS. Cada tema tiene sus propias caracterı́sticas, y sus tipos de datos asociados. Instancia (Instance): Un mismo tema (tipo de datos) puede ser publicado por muchas entidades. Para que cada tema publicado se diferencie de los demás se usa un mecanismo de claves únicas. Por ejemplo, si tenemos datos de posición de diversos radares (algo muy común en triangulación), para identificar de dónde proviene cada dato añadimos un campo de clave, para que cada dato de posición se utilice correctamente en los cálculos de determinación de la posición exacta de un objeto. El empleo de claves está gestionado por el middleware de DDS. Muestra (Sample): Una vez definido el concepto de instancia es conveniente definir el concepto de muestra. Éste se refiere a cada uno de los valores que toma una instancia a lo largo del tiempo. En el ejemplo de los radares empleado en la definición de instancia, una muestra serı́a cada uno de las sucesivas tomas de datos de cada radar que determinan la distancia del mismo en un instante determinado. 88 A. Introducción a DDS Dominio (Domain): Mecanismo de agrupamiento de entidades en DDS. Cada entidad se encuentra situada dentro de un dominio por medio de un participante de dominio. Todas las aplicaciones que dispongan de participantes en un dominio, pueden descubrir e interaccionar con otras aplicaciones remotas con participantes en el mismo dominio.Mediante este mecanismo se consigue aumentar la escalabilidad ası́ como aislamiento de tráfico. Una vez definidos estos conceptos, el siguiente paso es identificar las entidades presentes en DDS para ver como se relacionan. Esto se pone de manifiesto en la Figura A.4, donde aparecen una serie de entidades relacionadas que se identifican a continuación: Suscriber: Es el punto de comunicación entre los DataReader y la aplicación. Se encarga de gestionar las suscripciones (temas en los que se haya declarado interés). Publisher: Es el encargado de publicar temas en un dominio, que serán recogidos por los suscriptores situados en otro participante de dominio. DataWriter: Es el punto de acceso de una aplicación a DDS para publicar datos que serán publicados por un publisher DataReader: Es el punto de acceso de una aplicación a DDS para recibir datos que fueron recogidos por un suscriber La Figura A.5 muestra el modelo conceptual DCPS (Data-Centric Publish–Subscribe, publicación–subscripción centrada en los datos) que agrupa a las entidades descritas antes. Además de lo anteriormente comentado, es conveniente mencionar una caracterı́stica ventajosa de DDS: internamente, todas las entidades presentes en DDS, disponen de una serie de polı́ticas de calidad de servicio (QoS). Estas polı́ticas son modificables de modo que pueden afinarse en función del entorno de explotación final. Polı́ticas de calidad de servicio (QoS) Las polı́ticas de calidad de servicio (QoS) son uno de los atractivos de utilizar DDS. Mediante ellas se pueden gestionar aspectos muy variados del funcionamiento de DDS, desde el descubrimiento de entidades remotas distribuidas, hasta parámetros de tiempo de recogida de datos o de usuario. Las polı́ticas de calidad de servicio disponibles son: Destination Order Group Data Liveliness Deadline History Ownership Durability Latency Budget Ownership Strength Entity Factory Lifespan Partition 89 Figura A.5: Modelo conceptual de las entidades DDS 90 A. Introducción a DDS Presentation Resource Limits Transport Priority Reader Data Lifecycle Time-Based Filter User Data Reliability Topic Data Writer Data Lifecycle De todas las polı́ticas mostradas, algunas sólo están disponibles para ciertos tipos de entidades. Por otro lado sólo algunas de ellas pueden ser modificadas dinámicamente. De todas estas polı́ticas de calidad de servicio, se destacan algunas de ellas, por ser de mayor interés por sus caracterı́sticas: Deadline Este parámetro se refiere al tiempo o intervalo mı́nimo de envı́o de datos por parte de un DataWriter. Es útil para aplicaciones que publican los datos periódicamente. Si se supera el tiempo de Deadline entre muestras, la aplicación es notificada, quedando a decisión del desarrollador las acciones a llevar a cabo en este supuesto. Lifespan Se refiere al tiempo en el que un mensaje o muestra es válido. Si se supera el tiempo para este mensaje, es eliminado de DDS. Transport Priority Se refiere a la prioridad que recibe una muestra de datos en la capa de transporte subyacente. Dicho valor es válido sólo si la capa de transporte subyacente soporta prioridad de mensajes. Para una descripción más detallada de éstas y otras polı́ticas de calidad de servicio, véase [44] ó [49]. 91 92 APÉNDICE B DESPLIEGUE Y DESARROLLO DE UN ESCENARIO INCREMENTALMENTE El objetivo de este ejemplo es mostrar la secuencia de órdenes necesaria para realizar un despliegue y ejecución incremental de un escenario. Supóngase que se quiere desarrollar el siguiente escenario en el que se tienen dos aplicaciones distribuidas descritas mediantes sus modelos estáticos y dinámicos: Una aplicación publicadora de datos, Application radar o Radar. Una aplicación subscriptora Application traffic control o Control Tráfico que trabaja con los datos que recibe de entidades Application radar. El primer paso consiste en la preparación del escenario. Se supone que las herramientas cmdmaster (rol de CommandPublisher) y cmdslave (rol de CommandSubscriber) se están ejecutando en los nodos adecuados, tal y como muestra la Figura B.1. En todo momento se indicará la secuencia de órdenes en el recuadro “Control Topic” y la figura correspondiente mostrará los efectos de la ejecución de órdenes. Las flechas rojas indican cómo el nodo CommandPublisher publica órdenes a través de tema de control, órdenes que reciben los nodos CommandSubscriber. El segundo paso (Figura B.2) consiste en la distribución de la descripción del escenario a los nodos que participan en él mediante el la orden: > load "scenario.xml" Esta orden lee el fichero que el usuario le proporciona y lo distribuye a todos los nodos. Cada nodo seleccionará la aplicación adecuada consultando la etiqueta <deployment> de cada aplicación. Ası́, las aplicaciones Radar se asignarán a los Nodos 1 y 2, y la aplicación Control Tráfico se asignará al Nodo 3. 93 Figura B.1: Representación de despliegue de un escenario: estado inicial 94 B. Despliegue y desarrollo de un escenario incrementalmente Figura B.2: Representación de despliegue de un escenario: distribución del escenario y asignación de aplicaciones 95 Asignadas las aplicaciones a nodos, puede empezar la creación de algunas entidades. Por ejemplo pueden crearse todos los Participants, Topics, Publishers y Subscribers mediante la siguiente secuencia de órdenes: > > > > > create create create create create "radar_participant" "radar_topic" "radar_publisher" "tcontrol_participant" "tcontrol_subscriber" Tras la ejecución de esta orden los nodos correspondientes crearán este conjunto de entidades. Si el usuario quiere realizar una carga incremental del sistema creando poco a poco las entidades y decide crear la primera instancia de los DataReader llamados “reader a”: > create "reader_a" 1 La distribución de esta orden a los CommandSubscriber produce que cada uno de ellos busque en su aplicación una entidad llamada “reader a”. Los que la tengan crearán la instancia DDS de ı́ndice 1. Este es el caso del Nodo 3, que crea este DataReader (ver Figura B.3) para subscribirse a la futura información que publiquen los radares. El mismo proceso puede repetirse para crear otras entidades: > create "writer_a" 1 El comando anterior produce que los nodos cuya aplicación tenga una entidad llama “writer a” creen una entidad DDS, en este caso un DataWriter, como puede observarse en la Figura B.4. Este tipo de creación gradual de entidades es interesante, por ejemplo, para medir el tiempo de descubrimiento de las entidades de la red. Pasemos ahora a iniciar el comportamiento de algunas de las entidades. La orden siguiente inicia la actividad de los DataWriters creados en el paso anterior: > start "writer_a" 1 La Figura B.5 muestra el inicio de actividad de los DataWriters creados en los nodos 1 y 2. Las flechas negras indican el tráfico de datos DDS que generan estas entidades como resultado de la su actividad. El nodo 3 comienza a recibir los datos de los nodos 1 y 2. Se puede incrementar el número de entidades con el fin de comprobar cómo reacciona el escenario ante el incremento de carga. Para ilustrar esto, se utilizan los siguientes comandos para crear una segunda entidad del tipo “writer a”. Además se activa el comportamiento de estas entidades: 96 B. Despliegue y desarrollo de un escenario incrementalmente Figura B.3: Representación de despliegue de un escenario: creación varias entidades DDS 97 Figura B.4: Representación de despliegue de un escenario: creación de dos DataWriters 98 B. Despliegue y desarrollo de un escenario incrementalmente Figura B.5: Representación de despliegue de un escenario: inicio de la actividad de algunas entidades > create "writer_a" 2 > start "writer_a" 2 La Figura B.6 muestra este incremento de la carga del sistema tras la aplicación de estas órdenes. Por último, se puede detener el comportamiento de todas las entidades de la red al mismo tiempo con una orden que se aplica a todas las entidades. La Figura B.7 muestra el efecto de los comandos listados a continuación, que producen el cese de actividad y destrucción de todas las entidades DDS de la red (salvo las relativas a la coordinación del escenario): > stopall > destroy Por último, se puede finalizar la ejecución de la aplicación cmdslave mediante el comando siguiente: > terminate 99 Figura B.6: Representación de despliegue de un escenario: incremento del número de entidades y actividad en el escenario 100 B. Despliegue y desarrollo de un escenario incrementalmente Figura B.7: Representación de despliegue de un escenario: destrucción de las entidades DDS La Figura B.8 ilustra el efecto de esta orden. 101 Figura B.8: Representación de despliegue de un escenario: finalización de la ejecución de los CommandSubscribers 102 APÉNDICE C FICHEROS UTILIZADOS EN LAS PRUEBAS C.1. Fichero de definición de tipo de documento (DTD) El Listado C.1 muestra el fichero DTD que define el formato de los ficheros XML válidos. <!−− d d s −−> <!ELEMENT dds ( a p p l i c a t i o n ) ∗> <!−− S c e n a r i o d e s c r i p t i o n : an a p p l i c a t i o n −−> <!−− A p p l i c a t i o n ( c o n t a i n s DDS E n t i t i e s ) −−> <!ELEMENT a p p l i c a t i o n ( p a r t i c i p a n t +)> <! ATTLIST a p p l i c a t i o n name CDATA #IMPLIED> <! ATTLIST a p p l i c a t i o n base name CDATA #IMPLIED> <!−− DDS ENTITIES −−> <!−− p a r t i c i p a n t −−> <!ELEMENT p a r t i c i p a n t ( domain id , participant entities , listener ? , behaviour ? , i n s t a n c e s ? )> <! ATTLIST p a r t i c i p a n t name CDATA #IMPLIED> <! ATTLIST p a r t i c i p a n t base name CDATA #IMPLIED> <!ELEMENT domain id ( #PCDATA)> <!ELEMENT p a r t i c i p a n t e n t i t i e s ( t o p i c | p u b l i s h e r | s u b s c r i b e r ) ∗> <!−− t o p i c −−> <!ELEMENT t o p i c ( topic name ? , type ? , listener ? , behaviour ? )> <! ATTLIST t o p i c name CDATA #IMPLIED> 103 C.2. Fichero de prueba scenario.xml <! ATTLIST t o p i c base name CDATA #IMPLIED> <!ELEMENT topic name ( #PCDATA)> <!ELEMENT type ( #PCDATA)> <!−− p u b l i s h e r −−> <!ELEMENT p u b l i s h e r ( datawriter ∗ , listener ? , behaviour ? , i n s t a n c e s ? )> <! ATTLIST p u b l i s h e r name CDATA #IMPLIED> <! ATTLIST p u b l i s h e r base name CDATA #IMPLIED> <!−− w r i t e r −−> <!ELEMENT d a t a w r i t e r ( datawriter topic , listener ? , behaviour ? , i n s t a n c e s ? )> <! ATTLIST d a t a w r i t e r name CDATA #IMPLIED> <! ATTLIST d a t a w r i t e r base name CDATA #IMPLIED> <!ELEMENT d a t a w r i t e r t o p i c ( #PCDATA)> <!−− s u b s c r i b e r −−> <!ELEMENT s u b s c r i b e r ( datareader ∗ , listener ? , behaviour ? , i n s t a n c e s ? )> <! ATTLIST s u b s c r i b e r name CDATA #IMPLIED> <! ATTLIST s u b s c r i b e r base name CDATA #IMPLIED> <!−− r e a d e r −−> <!ELEMENT d a t a r e a d e r ( datareader topic ? , listener ? , behaviour ? , i n s t a n c e s ? )> <! ATTLIST d a t a r e a d e r name CDATA #IMPLIED> <! ATTLIST d a t a r e a d e r base name CDATA #IMPLIED> <!ELEMENT d a t a r e a d e r t o p i c ( #PCDATA)> <!ELEMENT l i s t e n e r ( #PCDATA)> <!ELEMENT behaviour ( #PCDATA)> <!−− Number o f i n s t a n c e s which a r e g o i n g t o b e c r e a t e d o f an e n t i t y . T h i s i s n o t m a n d a t o r y s o t h e d e f a u l t v a l u e i f n o t p r e s e n t i s 1 −−> <!ELEMENT i n s t a n c e s ( #PCDATA)> Listado C.1: Fichero de definición de tipo de documento (DTD) C.2. Fichero de prueba scenario.xml El Listado C.2 muestra el fichero XML utilizado en las pruebas del sistema. 104 C. Ficheros utilizados en las pruebas <?xml v e r s i o n="1.0" encoding="UTF-8"?> <dds> <a p p l i c a t i o n name="application1"> <p a r t i c i p a n t name="participant1"> <domain id>21</domain id> <p a r t i c i p a n t e n t i t i e s> <t o p i c name="hello_world_topic"> <topic name>Hello world !</topic name> <type>DDS StringX</type> </ t o p i c> <p u b l i s h e r name="publisher1"> <d a t a w r i t e r name="writer1a"> <d a t a w r i t e r t o p i c>h e l l o w o r l d t o p i c</ d a t a w r i t e r t o p i c> <behaviour>DDS StringX behaviour<behaviour> </ d a t a w r i t e r> <d a t a w r i t e r name="writer1b"> <d a t a w r i t e r t o p i c>h e l l o w o r l d t o p i c</ d a t a w r i t e r t o p i c> </ d a t a w r i t e r> </ p u b l i s h e r> <s u b s c r i b e r name="subscriber1"> <i n s t a n c e s>1</ i n s t a n c e s> <d a t a r e a d e r name="reader1"> <d a t a r e a d e r t o p i c>h e l l o w o r l d t o p i c</ d a t a r e a d e r t o p i c> <l i s t e n e r>D D S S t r i n g X l i s t e n e r<l i s t e n e r> <i n s t a n c e s>1</ i n s t a n c e s> </ d a t a r e a d e r> </ s u b s c r i b e r> </ p a r t i c i p a n t e n t i t i e s> </ p a r t i c i p a n t> <p a r t i c i p a n t name="participant11"> <domain id>2</domain id> <p a r t i c i p a n t e n t i t i e s> <t o p i c name="hello_world_topic2"> <topic name>Hello world2</topic name> <type>DDS StringX</type> </ t o p i c> <p u b l i s h e r name="publisher11"> <d a t a w r i t e r name="writer1"> <d a t a w r i t e r t o p i c>h e l l o w o r l d t o p i c 2</ d a t a w r i t e r t o p i c> </ d a t a w r i t e r> </ p u b l i s h e r> <s u b s c r i b e r name="subscriber11"> <d a t a r e a d e r name="reader11"> <d a t a r e a d e r t o p i c>h e l l o w o r l d t o p i c 2</ d a t a r e a d e r t o p i c> <i n s t a n c e s>5</ i n s t a n c e s> </ d a t a r e a d e r> <d a t a r e a d e r name="reader_as_reader11" base name="reader11"> </ d a t a r e a d e r> </ s u b s c r i b e r> </ p a r t i c i p a n t e n t i t i e s> </ p a r t i c i p a n t> </ a p p l i c a t i o n> <a p p l i c a t i o n name="application2"> <p a r t i c i p a n t name="participant2"> <domain id>3</domain id> <p a r t i c i p a n t e n t i t i e s> <t o p i c name="hello_world_topic3"> <topic name>Hello world3</topic name> <type>DDS Octets</type> </ t o p i c> <s u b s c r i b e r name="subscriber2"> 105 C.2. Fichero de prueba scenario.xml <i n s t a n c e s>2</ i n s t a n c e s> <d a t a r e a d e r name="reader2"> <i n s t a n c e s>2</ i n s t a n c e s> <d a t a r e a d e r t o p i c>h e l l o w o r l d t o p i c 3</ d a t a r e a d e r t o p i c> </ d a t a r e a d e r> <d a t a r e a d e r name="reader2a" base name="reader2"> <i n s t a n c e s>3</ i n s t a n c e s> </ d a t a r e a d e r> <d a t a r e a d e r name="reader2b" base name="reader2"> <i n s t a n c e s>1</ i n s t a n c e s> </ d a t a r e a d e r> </ s u b s c r i b e r> <s u b s c r i b e r name="subscriber2a" base name="subscriber2"> </ s u b s c r i b e r> </ p a r t i c i p a n t e n t i t i e s> </ p a r t i c i p a n t> </ a p p l i c a t i o n> </dds> Listado C.2: Fichero de prueba scenario.xml 106 INDEX bison, 70 parser generator, 65 BNF, 31 sample, 88 servidor, 85 suscriber, 89 suscripción, 85 cliente, 85 Tema, 88 Topic, 88 instance, 88 sample, 88 DataReader, 89 DataWriter, 89 DDS, 2, 85 middleware, 2, 85 discovery process, 88 DTD, 33 XML, 20, 33, 65 herencia, 33, 43, 66 IDL, 32 instance, 88 instancia, 88 listener, 20, 68 middleware, 1, 11, 85 Modelo Dinámico, 17, 41, 68 Modelo Estático, 17, 38, 58, 65 muestra, 88 parser, 20 proceso de descubrimiento, 88 publicación, 85 publicación/suscripción Paradigma, 85 publisher, 89 107 INDEX 108 GLOSARIO LATEX Sistema de composición de textos. DDS DTD Data Distribution Service. Servicio de distribución de datos Document Type Definition. Definición de tipo de documento, es una descripción de estructura y sintaxis de un documento XML. GNU Gnu is Not Unix. IDE Entorno de desarrollo integrado o Integrated Development Environment en inglés Interface Definition Language. Lenguaje de especificación de interfaces que se utiliza en software de computación distribuida. IDL LALR listener LR Middleware Look-Ahead LR parser. Este tipo de analizador sintáctico que toma un sı́mbolo por delante para determinar que regla de derivación aplicar Significa oyente en inglés. En programación se refiere a objetos que se subscriben a eventos o notificaciones de un sistema. Left to right, Rightmost derivation. Este tipo de analizador sintáctico lee caracteres de izquierda a derecha, para producir derivaciones por la derecha Software encargado de abstraer la aplicación de la existencia de un entorno distribuido 109 Glosario Modelo Dinámico Modelo Estático Descripción del comportamiento de entidades DDS. Descripción de los parámetros y relaciones entre entidades DDS. parser Analizador sintáctico. Convierte el texto de entrada en otras estructuras (comúnmente árboles). UML Unified Modelling Language. Lenguaje formal empleado para el modelado en el proceso de desarrollo de software. XML Extensible Markup Language. Metalenguaje de etiquetado ampliable capaz de definir a su vez otros lenguajes. eXtensible Markup Language XML YACC 110 Yet Another Compiler Compiler. Traducido significa otro compilador de compiladores más