¿Qué aprenderá?

¿Qué hará?

¿Cuáles son los prerrequisitos?

Video 1. Interface de CupCarbon

Video 2.Configuración básica de scripts en los nodos (SenScript).mp4

Video 3: Configuración de detección y envío de mensajes entre nodos

Video 4: Configuración de tecnologías de comunicación WiFi, ZigBee, y Lora

Teniendo en cuenta los posibles costos en tiempo y monetarios en los que se puede incurrir para el despliegue de un Sistema IoT utilizando un número importante de nodos de sensado y/o actuación, gateways, y diferentes tecnologías de comunicación, por tanto hemos decidido abordar este capa utilizando la simulación como herramienta para el estudio del comportamiento de las tecnologías de comunicación en un sistema IoT.

Recordemos que una simulación es una representación de una situación o proceso de manera que se pueda realizar un análisis de algunas de sus características y poder aproximarse a lo que se puede esperar en una implementación en el mundo real. En el marco de este tutorial se utilizará el software CupCarbon para realizar la simulación de dos escenarios de sistemas IoT, el primero corresponde al despliegue de Sistema IoT compuesto por una red de sensores con nodos estáticos, y el segundo escenario corresponde a la creación de un Sistema IoT compuesto por una red de sensores con nodos móviles. Pero los pasos aquí descritos pueden ser aplicados a la simulación de cualquier otro contexto.

Finalmente es importante resaltar que este tutorial no tiene como finalidad enseñar el lenguaje de programación utilizado por CupCarbon (SenScript) ya que esto tomaría un tiempo importante del curso.

En este punto es importante resaltar que las prácticas fueron desarrolladas utilizando la versión 5.0 de CupCarbon; sin embargo el software utilizado puede cambiar, por tanto no se puede garantizar que al desarrollar esta práctica todo estará exactamente igual a cuando se elaboró el tutorial. Esta es una realidad que se vive en el desarrollo de los proyectos de IoT y es muy importante desarrollar la habilidad de adaptarse a estos posibles cambios; así que los invitamos a que estén preparados para buscar información adicional que les permita llevar a buen término el trabajo propuesto. El equipo docente estará pendiente para ayudarlos.

Acerca de CupCarbon

Teniendo en cuenta que el despliegue de un Sistema IoT compuesto por un amplio número de sensores puede ser costoso y más si no se tiene certeza del posible comportamiento de las comunicaciones entre los dispositivos y con la nube, se propone el uso de los simuladores como una estrategia que permite emular el comportamiento de los sistemas de IoT, en este caso a nivel de la capa de comunicaciones, para poder determinar los parámetros y protocolos a utilizar.

Para este fin, en este tutorial se utilizará el simulador para Smart Cities y redes de sensores (WSN) llamado CupCarbon, el cual ofrece facilidades para diseñar escenarios de comunicación, movilidad y manejo de eventos naturales.

Uno de los objetivos de este simulador es ayudar a explicar visualmente los conceptos básicos de las redes de sensores y su funcionamiento; también puede servir de apoyo para probar sus topologías inalámbricas, y protocolos, entre otros.

CupCarbon ofrece dos entornos de simulación. El primer entorno de simulación permite diseñar escenarios de movilidad y generar eventos naturales como incendios y gases, así como simular redes de sensores móviles como las compuestas por vehículos y objetos voladores (por ejemplo, vehículos aéreos no tripulados). El segundo entorno de simulación representa una simulación de eventos discretos de redes de sensores inalámbricos que tiene en cuenta el escenario diseñado sobre la base del primer entorno.

A continuación se explicarán los pasos requeridos para realizar la instalación del simulador, y en la siguiente sección se dejará un enlace a una máquina virtual en la cual ya se encuentra el simulador instalado.

Instalación de CupCarbon

Como primer paso para la instalación del simulador se debe realizar la comprobación de la versión de Java instalada. Para comprobar la versión del JDK/JRE que posee actualmente escriba el siguiente comando en la ventana de comandos de su computador:

$java -version

Este comando deberá presentar en la consola la versión de java y del JDK de la cual dispone actualmente su equipo de cómputo.

En el caso de que su sistema operativo sea windows y su versión sea inferior a la 1.8, deberá realizar la instalación del JDK / JRE de acuerdo con el sistema operativo que disponga en su computador. Para tal fin ingrese al sitio de Oracle y descargue el archivo que corresponda a la arquitectura de su computador.

En el caso de que su sistema operativo sea linux y su versión inferior a la 1.8 o no tenga versión, deberá ejecutar los siguientes comandos:

sudo apt install default-jre
sudo apt install openjfx

Posteriormente instale CupCarbon en su computador. Para esto tiene dos opciones: descargar el código fuente desde el repositorio oficial o descargar el archivo .zip compilado desde la página de CupCarbon. En este punto le sugerimos realizar la descarga de la versión compilada.

Si descargó el archivo .zip, ubíquelo en la carpeta de su preferencia y realice la descompresión del archivo. En la carpeta raíz generada encontrará un archivo ejecutable llamado cupcarbon.jar, este es el archivo que permite ejecutar el simulador.

Si posee un sistema operativo Windows, abra la consola, diríjase a la carpeta que contiene el archivo y ejecute el siguiente comando:

java -jar cupcarbon.jar

Si posee un sistema operativo Linux, ejecute los siguientes comandos en el directorio donde se encuentra el ejecutable:

java --module-path /usr/share/openjfx/lib --add-modules=javafx.controls,javafx.fxml,javafx.base,javafx.media,javafx.web,javafx.swing -jar cupcarbon.jar

Por otro lado, si decide descargar el código fuente compílelo y ejecútelo en el IDE de su preferencia para Java. El archivo main de la aplicación se encuentra ubicado en el archivo src/cupcarbon/CupCarbon.java.

Con el fin de evitar errores de compilación, si su sistema operativo no es iOS le recomendamos borrar las líneas 75 a 82 que contienen los comandos específicos para la interfaz mostrada en iOS. A continuación, se encuentra el contenido de estas líneas:

String os = System.getProperty ("os.name", "UNKNOWN");
                
if(os != null && os.startsWith("Mac")) {
      macos = true;
        URL iconURL = CupCarbon.class.getResource("cupcarbon_logo.png");                java.awt.Image image = new ImageIcon(iconURL).getImage();
        com.apple.eawt.Application.getApplication().setDockIconImage(image);
}

Una vez ejecutado el programa, se abrirán dos ventanas una con la consola del programa y otra con la interfaz de usuario como se puede ver en la Figura 1.

Figura 1. Interfaz de usuario CupCarbonInterfaz de usuario CupCarbon

Nota: a pesar de que el simulador NO se cerrará si usted cierra la consola, le recomendamos mantenerla abierta dado que en esta se mostrará información importante como los logs y posibles errores durante la ejecución de las simulaciones. Así mismo, en caso de no encontrar el motivo de un error, podrá ver en la parte derecha el stacktrace del mismo y ubicarlo en el código fuente.

Máquina virtual de CupCarbon

En el siguiente enlace se encuentra disponible una máquina virtual con sistema operativo Ubuntu Linux 20.04 la cual cuenta con la versión 5.0 de Cupcarbon instalada.

La máquina virtual dispuesta debe ser ejecutada utilizando el hipervisor VMware Workstation Player.

Las credenciales de acceso a la máquina son:

Contexto de la simulación

Como consecuencia del incremento de la temperatura global, la Universidad de los Andes propuso a la Secretaría Distrital de Medio Ambiente de Bogotá un proyecto de monitoreo para la prevención de incendios forestales basados en IoT.

El proyecto consiste en una red de sensores que realizan el monitoreo de la temperatura de los cerros orientales de la ciudad y permite alertar a las estaciones de bomberos cercanas ante un cambio determinado en la temperatura de la zona. Interesada en el proyecto, la Secretaría propuso la realización de un piloto para el monitoreo del cerro aledaño a la Universidad e interactuar con la estación de bomberos de la Candelaria.

Para este piloto se propone el despliegue de una red compuesta por ocho sensores de temperatura distribuidos en la zona determinada, distribuidos de manera uniforme en el terreno, y ubicados específicamente en las copas de los árboles. Estos sensores se comunican entre ellos formando una red inalámbrica de sensores que permite propagar el mensaje hasta un nodo base ubicado en el edificio GA de la Universidad, el cual se encargará de comunicar a la estación de bomberos en caso de una alerta de incendio (ver Figura 2).

Con la finalidad de encontrar la mejor ubicación para cada uno de los nodos se propone realizar una simulación del piloto antes de realizar el despliegue de la red.

Esta imagen es un mapa con la posible ubicación de los nodos sensores y el nodo base

Figura 2. Escenario de simulación Sistema de Detección de Incendios Forestales

Configuración de la red de sensores

Para la configuración de la simulación realice lo siguiente:

  1. Cree un nuevo proyecto de la siguiente manera: Project -> new Project. Guarde el proyecto con un nombre de su elección.
  2. Crear una instancia de un nodo base en el edificio GA de la Universidad (longitud: -74.06278610229492, latitud: 4.600038288924173 ). Para esto pulse el botón "Base Station" () y pulse en el mapa donde desea agregarlo. Asimismo, una vez creado el nodo, puede seleccionarlo para cambiar la longitud y la latitud respectivas en la sección "Device Parameters". Pulse el botón "Save" () para guardar cada parámetro.

Figura 3. Menú de parámetros de los Dispositivos

  1. Desplegar cuatro nodos sensores encargados de crear la red de sensores para el monitoreo del cerro. Cada sensor debe estar acompañado de un nodo de gas con el cual se realizará la simulación de las temperaturas. Un nodo sensor es un objeto que puede detectar cualquier evento digital, enviar y recibir datos. Este también puede ser móvil.

Para esto, pulse el botón "Sensor node" () y pulse en el mapa donde desea agregarlo. Colocar un nodo de gas en el centro de cada nodo sensor usando el botón "Gas" (); este objeto requiere el uso del Generador de Eventos Naturales para generar archivos con los valores deseados. En la sección "Simulation Parameters", revise que las opciones "Mobility/Events" y "visibility" estén seleccionadas. Asegúrese de que cada nodo sensor esté al alcance de al menos otro nodo en la red. La flecha gris indica en cuál dirección se pueden enviar mensajes. Por ejemplo, en la siguiente imagen es posible enviar mensajes del sensor 6 al 7 y viceversa.

La imagen muestra dos nodos que se pueden comunicar mutuamente

Figura 4. Dos nodos que se pueden comunicar mutuamente

En la sección "Device Parameters", el parámetro "Sensor Radius" indica el radio en el que un nodo sensor puede detectar eventos. El área dentro de dicho radio se tornará amarilla, si existe un evento detectable, como se ve en la Figura 5.

La imagen muestra el radio de eventos naturales de un sensor, marcado como un círculo amarillo

Figura 5. Radio de eventos naturales de un evento

  1. Crear cuatro archivos de eventos naturales. Para tal fin utilice el generador de eventos naturales utilizando los siguientes valores: mean: 22, std: 10, period: 6 y size: 10, recuerde guardar los archivos después de generados y verificar que el primer valor de las tuplas generadas sea entero. Para esto pulse el botón "Natural Event Generator" (), asigne un nombre al archivo, asigne valor a cada parámetro, pulse el botón "Generate" y finalmente pulse el botón "Save". Al final, debería tener cuatro archivos con tuplas aleatorias como en la siguiente imagen.

La imagen muestra tuplas de valores generados aleatoriamente para un evento natural

Figura 6. Valores generados aleatoriamente para un evento natural

  1. Asignar a cada nodo de gas uno de los archivos de evento natural generado. Para esto, seleccione el sensor de gas, diríjase a "Device Parameters", seleccione un archivo de la lista en el parámetro "Natural Evt file" y pulse el botón "Save" ().

Imagen ilustrativa

Figura 7. Menú de parámetros de los Dispositivos

Para verificar si la asignación se realizó, revise si el centro del nodo cambia de color: de blanco a amarillo.

  1. Crear dos scripts en SenScript. El código fuente de los scripts es suministrado a continuación. Para esto seleccione el botón "SenScript Window" (), asigne un nombre para el script, copie y pegue el código suministrado y pulse el botón "Save".

Script para el Nodo Base

atget id id

data p "hola" id id
send p

loop
read mens
rdata mens tipo valor1 valor2
if( tipo == "alerta")
   cprint "Alerta en: longitud" valor1 ", latitud: " valor2
end

wait 100

Script para el Nodo Sensor

set ant 999

atget id id
getpos2 lonSen latSen

loop
wait 100
read mens
rdata mens tipo valor

if((tipo=="hola") && (ant == 999))
   set ant valor
   data mens tipo id
   send mens * valor
end

if(tipo=="alerta")
   send mens ant
end
delay 1000

areadsensor tempSen
rdata tempSen SensTipo idSens temp

if( temp>30)
   data mens "alerta" lonSen latSen
   send mens ant
end
  1. Asignar los scripts correspondientes a los elementos de la red. Para esto seleccione cada nodo, diríjase a "Device Parameters", seleccione el archivo respectivo de la lista en el parámetro "Script file" y pulse el botón "Save" ().
  2. Ejecutar la simulación. Esta deberá imprimir por consola los puntos donde se presentan alertas en la simulación con la longitud y latitud correspondientes.

Contexto de la simulación

Con el fin de mejorar la movilidad en la ciudad, la Universidad desea construir un sistema inteligente de parqueaderos a través de la cual se le indique a un vehículo la disponibilidad de un estacionamiento cerca de la universidad y cómo llegar a él. Para este fin se configurará una red de sensores en cada espacio de parqueo los cuales se comunicarán con un nodo base, al interior de cada parqueadero, y de esta manera se podrá identificar la cantidad de espacios de parqueo disponibles. Se pretende que este sistema pueda comunicarse con los vehículos que lo necesiten e indicarles hacia qué parqueadero pueden dirigirse según la disponibilidad.

Tres parqueaderos se sumaron a la iniciativa y permitieron instalar sensores en sus entradas como parte del primer piloto. Sin embargo, aún tienen dudas de su utilidad por lo que la Universidad quiere presentarles una simulación del funcionamiento del sistema.

La propuesta consiste en ubicar una estación base en la rotonda de la Calle 19 con Carrera 3 (Bogotá, Colombia), la cual, se comunicará con los sensores ubicados en los parqueaderos aliados. En la Figura 8 se muestran las posiciones de los sensores y la estación base; adicionalmente, hay un "automóvil" con un sensor que deberá utilizarse para la simulación.

La imagen muestra un mapa con el nodo base y los nodos parqueadero

Figura 8. Escenario de simulación Sistema de Parqueo Inteligente

Configuración de la red de sensores

Para la configuración de la simulación, usted deberá:

  1. Cree un nuevo proyecto de la siguiente manera: Project -> new Project. Guarde el proyecto con un nombre de su elección.
  2. Crear una instancia de un nodo base en la rotonda de la Calle 19 con Carrera 3 (Bogotá, Colombia).
  3. Desplegar cuatro nodos sensores, tres para los parqueaderos y uno que simule un vehículo.
  4. Configurar los id de cada uno de los nodos; el vehículo será el 5, los parqueaderos se les asignará un id del 1 al 3 y la estación base será el 4. Para modificarlos, seleccione el nodo y, en la barra lateral, en la sección "Device Parameters", cambie el id y pulse el botón "Save" ().
  5. Configurar los radios de cobertura de los sensores. Para los sensores asignados a los parqueaderos y la estación base fije un radio de 100 unidades y para el vehículo un radio de 50 unidades. Para esto, diríjase a la sección "Radio Parameters" de la barra lateral, y modifique el parámetro "Radius" de la misma manera que el id.

En este punto en la pantalla debería aparecer una configuración de la red similar a la presentada en la Figura 9 donde se puede apreciar el radio de cobertura de cada uno de los nodos.

La imagen muestra un mapa con los distintos nodos y sus radios de cobertura

Figura 9. Identificadores y radios configurados

Definir las rutas que seguirán los móviles desde la estación base (ubicada en la rotonda) hacia cada uno de los parqueaderos. Para crear una ruta, se debe marcan el punto inicial y punto final con markers () y en la barra lateral, en la sección "Market Parameters" se calcula la ruta haciendo clic sobre "Route from markers"; recuerde que si se quiere agregar marcadores adicionales a la ruta generada se puede utilizar el botón "Insert markers". A continuación, asigne el nombre de la ruta "File Name" y título "Tittle" siguiendo la nomenclatura route<n>, donde n es el id de cada parqueadero. Presione el botón "Save" para guardar la ruta y luego "Draw selected routes" para ocultarla y continuar con la creación de la siguiente ruta. Este proceso se realiza para cada parqueadero, es decir, se deben crear tres rutas en total.

  1. Definir la ruta del vehículo. Esta ruta debe terminar cerca del nodo base (rotonda), donde se iniciará el protocolo de la simulación. Esta ruta será guardada como la ruta0 y debe ser asociada al nodo que simula ser el vehículo (nodo con id igual a 5).

En este punto en la pantalla debería aparecer una configuración de la red similar a la presentada en la Figura 10, donde se muestre una línea que pasa por cada uno de los marcadores definidos en cada una de las rutas.

La imagen muestra un mapa con las rutas definidas entre los nodos

Figura 10. Rutas definidas

  1. Crear tres (3) scripts en SenScript, un script diferente para cada tipo de nodo; es decir, para los parqueaderos, el nodo central y el móvil. El código fuente de los scripts es suministrado a continuación.

Script para el Nodo Base

vec cupos 3
atget id id

data mens "cupos" id
send mens

loop
read resp
rdata resp tipo Pid valor

if(tipo=="hola")
   data mens "hola" id
   send mens Pid
end

if(tipo=="cupos")
   dec Pid
   vset valor cupos Pid
end
if(tipo =="parqueo")
   set max 0
   set parqueadero 0
   set ruta "route"
   set i 0
   while(i<3)
       vget act cupos i
       if (act>max)
           set max act
           set parqueadero i
       end
       set i i+1
   end
  
   inc parqueadero
   int w parqueadero
   conc respuesta "" "route" w

   data mens "parqueo" respuesta
   send mens Pid
end

wait 100

Script para el Nodo Parqueadero

loop

atget id id
set cupos id

loop
print id

read mens
rdata mens tipo Bid

if( tipo=="cupos")
   data mens "cupos" id cupos
   send mens Bid
end
wait 100

Script para el Nodo Vehículo

atget id id
set x 0

loop

atnd n
read mens
rdata mens tipo valor

if((tipo =="hola") && (x==0))
   set x 1
   data mens "parqueo" id
   send mens 4
else
   if ((n>0) && (x==0))
       data mens "hola" id
       send mens 4
   end
end

if (tipo =="parqueo")
   cprint valor
   route valor
end
wait 100

  1. Asignar los scripts a los elementos de red correspondientes,
  2. Ejecutar la simulación. Se debería intercambiar la información entre los parqueaderos y la base, acto seguido, el móvil iniciaría su movimiento hacía la base. Cuando el móvil se encuentre a rango del nodo base, este le asignará un parqueadero al cual puede dirigirse de acuerdo a la cantidad de cupos disponibles. Una vez se asigna el parqueadero, el móvil se dirige hacia este, terminando la simulación.

Al finalizar este tutorial, se espera que haya aprendido a realizar el despliegue de una simulación de un sistema IoT basado en redes de sensores en el software CupCarbon.

Créditos

Versión 1.0

Ramón Arias

Carlos Andrés Lozano Garzón

Autores

Kelly Garcés

Andrés Bayona

Rocío Héndez

Revisores