2 +----------------------------+
3 | PROPUESTA DE SERVIDOR v0.3 |
4 +----------------------------+
8 Leandro Lucarella <llucare@fi.uba.ar>
14 El servidor estará dividido en 2 módulos que provean 2 servicios diferentes:
18 El módulo de control se basa en el protocolo TCP y se encarga de listar
19 los archivos de planta disponibles en el servidor, permitiendo cambiar
20 las propiedades de cada uno y conocer su estado en términos generales
21 (si se está simulando o no). Todo lo que sean comandos (abrir una
22 exclusa, parar una bomba, etc) se realizan a través de este módulo.
23 El protocolo utilizado es una implementación limitada e incompleta de
24 HTTP 1.1. Solo se implementan los métodos POST y GET, tomando solo en
25 cuenta la ruta del archivo a obtener (se ignora el 'query string' de GET
26 y los datos recibidos por POST). Cada comando se representa a través de una
27 ruta a un archivo. Si el comando recibe parámetros, estos parámetros son
28 también representados como componentes de dicha ruta.
29 A cada comando se responde con una respuesta HTTP 1.1 (también a través de
30 una implementación incompleta y limitada). El cuerpo de la respuesta es un
31 archivo XML de texto plano en formato XML que contendrá la información
32 requerida por el comando (ya sea una lista de archivos o una respuesta
33 informando el éxito o error al cambiar las propiedades de una planta).
35 Módulo de Transmisión:
36 ----------------------
37 Este módulo se encarga de transmitir la simulación en tiempo real por UDP
38 (como si fuera un video). Comienza luego de que el módulo de control recibe
39 una petición de transmisión y continúa transmitiendo (en un principio)
40 hasta que recibe una petición de desconexión.
41 Lo que se envía es un archivo XML con el estado de la planta.
42 El cliente debe validar lo recibido y mostrar todos los 'frames' válidos.
43 Mientras que no se reciban 'frames' válidos se debe mostrar el último
44 válido. Si no se recibiece durante una cantidad de tiempo determinada ningún
45 'frame' válido, se asume un error en la red.
46 Si por casualidad los datos recibidos son incorrectos pero válidos (por
47 ejemplo, se recibe el comienzo de un 'frame' y el final del siguente), el
48 cliente lo mostrará igual porque no tiene forma de darse cuenta. Esto no es
49 problema si consideramos que en pocos milisegundos se recibirá un nuevo
50 'frame' válido y correcto (similar a lo que pasa en transmisiones de audio o
51 video en tiempo real).
54 Descripción de los comandos para el módulo de control:
55 ======================================================
57 Todos los comandos son rutas de archivos. En un principio no se van a utilizar
58 los 'query string' de los datos pasados por GET ni datos adicionales pasados
59 por POST. Es decir, de un 'request' HTTP solo se usara la ruta para codificar
60 los comandos. Ejemplo: GET /ruta/que/representa/comando?query=string HTTP/1.1
61 '----------------------------'
62 Este es el comando que entendera el servidor. La presencia de un 'query string'
63 será ignorada, al igual que datos enviados por POST, silenciosamente (sin
66 Todos los comandos son respondidos con una respuesta XML que *siempre* incluye
67 un código de éxito/error. Adicionalmente puede devolver más datos en la
68 respuesta en cuyo caso se especifica expresamente.
72 Los comandos se tiene una estructura general compuesta por 3 elementos:
73 - Destino: A quien se le envía el comando.
74 - Comando: El comando en sí (la acción a realizar).
75 - Argumentos: Opciones y datos necesarios para ejecutar el comando.
76 Esto se estructura como una ruta, por lo que todos los comandos se componen la
77 menos de 2 'directorios' anidados, con cero o más argumentos representados a su
78 ves por archivos o más subdirectorios:
79 /<destino>/<comando>/<argumento 1>/<argumento 2>/<...>/<argumento N>
81 Los destinos disponibles serán:
82 - server: Comandos para el servidor en sí.
83 - plant: Comandos para las plantas.
84 - transmission: Comandos para las transmisiones (el módulo de transmisión).
86 Comandos para el servidor:
87 --------------------------
88 Los comandos para el servidor, como se vio previamente, comienzan con /server/
89 seguido de alguna de las siguientes opciones.
91 Comando | Descripción | Respuesta
92 ---------+------------------------+---------------------------------------------
93 status | Obtiene estado general | Cantidad de plantas, conexiones,
94 | del servidor. | transmisiones, versión, uptime, etc.
95 ---------+------------------------+---------------------------------------------
97 Comandos para una Planta:
98 -------------------------
99 Todos los comandos de plantas comienzan con /plant/ y continúan con alguna de
100 las siguientes opciones:
102 Comando |Descripción |Respuesta
103 ---------------+-----------------------------+----------------------------------
104 list |Obtiene lista de plantas. |Lista de plantas con info mínima
105 | |de cada una (está corriendo o no,
106 | |uptime, cantidad de elementos,etc)
107 ---------------+-----------------------------+----------------------------------
108 get/<planta> |Obtiene la planta de |El mismo archivo que se crea en el
109 |nombre <planta>. |Constructor.
110 ---------------+-----------------------------+----------------------------------
111 start/<planta> |Comienza la simulación de la |Nada.
112 |planta de nombre <planta>. |
113 ---------------+-----------------------------+----------------------------------
114 stop/<planta> |Finaliza la simulación de la |Nada.
115 |planta de nombre <planta>. |
116 ---------------+-----------------------------+----------------------------------
117 set/<planta> |Cambia la propiedad <prop> |Nada (a ver si no retorna el valor
118 /<elem> |del elemento <elem>, |realmente aceptado).
119 /<prop> |asignándole el valor <v> a |
120 /<v> |planta de nombre <planta>. |
122 NOTA: Los nombres entre "<" y ">" denotan un argumento.
124 Comandos para una Transmisión:
125 ------------------------------
126 Todos los comandos de transmisiones comienzan con /transmission/ y continúan con
127 alguna de las siguientes opciones:
129 Comando |Descripción |Respuesta
130 -------------------+-----------------------------------------+------------------
131 list |Obtiene una lista de las las |Lista de transmi-
132 |transmisiones activas. |siones activas
135 -------------------+-----------------------------------------+------------------
136 start/<host>/<port>|Comienza la transmisión al <host> en el |Nada.
137 |puerto al <host> en el puerto <port>. |
138 -------------------+-----------------------------------------+------------------
139 stop/<host>/<port> |Finaliza la transmisiónal <host> en el |Nada.
140 |puerto <port>. Si se omite el <host>, se |
141 |finalizan todas las transmisiones. |
143 NOTA: Los nombres entre "<" y ">" denotan un argumento.
146 Descripción de los comandos para el módulo de control:
147 ======================================================
149 Todas las respuestas consisten de un archivo XML con esta forma (falta hacer la
151 <plaqui version="0.1">
152 <response code="[código]" />
154 El código es obligatorio e informará si el comando se realizó con éxito y en
155 caso de no hacerlo, indicará la razón (los códigos faltan definirlos, pero usar
156 un esquema similar a los códigos de HTTP sería un buen comienzo).
157 La respuesta también puede tener otros contenidos (listado de plantas,
158 conexiónes, transmisiones, descripción de una planta completa, etc). Dichos
159 contenidos irán contenidos en el tag response:
160 <plaqui version="0.1">
161 <response code= "[código]">
164 <prop name="[nombre1]" value="[valor1]" />
165 <prop name="[nombre2]" value="[valor2]" />
169 <prop name="[nombre1]" value="[valor3]" />
170 <prop name="[nombre2]" value="[valor4]" />
177 TODO: Ver si la lista va dentro o fuera del tag <response>, ver si el tag
178 <plaqui> está bien, es útil y correcto.
181 Características adicionales (a desarrollar si el tiempo lo permite):
182 ====================================================================
184 Hojas de estilo XSLT:
185 ---------------------
186 Es factible crear hojas de transformación de XML a HTML para enviar con las
187 respuestas XML del módulo de control, de forma tal que pueda controlarse la
188 planta desde un navegador web que soporte esto (como Mozilla).
189 Las hojas de estilos estarían en la ruta /web, al igual que imágenes y otros
190 archivos complementarios.
192 Módulo de Transmisión sobre TCP:
193 --------------------------------
194 Opcionalmente se puede hacer un Módulo de transmisión sobre TCP, que sólo envíe
195 el estado actual de la planta en ese instante y se desconecte, o directamente
196 implementarlo como un comando del módulo de control para poder verlo en un
197 navegador web. Aunque esto ya sería más un cliente que un servidor.
199 'keep-alive' para el Módulo de Transmisión:
200 -------------------------------------------
201 En el futuro se puede agregar una respuesta de tipo 'keep-alive' para que el
202 transmisor UDP deje de transmitir a un host si no recibe una señal del receptor
203 cada una cantidad de tiempo determinada. De esta manera se evita seguir
204 transmitiendo si un cliente se cierra sin enviar el comando de fin de
205 transmisión por el Módulo de Control.
207 Envío por 'broadcast' del módulo de transmisión:
208 ------------------------------------------------
209 Es posible hacer que el comando /transmissions/start sin argumentos comience una
210 transmisión por 'broadcast' de la planta para todo aquel que quiera monitorearla
211 desde la red en la que se haga el 'broadcast'.
215 Se trata de 'alias' de comandos. Por ejemplo que '/' de un estado del server
216 (/sever/status), que /plant de una lista de plantas, etc.
220 Para los comandos que requieren argumentos se podría asumir valores por defecto
221 en caso de faltar alguno.
224 vim: set et ts=4 sw=4 tw=80: