# Protocolo de enrutamiento RPL

RPL es un protocolo de enrutamiento para redes inalámbricas de bajo consumo de energía y típicamente susceptibles a pérdidas de paquetes. Es un protocolo proactivo basado en vectores de distancia y opera sobre IEEE 802.15.4, esta optimizado para multi-salto y comunicación muchos-a-uno, pero también soporta mensajes uno-a-uno.
Este protocolo se especifica en [RFC5867], [RFC5826], [RFC5673] y [RFC5548]. RPL puede admitir una amplia variedad de capas de enlace, incluidas aquellas con limitaciones, con pérdidas potenciales o que se utilizan en dispositivos con recursos limitados. Este protocolo puede crear rutas de red rápidamente, compartir el conocimiento de enrutamiento y adaptar la topología de una manera eficiente.

## Configuración de protocolo

RPL crea una topología similar a un árbol (DAG o grafo acíclico dirigido). Cada nodo dentro de la red tiene un rango asignado (Rank), el cual aumenta a medida que los equipos se alejan del nodo raíz (DODAG). Los nodos reenvían paquetes utilizando como criterio de selección de ruta aquella con el rango más bajo.
Se definen tres tipos de paquetes ICMPv6:
* DIS (solicitud de información del DODAG): utilizado para solicitar información de DODAG cercanos, análogo a mensajes de solicitud de enrutadores utilizados para descubrir redes existentes
* DIO (objeto de información del DAG): mensaje que comparte información del DAG, enviado como respuesta a mensajes DIS, así como utilizado periódicamente para refrescar la información de los nodos sobre la topología de la red
* DAO (objeto de actualización al destino): enviado en dirección hacia el DODAG, es un mensaje enviado por los equipos para actualizar la información de sus nodos “padres” a lo largo del DAG.

## Procesamiento de mensajes RPL

Cada nodo chequea periódicamente si conoce un DODAG, en caso negativo el nodo enviará un broadcast de mensaje DIS. Lo que hace este mensaje es solicitar información del DODAG a los nodos que lo reciban. Todo nodo que recibe un mensaje DIS, envían a la brevedad un broadcast de DIO. Notar que antes de enviar el mensaje DIO se agrega una componente de tiempo aleatoria para que no haya colisiones. Mensajes DIO Los broadcast de mensajes DIO se envían periódicamente. Publican la información sobre el DODAG. Se utiliza una lógica muy parecida a la de Trickle para minimizar la cantidad de mensajes enviados en régimen.
* Rpl global repair: el sink puede intentar reparar la red cuando hay problemas. Para esto lo que hace es reinicializar el protocolo de ruteo desde cero. Cuando se presiona el botón de usuario del nodo sink este incrementa el número de versión del DODAG. Los mensajes DIO contienen el número de versión del DODAG. Cuando un nodo recibe un mensaje DIO con un número mayor de versión de DODAG empieza a ejecutar la rutina global_repair en donde remueve a todos sus parents rpl, setea al nodo remitente como preferred parent (es el único parent que conoce hasta el momento) y se agenda enviar un mensaje DIO a la brevedad.
* Rpl local repair: cuando un nodo pierde a todos sus parents o no tienen ningún parent con un rango aceptable ejecuta la rutina rpl_local_repair. Esta rutina le setea Rank infinito al nodo, le borra todos los parents y agenda un mensaje DIO para que se envíe a la brevedad.
* Bug RPL: se descubrió un Bug en el sistema operativo Contiki en el módulo de RPL. Es importante destacar que el bug no afectaría a nuestra aplicación ContikiWSN. El bug puede producir problemas con el ruteo aguas abajo y nosotros no usamos esta funcionalidad para nuestra aplicación.

## Implementación del protocolo RPL

La implementación del protocolo RPL se da en sensores y redes inalámbricas el sistema operativo más usado para su implementación es Contiki el cual es un pequeño sistema operativo que esta desarrollado en ubuntu de código abierto desarrollado para uso en un número de pequeños sistemas pasando desde ordenadores de 8-bit a sistemas integrados sobre microcontroladores, incluyendo nodos de redes de sensores.
Este sistema trae una herramienta integrada para la simulación de redes de sensores llamada Cooja, esta permite realizar simulación a través de motas a nivel de hardware lo que facilita observar el comportamiento de cada una como también la recolección de datos para su posterior procesamiento.
Para la entender un poco más sobre la implementación en la figura 1 se muestra la jerarquía interna para el funcionamiento del protocolo a nivel de clases donde RPL-DGA.C importa otras clases como lo son las siguiente:
* LIST.H: Es la librería que proporciona algunas funciones para la manipulación de las listas enlazadas.
* CONTIKI.H: Este archivo es parte del sistema operativo Contiki.
* UIP.H: Es el archivo de encabezado de la pila uIP TCP / IP contiene definiciones para un número de macros C que utilizan los programas uIP y uIP interno.
* UIP-MCAST6.h: Este archivo de encabezado contiene directivas de configuración para IPv6 soporte de multidifusión.
* UIP-DS6-NBR.h: Caché de vecinos IPv6 (asignación de direcciones de capa de enlace / IPv6).
* CTIMER.h: El módulo de temporizador proporciona un mecanismo de temporizador que llama a una función C especificada cuando un temporizador expira.

## Instalación cooja

Es necesario descargar el sistema operativo Contiki que se puede hacer desde su página principal y la máquina virtual VMware la cual es esencial ya que el archivo tiene una extensión que sólo este programa puede abrir.
Una vez descargado y descomprimidos los archivos de los sistemas operativos Contiki y de la máquina virtual VMware Luego pasamos a ejecutar VMware e importamos al sistema operativo Contiki una vez realizado esto y que todo funcione nos pedirá una clave de inicio la cual es por defecto “user”.
Dentro del sistema operativo pasamos a ejecutar la terminal en la cual escribiremos lo siguiente:
El comando cd en ubuntu nos permite acceder a una carpeta seguido de la ruta a la cual deseamos ingresar. Una vez dentro de ella escribiremos ant run para ejecutar el Cooja como se observa en la figura 2.
Luego, comenzará un proceso de ejecución del programa lo cual terminará la pantalla principal de Cooja, tal y como lo muestra la figura 3.
En esta se aprecia todas las funcionalidades que nos ofrece este simulador como visualizar(Network), controlar(Simulation Control) y hacer seguimiento(Mote Output) a cada mota para así poder hacer pruebas a nivel de hardware y poder observar el comportamiento en tiempo real de su procesamiento.

## Simulaciones del protocolo RPL en Cooja

El sistema operativo Contiki con su simulador de red llamado Cooja. Nos permite simular motas que ejecutan aplicaciones Contiki y que se organizan en una red de sensores inalámbricos. A continuación se detallaran las funcionalidades de Cooja y se realizaran unas simulaciones que nos proporciona el mismo a nivel de hardware:
Crearemos una nueva simulación para poder utilizar las funcionalidades del programa. La creación es tal y como se muestra en la figura 4;
en éste, pondremos el nombre de Prueba1, se puede colocar cualquier nombre, pondremos ese para mayor facilidad, la figura 5 muestra el resultado de hacer lo que mencionamos luego le daremos en el botón de Create.
Al culminar la creación de la simulación, se visualizará las opciones generales que tiene el programa que permite visualizar(Network), controlar(Simulation Control) y hacer seguimiento(Mote Output) a cada mota, como se puede ver en la figura 6
Después de esto, agregaremos algunas motas a la simulación. Para este ejemplo escogeremos del tipo Sky mote, de la forma en que se muestra en la figura 7.
Una vez escogido el tipo de motes nos saldrá una ventana para seleccionar el programa que queremos simular escogeremos uno de los ejemplos que Cooja trae, en este caso será el protocolo RPL debemos buscar el archivo en la siguiente ruta
y seleccionar el archivo “broadcast-example.c”, como se aprecia en la figura 8.
Seguido presionamos el botón de open y volveremos a la ventana de la figura 7 pero esta vez ya estará la ruta del archivo el cual vamos a simular paso siguiente es darle a compilar y seguido al botón de “create” como se muestra en la figura 9.
El simulador luego de darle en el botón “create” nos pedirá que indiquemos el número de motas a cada una se les compilara y cargará el mismo protocolo RPL y si se desea ubicar de manera (aleatoria, lineal, elíptica o manual) Figura 10.
en este caso escogeremos el modo aleatorio, seguido presionamos en el botón de “add motes” Figura 11.
Luego de indicar el número de motas que queremos simular estas se mostraran en el plugin de “Network” y para iniciar nos dirigimos al control de simulación dándole click en el botón Start el resultado de esta simulación se aprecia en la figura 12. En el plugin de Red(Network), podrás encontrar varias opciones de análisis que te ayudarán a conocer y entender lo que está pasando en tiempo real.

## Otros Sistemas Operativos

El protocolo RPL se puede simular en otros sistemas operativos como lo son:
* LiteOS: Es una edición del ZorinOS sistema operativo pensado para computadoras de bajo recursos, desarrollado en principio para calculadoras, pero que ha sido también utilizado para redes de sensores.
* TinyOs: Fue el primer sistema operativo orientado a las WSN, trabajo por medio de eventos y tareas guiadas y usa una extensión del lenguaje C, llamado nesC. TinyOS hace llamados a los eventos apropiados y realiza la ejecución lo cual es soportado por nesC que tiene como función que a su vez determina prioridades entre tareas y eventos.
* T-Kernel: Es un sistema operativo que acepta las aplicaciones como imágenes de ejecutables en instrucciones básicas. Por ello, no importará si está escrito en C++ o lenguaje ensamblador.
* EyeOS: Se define como un entorno para escritorio basado en Web, permite monitorizar y acceder a un sistema remoto mediante un sencillo buscador.
* FreeRTOS: Es un sistema operativo en tiempo real de código abierto cuyo kernel es totalmente gratuito y esta implementado en el lenguaje de programación C en su mayoría.