Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

viernes, 24 de mayo de 2013

Laboratorio 13: Simulación de redes de sensores

Buen día, para esta semana en el laboratorio de redes de telecomunicaciones se nos dio a la tarea de realizar una simulación en 3D de una red de sensores, esta publicación servirá a manera de reporte para dicha tarea.

¿Qué es una red de sensores?
La red de sensores como su nombre lo indica es una red de dispositivos con sensores que colaboran para realizar una tarea en común. Normalmente estos se distribuyen en un área especifica y se comunican por redes inalámbricas.
Muy comúnmente estas redes trabajan sobre redes Ad-hoc y cuentan con una estación base que manda los datos obtenidos fuera de la red.

Partes de la red:

  • Sensores: Monitorean un fenómeno.
  • Dispositivos nodo: Se comunican con otros nodos y mandan los datos obtenidos a la estación base.
  • Estación base: recolecta los datos y en algunas ocasiones es la único nodo con la capacidad de trasmitir los datos recolectados fuera de la red. 
  • Red inalámbrica: Para que los nodos se transmitan los datos.




[imagen obtenida de: "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlwBBViw5qawqrSI9B013VjYRHswTe5neB8VneGJx_rzSA-uODE704mHnzSG786fCCNq9wa9hO8lkXJCZt172UHj0aPWkZBoL-MYgQGH-4vCeSXRXSOkTkINAYqbJ81JVxzscxpAhTnAY/s1600/redes+de+sensores.png"]

Mi simulación
La simulación fue hecha utilizando Blender, esta es una herramienta para realizar animaciones, rendering y video juegos en 3D, esta herramienta esta hecha en Python lo cual nos permite realizar scripts para realizar nuestros proyectos.

Contexto
El supuesto escenario para la simulación es la medición de la población de un banco de peces en el océano, los nodos deberían contar con alguna clase de sensor que le permita aproximar de forma no muy exacta la cantidad de peces, la razón para utilizar la red es que teniendo mas cantidad de mediciones por nodo se puede aproximar con mas exactitud la cantidad de peces, además de que se puede abarcar mayor área en la medición de los mismos.
Los nodos son lanzados al mar desde un avión y a uno de los nodos se le dará la capacidad de guardar una gran cantidad de información, este nodo se considerara como nodo base, todos los demás nodos intentarán mandar los datos obtenidos hacía dicho nodo.
[imagen obtenida de: "http://www.la-razon.com/sociedad/asi_va_la_vida/aguas-oceano-Indico-Foto-MBLEDU_LRZIMA20130421_0005_11.jpg"]


Los nodos sensores
Los dispositivos que sirven de nodos en la red son representados por esferas azules, estos son generados utilizando scripts de Python en blender, las posiciones de los nodos se generan de forma aleatoria y el equivalente lógico durante la simulación es la clase Sensors.



El sensor base
Como ya se menciono anteriormente uno de los nodos que se lanzan al már tiene una grán capacidad para guardar la información que recolecta, este nodo es se tomá como la estación base. Una vez que los nodos establencen al menos dos conexiones con otros nodos, empieza su labor de obtener datos del  banco de peces e intentan mandar los datos obtenidos




Conexiones (gráficamente)

De manera gráfica los nodos muestran con cuales nodos han establecido conexión por medio de una linea abrillantare morada.


Batería
Cada uno de los nodos tiene un nivel de batería, esta se define en un rango de 0-100 y cada nodo tiene un método que define la cantidad de porcentaje que se le resta a la batería cada que se envía un mensaje, esta cantidad depende tanto del nodo, como de el radio de la transmisión del mensaje y  se resta aunque el mensaje no haya sido recibido por ningún  nodo, esto por que se basa en la metáfora de que si tu hablas aun y cuando nadie te escucha tu gastaste energías hablando.

Durante el envió de paquetes, la cantidad de batería para cada nodo se puede ver entre paréntesis después  de el nodo que envía el mensaje:
El nodo 1 (99.43619047618998) ha enviado paquete: {'source': 5, 'message': 'Hola, deseo establecer una conexion', 'destination': -1, 'sender': 1, 'ttl': 1} hacia el nodo: 3
En este ejemplo la batería restante sería 99.4361.

Muerte de los sensores
Cada nodo tiene un tiempo de vida definido por su batería, con cada mensaje se gasta un poco de esta, una vez que el porcentaje de batería baje a cero por ciento el nodo pasa a estado de vida muerto y no tiene capacidad para mandar mensajes o recibirlos. En la animación 3D esto se puede notar cuando el nodo pasa de su color a original a un color negro y deja de mandar mensajes a sus vecinos.


Radio de transmisión
Cada nodo tiene un radio de transmisión para sus paquetes, estos radios se modifican por la inteligencia de cada nodo y estos definen el alcance que tiene cada nodo para mandar sus mensajes físicos, si por ejemplo el radio de transmisión es 30 y el nodo más cercano esta a una distancia de 35 el mensaje no le llegara a dicho nodo en la simulación.



Protocolo de conexión
Todos los nodos tienen definido un protocolo de transmisión que deben seguir para establecer conexión con otros, esté protocolo no tiene en si ningún fin, dado que se podría establecer una conexión con las mismas capacidades sin el, pero sirve para demostrar como se pueden utilizar estos protocolos para establecer cierta confiabilidad entre nodos.

El protocolo es el siguiente:
Nodo que desea establecer conexión:
  1. "Hola, deseo establecer una conexion"
  2. " ..."
  3. "grrr"

Nodo que recibe la petición para establecer conexión:
  1. "bien espere en la linea"
  2. "turururururu"
  3. "conexion establecida :)"


Ejemplo:
El nodo 1 (99.43619047618998) ha enviado paquete: {'source': 5, 'message': 'Hola, deseo establecer una conexion', 'destination': -1, 'sender': 1, 'ttl': 1} hacia el nodo: 3
El nodo 3 (98.43619047618998) ha enviado paquete: {'source': 5, 'message': 'bien espere en la linea', 'destination': -1, 'sender': 3, 'ttl': 1} hacia el nodo: 1
El nodo 1 (99.43619047618998) ha enviado paquete: {'source': 5, 'message': '...', 'destination': -1, 'sender': 1, 'ttl': 1} hacia el nodo: 3
El nodo 3 (98.43619047618998) ha enviado paquete: {'source': 5, 'message': 'turururururu', 'destination': -1, 'sender': 3, 'ttl': 1} hacia el nodo: 1
El nodo 1 (99.43619047618998) ha enviado paquete: {'source': 5, 'message': 'grrr', 'destination': -1, 'sender': 1, 'ttl': 1} hacia el nodo: 3
El nodo 3 (98.43619047618998) ha enviado paquete: {'source': 5, 'message': 'conexion establecida :)', 'destination': -1, 'sender': 3, 'ttl': 1} hacia el nodo: 1


Adaptarse a la perdida de paquetes
Cada cliente tiene un contador de la cantidad de paquetes que se pierden tratando de iniciar una conexión, si la cantidad de intentos es incrementa, también incrementa el radio de transmisión esto con el fin de hacer mas probable de encontrar un aliado y establecer una conexión dado a la formación en la que el escuadrón se mueve.

TTL
Cada que un nodo recibe un paquete si este no dirigido hacia el,  el paquete se reenvía, esto con el fin de que el paquete inunde la red. Cada paquete tiene un valor TTL que es un contador de cuantas veces ha sido reenviado un paquete, esto con el fin de que un paquete no quede flotando en la red por una cantidad infinita de tiempo.

Ejemplo:
El nodo 4 (99.72380952380928) ha enviado paquete: {'source': 4, 'message': 'conexion establecida :)', 'destination': 0, 'sender': 4, 'ttl': 3} hacia el nodo: 1
El nodo 1 (99.45333333333285) ha enviado paquete: {'source': 4, 'message': 'conexion establecida :)', 'destination': 0, 'sender': 1, 'ttl': 2} hacia el nodo: 2
El nodo 2 (99.79619047619029) ha enviado paquete: {'source': 4, 'message': 'conexion establecida :)', 'destination': 0, 'sender': 2, 'ttl': 1} hacia el nodo: 1

En este ejemplo como se puede ver el mismo paquete es enviado por varios nodos pero es descartado cuando el contador TTL llega a cero.

Métodos de envió
Dado a diferentes pruebas que se hicieron acerca de los envíos de datos se utilizaron dos métodos de envío adaptándose a cada uno según las conexiones con otros nodos:

  • Inundación del área: Es decir cada mensaje se envía a todos los nodos que se encuentren en el radio de transmisión. Esto se lleva acabo con valores TTL muy pequeños puesto que de lo contrario se produce un reenvió de paquetes de forma recursiva y se satura la red con el envió de pocos paquetes.
  • De forma aleatoria: En este caso una vez que se han conseguido tener suficientes conexiones con otros nodos, se llego a la conclusión de que es una gran perdida de energía y tiempo mandar paquetes por inundación de área, teniendo conexiones podemos saber cuales son nuestros vecinos. Sacando ventaja de esto se envían cada paquete a un solo vecino y se reduce la cantidad de batería utilizada en transmisiones. Esto se lleva acabo con valores TTL relativamente grandes, puesto que de lo contrario los paquetes que descartan antes de llegar a su destino. 


Población de peces (Distribución Poisson)
Para la simulación los sensores miden la cantidad aproximada de la población de peces en el área que monitorean, para dicha simulación se utilizo un generador de números con distribución Poissón donde en promedio  aparecen en el área dos mil peces esto como un valor fortuito de entrada.
Una vez que los nodos establecen conexiones con otros nodos, cada nodo empieza a monitorear su zona y una vez que mida la cantidad de peces simulada, envía esta información al nodo base que siempre tiene un ID de cero.

Ejemplo:
El nodo 6 (84.16571428566118) ha enviado paquete: {'source': 6, 'message': 'Population: 2003', 'destination': 0, 'sender': 8, 'ttl': 2} hacia el nodo: 1

El nodo 8 (84.16380952375641) ha enviado paquete: {'source': 8, 'message': 'Population: 2044', 'destination': 0, 'sender': 8, 'ttl': 3} hacia el nodo: 1


El nodo 9 (71.82666666664224) ha enviado paquete: {'source': 9, 'message': 'Population: 1975', 'destination': 0, 'sender': 9, 'ttl': 2} hacia el nodo: 0

En esta parte de la simulación se muestra como los nodos ya han establecido conexiones con sus vecinos y empiezan a intentar mandar los datos que recaban al nodo base.

Conclusiones
Una de las cosas más importantes de las que me dí cuenta es como el TTL afecta demasiado el rendimiento de una red, esto puede afectar en gran medida el consumo de batería puesto que por cada que se reenvía un mensaje innecesario se gasta una cantidad de batería, esto multiplicado por la cantidad de mensajes que se mandan en una red puede ser un tener un gran costo no elegír bien un valor optimo TTL.

En la siguiente gráfica obtenida a partir de la simulación se puede ver como utilizar una variable TTL en el envío de paquetes en una red puede ser un arma de doble filo, ya que a partir de un TTL de deiz aumenta exponencialmente el número de paquetes totales enviado durante la simulación, cabe remarcar que diez es la cantidad de nodos presentes en la simulación de la cual fueron tomados los datos, por tanto un valor TTL por ninguna razón debe ser mayor que la cantidad de nodos que haya presentes en una red.
Otro problema encontrado durante la obtención de estos valores es que valores pequeños de TTL producen que haya una gran cantidad de perdida de paquetes, por lo cual mis conclusiones son que este valor de mayor que la mitad de los nodos presentes en la red y menor que el total de los nodos en la red.
Además hay que tomar muy en cuenta para definir el valor exacto en la red, la topología de la misma la cual en redes Ad-hoc es algo muy dificil de conocer.



Código (python/blender)

El archivo de blender y el código se pueden descargar desde el siguiente link:
https://dl.dropboxusercontent.com/u/20770926/sensorNetworkSimulation.tar

Resultados
En este apartado pondré los vídeos de las simulaciones y el archivo de salida con los paquetes mandados y el estado de la batería de cada nodo. Dado que los archivos de salida pueden ser demasiado extensos pondré un pedazo pequeño del archivo y el link para descargarlo.

Cada paquete enviado tiene la siguiente estructura: Nodo que lo envía, porcentaje de batería actual, el paquete enviado, y el nodo al que se envía.

Primera corrida:


Salida (solo son 5 paquetes para demostrar la estructura):
nodo: 4
El nodo 2 (32.83199999999751) ha enviado paquete: {'source': 5, 'message': 'Population: 1945', 'destination': 0, 'sender': 2, 'ttl': 1} hacia el nodo: 5
El nodo 2 (32.83199999999751) ha enviado paquete: {'source': 5, 'message': 'Population: 1945', 'destination': 0, 'sender': 2, 'ttl': 1} hacia el nodo: 9
El nodo 5 (55.29600000000492) ha enviado paquete: {'source': 5, 'message': 'Population: 1945', 'destination': 0, 'sender': 5, 'ttl': 2} hacia el nodo: 4
El nodo 4 (55.32800000000492) ha enviado paquete: {'source': 5, 'message': 'Population: 1945', 'destination': 0, 'sender': 4, 'ttl': 1} hacia el nodo: 2
El nodo 4 (55.32800000000492) ha enviado paquete: {'source': 5, 'message': 'Population: 1945', 'destination': 0, 'sender': 4, 'ttl': 1} hacia el nodo: 5

El link al archivo completo:
https://dl.dropboxusercontent.com/u/20770926/redeslb13/output.dat_1

Segundo corrida:


Salida (solo son 5 paquetes para demostrar la estructura):
El nodo 1 (99.90400000000001) ha enviado paquete: {'source': 0, 'message': 'Hola, deseo establecer una conexion', 'destination': -1, 'sender': 1, 'ttl': 1} hacia el nodo: 6
El nodo 1 (99.90400000000001) ha enviado paquete: {'source': 0, 'message': 'Hola, deseo establecer una conexion', 'destination': -1, 'sender': 1, 'ttl': 1} hacia el nodo: 9
El nodo 6 (99.936) ha enviado paquete: {'source': 0, 'message': 'Hola, deseo establecer una conexion', 'destination': -1, 'sender': 6, 'ttl': 2} hacia el nodo: 9
El nodo 9 (99.936) ha enviado paquete: {'source': 0, 'message': 'Hola, deseo establecer una conexion', 'destination': -1, 'sender': 9, 'ttl': 1} hacia el nodo: 1
El nodo 9 (99.936) ha enviado paquete: {'source': 0, 'message': 'Hola, deseo establecer una conexion', 'destination': -1,

El link al archivo completo:
https://dl.dropboxusercontent.com/u/20770926/redeslb13/output.dat_2

Tercera corrida:


Salida (solo son 5 paquetes para demostrar la estructura):
El nodo 9 (99.73523809523786) ha enviado paquete: {'source': 1, 'message': 'Population: 1991', 'destination': 0, 'sender': 9, 'ttl': 2} hacia el nodo: 8
El nodo 8 (99.86095238095191) ha enviado paquete: {'source': 1, 'message': 'Population: 1991', 'destination': 0, 'sender': 8, 'ttl': 1} hacia el nodo: 1
El nodo 1 (99.53333333333292) ha enviado paquete: {'source': 1, 'message': 'conexion establecida :)', 'destination': 0, 'sender': 1, 'ttl': 3} hacia el nodo: 2
El nodo 2 (99.84190476190462) ha enviado paquete: {'source': 1, 'message': 'conexion establecida :)', 'destination': 0, 'sender': 2, 'ttl': 2} hacia el nodo: 1
El nodo 1 (99.52761904761863) ha enviado paquete: {'source': 1, 'message': 'conexion establecida :)', 'destination': 0, 'sender': 1, 'ttl': 1} hacia el nodo: 2
El nodo 1 (99.52761904761863) ha enviado paquete: {'source': 1, 'message': 'conexion establecida :)', 'destination': 0,

El link al archivo completo:
https://dl.dropboxusercontent.com/u/20770926/redeslb13/output.dat_3

Referencias:
Es.wikipedia.org (2001) Red de sensores - Wikipedia, la enciclopedia libre. [online] Available at: http://es.wikipedia.org/wiki/Red_de_sensores [Accessed: 24 May 2013].

Ortiz Tapia, F. (n.p.) REDES DE SENSORES INALÁMBRICOS. [e-book] p.1-5. http://profesores.elo.utfsm.cl/~tarredondo/info/networks/Presentacion_sensores.pdf [Accessed: 24th may 2013].

1 comentario: