¿Qué aprenderá?
¿Qué hará?
¿Cuáles son los prerrequisitos?
Teniendo en cuenta los posibles costos en tiempo y monetarios en los que se puede incurrir para el despliegue de un sistema IoT que utiliza 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 capítulo 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 modo que se puedan analizar algunas de sus características y 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 aplicarse 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 ello requeriría un tiempo considerable 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; por ello, los invitamos a estar preparados para buscar información adicional que les permita llevar a buen término el trabajo propuesto. El equipo docente estará pendiente para ayudarlos.
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, que ofrece facilidades para diseñar escenarios de comunicación, movilidad y gestión 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 simula eventos discretos de redes de sensores inalámbricos y tiene en cuenta el escenario diseñado a partir del primer entorno.
A continuación se expondrán varias alternativas para instalar cupcarbon, escoja la que mejor le convenga: cupcarbon sobre máquina personal, cupcarbon sobre Docker, cupcarbon sobre máquina virtual.
Cupcarbon sobre máquina personal Windows
Como primer paso para la instalación del simulador, se debe comprobar 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á mostrar en la consola la versión de Java y del JDK que actualmente dispone su equipo de cómputo.
En caso de que su versión sea distinta de la 23 o 24 del JDK, deberá instalar el JDK/JRE de acuerdo con el sistema operativo que utilice en su computador. Para tal fin, ingrese al sitio de Oracle y descargue el archivo correspondiente a la arquitectura de su computador.


Posteriormente, deberá descargar el el archivo .zip correspondiente con su arquitectura de windows del repositorio oficial de cupcarbon

A continuación, deberá descomprimir el archivo .zip descargado. Dentro de la carpeta resultante deberá encontrar los siguientes archivos:

Por último, para ejecutarlo, deberá hacer doble clic en el archivo cupcarbon_win.bat que se encuentra dentro de los archivos. En caso de que aparezca una advertencia de ejecución, se deberá seleccionar la opción "Ejecutar". Esto iniciará el aplicativo de cupcarbon:

Cupcarbon sobre máquina personal Linux
Nota: estos pasos son similares a los pasos sobre SO Mac.
Como primer paso para la instalación del simulador, se debe comprobar 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

En caso de que su versión sea distinta de la 23 o 24 del JDK, deberá instalar el JDK/JRE de acuerdo con el sistema operativo que utilice en su computador. Para tal fin, ingrese al sitio de Oracle y descargue el archivo correspondiente a la arquitectura de su computador.
Posteriormente, deberá descargar el el archivo .zip correspondiente con su arquitectura de linux del repositorio oficial de cupcarbon

A continuación, deberá descomprimir el archivo .zip descargado. Dentro de la carpeta resultante deberá encontrar los siguientes archivos:

Por último, para ejecutarlo deberá situarse dentro de la carpeta descomprimida anteriormente en una terminal. A continuación, deberá ejecutar los siguientes comandos:
$ MP="$(pwd)/linuxx/lib"
$ export LIBGL_ALWAYS_SOFTWARE=1
$ export GDK_BACKEND=x11
$java -Dprism.order=sw -Djavafx.platform=gtk -Dglass.platform=gtk --module-path "$MP" --add-modules javafx.controls,javafx.fxml,javafx.swing -jar cupcarbon.jar

Cupcarbon sobre contenedor Docker
Como primeros pasos se deberá instalar docker y luego descargar en su equipo el archivo cupcarbon_docker.zip dispuesto en el siguiente enlace. Descomprima el zip y verifique que se vea el siguiente contenido:

A continuación, se deberá hacer el build del contenedor. Para esto se necesita abrir una consola y en la ubicación de la carpeta resultante de la descompresión se ejecutará el siguiente comando
docker build --no-cache -t cupcarbon:novnc .

A continuación, se debe ejecutar el siguiente comando para exponer los puertos a los que accederá el cliente de vnc mediante el navegador. Recuerde modificar la variable de entorno VNC_PASSWORD a una clave que recuerde esta es la que va a usar en vnc para ingresar
docker run -it --rm -p 6080:6080 -p 5901:5901 -e VNC_PASSWORD="ClaveSegura123" cupcarbon:novnc


Por último, se deberá abrir un navegador y acceder a la urlhttp://localhost:6080/vnc.html . En esta nos pedirá que nos conectemos a VNC e ingresemos una contraseña, la cual colocamos en el paso anterior en las variables de entorno. Como resultado, tendremos el contenedor con cupcarbon corriendo.


CupCarbon sobre máquina virtual
En el siguiente enlace se encuentra disponible una máquina virtual con Ubuntu Linux 24.04, que cuenta con la versión 7.2 de Cupcarbon instalada.
La máquina virtual debe ejecutarse con el hipervisor VMware Workstation.
Las credenciales de acceso a la máquina son:
Adentro encontrarán un archivo bash llamado start.sh el cual ya está configurado para iniciar cupcarbon. Deberán ejecutar el siguiente comando para poder ejecutar el cupcarbon
./start.sh
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 monitorea 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 realizar 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 nodo, se propone realizar una simulación del piloto antes del despliegue de la red.

Figura 2. Escenario de simulación Sistema de Detección de Incendios Forestales
Para la configuración de la simulación realice lo siguiente:

) 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
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 qué dirección se pueden enviar mensajes. Por ejemplo, en la siguiente imagen es posible enviar mensajes del sensor 6 al 7 y viceversa.

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.

Figura 5. Radio de eventos naturales de un evento
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.
Figura 6. Valores generados aleatoriamente para un evento natural
). 
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.
), asigne un nombre al script, copie y pegue el código suministrado y pulse el botón "Save".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
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
). Con el fin de mejorar la movilidad en la ciudad, la Universidad desea construir un sistema inteligente de parqueaderos mediante el 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 ubicado al interior de cada parqueadero, y así se podrá identificar la cantidad de espacios de parqueo disponibles. Se pretende que este sistema pueda comunicarse con los vehículos que lo requieran 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 sobre 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), que se comunicará con los sensores ubicados en los parqueaderos aliados. En la Figura 8 se muestran las posiciones de los sensores y de la estación base; adicionalmente, se muestra un "automóvil" con un sensor que deberá utilizarse para la simulación.

Figura 8. Escenario de simulación Sistema de Parqueo Inteligente
Para la configuración de la simulación, usted deberá:
).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 nodo.

Figura 9. Identificadores y radios configurados
Definir las rutas que seguirán los móviles desde la estación base (ubicada en la rotonda) hasta cada uno de los parqueaderos. Para crear una ruta, se deben indicar tanto el punto inicial como el punto final con marcadores (
) y, en la barra lateral, en la sección "Market Parameters", se calcula la ruta haciendo clic en "Route from markers"; recuerde que, si se quiere agregar marcadores adicionales a la ruta generada, puede utilizar el botón "Insert markers". A continuación, asigne el nombre de la ruta "File Name" y el título "Title" 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.
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 atraviese cada uno de los marcadores definidos en cada una de las rutas.

Figura 10. Rutas definidas
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
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
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
Al finalizar este tutorial, se espera que haya aprendido a desplegar una simulación de un sistema IoT basado en redes de sensores en el software CupCarbon.
Ramón Arias Carlos Andrés Lozano Garzón | Autores |
Kelly Garcés Andrés Bayona Rocío Héndez | Revisores |