La siguiente práctica fue realizada por el estudiante Pablo Muñoz, de la materia de Internet de las Cosas, correspondiente a la carrera de Ingeniería en Telecomunicaciones de la Universidad Técnica del Norte.
En este proyecto, el objetivo es implementar un sistema IoT que incluirá un servicio en la nube de cloud computing y una aplicación web. Para lograrlo, construiremos una estación ambiental virtual en Amazon Web Services (AWS) que simulará diferentes tipos de sensores (temperatura, humedad, altura de lluvia, dirección e intensidad del viento) mediante el emulador nativo de RIOT-OS. Los datos recopilados se enviarán a una base de datos a través de un brocker MQTT y serán almacenados en la DynamoDB, que finalmente se lograrán monitorear desde un sitio web
Enlaces útiles:- Configuración SSH
- Obtener y Compilar Firmware
- Tutorial IPv6 IoT-LAB
Primero debe crear una cuenta en IoT-LAB, luego es necesario instalar una distribución de Linux, en la cual se trabajará todo lo mencionado en este proyecto, en este caso usaremos VMware Workstation PRO 16, para más información, consulte aquí.
Luego cree e instale una máquina virtual Kali-Linux. Posteriormente, realice la configuración de acceso SSH en la máquina, para ello se seguirá la guía de configuración SSH de IoT-LAB.
Configuración SSH de IoT-LABIngrese mediante SHH a su cuenta de IoT-LAB, en este caso se va trabajar con nodos OpenMoteB y un nodo A8, para lo cual consulte aquí los nodos con los que es posible realizar experimentos y en que servidor se encuentra ubicado.
Para este caso se va experimentar con OpenMoteB y A8-M3, los cuales estan ubicados en el servidor Strasbourg.
Una vez teniendo esa información, ingrese mediante SHH a su cuenta de IoT-LAB, intercambie <login> por su usuario de Iot_LAB.
user@pc: ssh <login>@strasbourg.iot-lab.infoRealizada la conexión clone el repositorio de IoT-LAB
login@strasbourg: git clone https://github.com/iot-lab/iot-lab.gitIngrese al directorio /iot-lab y configure el entorno de desarrollo Iot-LAB
login@strasbourg: cd iot-lab
login@strasbourg: make
Welcome to the IoT-LAB development environment setup.
targets:
setup-wsn430
setup-openlab
setup-contiki
setup-riot
setup-cli-tools
setup-aggregation-tools
pullInstale RIOT
make setup-riotCreación de los nodos en IoT-LABPrimero elegimos un nombre de nuestro proyecto y damos la duración que este tendrá.
Después de establecer el nombre y la duración del proyecto, pasamos a la selección de los nodos necesarios para llevar a cabo la práctica. En este sentido, es necesario adquirir los siguientes dispositivos:
- 1 Nodo A8-M3
- 3 Nodos OpenMote-B
Seguidamente elegiremos los nodos que deseamos para este caso serán los nodos de OpenMote-B 26, 25 y 27 del servidor Strasbourg y un Nodo A8
Por último, se genera e inicia el experimento, lo que permite al usuario acceder a las funcionalidades del nodo.
Primero debemos acceder a través del terminal por ssh a la cuenta personal creada previamente en el sitio web de Fit IoT-LAB en el siguiente enlace: https://www.iot-lab.info/. Para lo cual es necesario ingresar el nombre de usuario correspondiente a la cuenta de Fit IoT-LAB enlazada.
A continuacion, cambiamos el directorio de ejemplos proporcionado por FIT IoT-LAB correspondiente a border router, para posteriormente seleccionar la fuente del sistema operativo e implementar el comando make en donde se especifica el canal y placa a implementar para obtener un archivo. elf
cd iot-lab/parts/RIOT/examples/gnrc_border_router
source /opt/riot.source
make ETHOS_BAUDRATE=115200 DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b clean allLuego, se debe proceder a flashear (es decir, subir) el archivo.elf proporcionado anteriormente en el nodo designado como Border Router en el dispositivo OpenMote-B
Una vez que se haya cargado correctamente el firmware en el nodo designado, se procede a volver a Kali Linux (en nuestro caso). Desde aquí, ejecutamos el script de Python llamado "ethos_uhcpd.py", en el cual se especificará el nodo, la interfaz y la dirección de red IPv6 que será propagada por el router de borde. En caso de no saber el rango de prefijos, se recomienda visitar el siguiente enlace: "IPv6 - FIT IoT-LAB".
Para obtener el firmware necesario para flashear las 2 estaciones que se implementará, al igual que en el Router de borde, primeramente, es necesario acceder por shh a la cuenta personal de FiT IoT-LAB, para posteriormente clonar el repositorio del usuario Francesco31Ott, el cual es un estudiante de Sapienza University of Rome y posteriormente copiar el directorio emcute_MQTTSN, a nuestro directorio de ejemplos de RIOT.
<user>@<local-machine>:~$ ssh <login>@strasbourg.iot-lab.info
<login>@strasbourg.iot-lab.info:~$ git clone https://github.com/Francesco31Ott/InternetOfThings19-20.git
<login>@strasbourg.iot-lab.info:~$ cd InternetOfThings19-20/SecondAssignment
<login>@strasbourg.iot-lab.info:~$ cp -r emcute_MQTTSN/ /senslab/users/<user>/iot-lab/parts/RIOT/examples/
<login>@strasbourg.iot-lab.info:~$ cd iot-lab/parts/RIOT/examples/parts/RIOT/examples/Una vez realizado el paso anterior, procedemos a compilar los clientes MQTTSN los cuales nos van a permitir obtener los datos ambientales, vamos a flashear el archivo.elf con los otros dos nodos openmote-b restantes.
- Estación 1
<login>@strasbourg.iot-lab.info:~$ cd iot-lab/parts/RIOT/examples/parts/RIOT/examples/emcute_MQTTSN
<login>@strasbourg.iot-lab.info:~$ source /opt/riot.source
<login>@strasbourg.iot-lab.info:~$ make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station1 clean all- Estación 2
<login>@strasbourg.iot-lab.info:~$ cd iot-lab/parts/RIOT/examples/parts/RIOT/examples/emcute_MQTTSN
<login>@strasbourg.iot-lab.info:~$ source /opt/riot.source
<login>@strasbourg.iot-lab.info:~$ make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station2 clean allModulación MR-FSK
Actualmente, se está llevando a cabo la modulación FSK con ciertos parámetros específicos. Es crucial destacar que estos parámetros deben ser configurados en todos los nodos en el modo de operación 1. Para llevar a cabo esta configuración, es necesario acceder a la consola del nodo y utilizar las siguientes líneas de código.
Nota: Este proceso se le aplica a los dos nodos correspondientes a las estaciones y tambien al router de borde.
nc openmoteb-<numero de nodo> 20000
ifconfig 6 set phy_mode MR-FSK
ifconfig 6 set modulation_index 1
ifconfig 6 set modulation_order 2
ifconfig 6 set channel_spacing 200
ifconfig 6 set chan 10
ifconfig 6 set srate 50Ingreso al nodo designado como estación 1.
Ingreso al nodo designado como estación 2.
Ingreso al router de borde
Modulación O-QPSK
El proceso de modulación O-QPSK sigue los mismos pasos que en los pasos anteriores, pero requiere de comandos diferentes. Es fundamental tener en cuenta que se debe acceder a cada nodo antes de ingresar los comandos correspondientes. De esta manera, se asegura que la configuración se realice de manera adecuada.
nc openmoteb-<numero de nodo> 20000
ifconfig 6 set phy_mode MR-O-QPSK
ifconfig 6 set chip_rate 100
ifconfig 6 set rate_mode 1- Estación 1
- Estación 2
- Border Router
ModulaciónOFDM
Para configurar la modulación OFDM, es necesario ejecutar los siguientes comandos. Es importante conectarse previamente al nodo correspondiente a través de una conexión SSH, utilizando el primer comando e indicando el número del nodo al que se desea acceder. De esta manera, se asegura una correcta configuración de la modulación OFDM.
nc openmoteb-<numero de nodo> 20000
ifconfig 6 set phy_mode MR-OFDM
ifconfig 6 set option 1
ifconfig 6 set modulation_order 2
ifconfig 6 set scheme 0- Estación 1
- Estación 2
- Border Router
Pruebas de convergencia
Se realizan pruebas de convergencia para asegurar la conexión entre dispositivos y la correcta configuración.
Configuración del Broker MQTT-SN
El nodo A8 es el más adecuado para implementar el Broker, ya que es capaz de correr Mosquitto RSMB de manera eficiente. Este dispositivo es fundamental para el funcionamiento del sistema IoT, ya que recibe los datos de las estaciones virtuales y los envía a los servicios AWS.
Para configurar el Broker, es necesario ingresar mediante SSH al nodo A8. En el dashboard, no es posible acceder por interfaz, por lo que se debe utilizar la terminal de Kali Linux para ingresar al nodo. Una vez dentro, se valida la dirección IPv6 global para continuar con el proceso de configuración del Broker.
$ ssh root@node-a8-<ID>Una vez que se verifica la dirección IP es necesario copiarla para luego poder iniciar las estaciones, primero para iniciar el broker se debe crear el siguiente archivo:
vim config.confY dentro del archivo se debe colocar el siguiente texto en el que se define la comunicación MQTT que se va a desarrollar.
# add some debug output
trace_output protocol
# listen for MQTT-SN traffic on UDP port 1885
listener 1885 INADDR_ANY mqtts
ipv6 true
# listen to MQTT connections on tcp port 1886
listener 1886 INADDR_ANY
ipv6 trueA continuación se procede a ejecutar los archivos considerando orden, en primer lugar el broker, en segundo lugar la estación 1 y luego la estación dos con los siguientes comandos, se debe aclarar que cada una debe tener la conexión SSH abierta en un terminal diferente para que funcionen en simultáneo.
Broker: broker_mqtts config.conf
Estación 1: start <Direc. IPv6 global de la placa A8> 1885 1
Estación 2: start <Direc. IPv6 global de la placa A8> 1885 2Para mejorar el control de acceso a los recursos de AWS, se recomienda crear un usuario IAM. Para configurarlo, se debe acceder a la opción "Mi cuenta" en la parte superior del panel y luego seleccionar "Acceso a los usuarios" y "Roles IAM". Luego, se debe marcar la opción "Activar el acceso IAM" y presionar "Actualizar" para guardar los cambios realizados. De esta manera, se puede asegurar un mejor control de acceso a los recursos de AWS.
Procedemos a generar un nuevo usuario en servicios IAM, en la siguiente captura se indicará las opciones que se debe marcar para la creación del usuario y por último solo le daremos en finalizar.
Para continuar con el proceso de interacción con las estaciones y el cliente suscriptor, es necesario crear un objeto IoT. Para ello, se debe acceder al servicio de AWS llamado IoT Core, dirigirse a la sección de Administración y seleccionar la opción de Objetos. Luego, se debe hacer clic en el botón de Crear objeto y seguir los pasos que se indican en el proceso de creación. De esta manera, se podrá tener un mejor control y gestión de los recursos en AWS.
Antes de terminar de generar el objeto se deben descargar todos los certificados y archivos de claves que aparecen en una ventana emergente, solo se lo puede hacer en ese momento.
En la misma página, accedemos a la sección de seguridad y buscamos el apartado de "Políticas". Aquí creamos una nueva política, asignándole un nombre y configurando la acción y el recurso de la política, utilizando el carácter * para indicar cualquier valor. Una vez creada la política, procedemos a marcar todos los certificados generados en la sección correspondiente y seleccionamos la opción de "Asociar política" en el menú de acciones. Asociamos la política que creamos anteriormente a los certificados seleccionados.
Para crear la tabla en DynamoDB, se debe seguir los siguientes pasos:
- Ingresar al servicio de AWS llamado DynamoDB.
- En la pestaña "Tablas", hacer clic en el botón "Crear tabla".
- Escribir un nombre para la tabla.
- Elegir una clave de partición y, si se desea, una clave de ordenamiento.
- Especificar la capacidad de lectura y escritura de la tabla.
- Hacer clic en el botón "Crear tabla".
Una vez creada la tabla, se pueden definir los atributos y valores para cada registro de la estación meteorológica.
Es imprescindible realizar el proceso de conexión entre AWS y un terminal Linux, para lo cual se debe acceder a la sección de "Credenciales de seguridad" del panel de control del usuario (en este caso, Keneth Santiago Juma), y posteriormente crear una clave de acceso mediante la opción "Crear una clave de acceso" en la sección "Claves de acceso". Una vez creada la clave, se descarga un archivo.csv que contiene tanto el keyID como el Access keyID, los cuales son necesarios para configurar la máquina virtual Linux y establecer la conexión con AWS.
Para llevar a cabo este proceso, se requiere abrir una nueva sesión SSH en el nodo que actualmente está ejecutando el bróker.
<login>@strasbourg:~$ ssh root@node-a8-<nodo>A continuación, se clona el repositorio de Francesco Ottaviani en el dispositivo estudiante de Sapienza Università di Roma.
Dentro del directorio SecondAssignment, es necesario crear una carpeta específica para almacenar los certificados necesarios (como el certificado de AWS, archivos de clave pública y privada, obtenidos luego de haber creado el objeto en AWS IoT-Core).
Se debe crear un repositorio en GitHub para guardar en él los certificados de AWS y luego clonar ese repositorio en el nodo a8.
A continuación, se desplaza hasta el directorio client_MQTTSN para localizar el archivo que, a través de código Python, va a hacer la conexión hacia AWS.
root@node-a8-<nodo>:~# vim MQTTNSNbridge.pyDespués de finalizar la creación del directorio de certificados, es importante instalar la librería de boto3 para asegurar el correcto funcionamiento del script. Es recomendable asignar una ruta de instalación diferente a la predeterminada para evitar errores de falta de espacio en el dispositivo.
root@node-a8-<nodo>:~# TMPDIR=/ pip3 install --cache-dir=/ --build / boto3En este punto del proceso, es necesario realizar la instalación del kit de desarrollo AWSIoTPythonSDK, el cual está diseñado para establecer una conexión entre AWS IoT y un dispositivo mediante el uso de Python. Asimismo, es importante proceder a instalar la CLI de Amazon en un directorio específico, en el que se almacenarán los archivos de credenciales y configuración necesarios para su correcto funcionamiento.
# pip3 install AWSIoTPythonSDK
# mkdir -p ~/.aws
# cd ~/.aws
# touch config credentials
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# unzip awscliv2.zip
# ./aws/installUna vez instalados los paquetes anteriores, se procede a editar los ficheros config y credentials con el editor vim.
# cd ~/.aws
# vim configLo mismo se hace con el archivo que almacena las credenciales (se extraen del archivo rootkey.csv obtenido desde AWS):
[default]aws_access_key_id=<your-access-key-id>aws_secret_access_key=<your-aws-secret-access-key>
# vim credentialsConfiguración de grupo de identidades en AWS Cognito
Para adaptar el sitio web y permitir la interacción con servicios de AWS como DynamoDB, es necesario seguir un paso importante: la creación de un grupo de identidades. Para esto, se debe acceder a la plataforma de AWS y dirigirse a la sección de Servicios. Luego, seleccionar la opción de Cognito y entrar en la administración de grupos de identidades.
Se busca crear un nuevo grupo de identidades, se especifica el nombre del grupo (WeatherInfoAccess en este caso) y se marca la casilla Habilitar el acceso a identidades sin autenticar, esto para permitir el acceso a usuarios que no necesariamente estén registrados para poder acceder a la información de las estaciones meteorológicas desplegada en la web.
A continuación, Cognito solicita asociar el grupo de identidades a dos roles de IAM, uno para identidades autenticadas y otro para identidades sin autentificar. Los roles se crean en esa misma ventana y se puede dejar los nombres por defecto. Al final se da clic en Permitir
Antes de configurar el sitio web, se debe hacer un paso adicional: Asociar al rol de identidades no autenticadas (en este caso Cognito_WeatherInfoAccessUnauth_Role) a la política AdministratorAccess, dado que los usuarios que van a visualizar no hacen ninguna autentificación. Esto se hace en la consola de IAM, en la parte de Roles, allí se selecciona el rol en cuestión y clic en Asociar políticas.
Configuración de Apache Web Server una instanciaUbuntu de AWS
Una vez que se haya finalizado el proceso de Amazon Cognito, el siguiente paso será implementar el panel de presentación de datos en una página web alojada en una instancia de AWS, este enlace indica el proceso de como obtener una instancia con un sistema operativo Ubuntu 18.04 enlace.
Posteriormente, es necesario iniciar sesión con las llave otorgada por Amazon en un software de conexión remota como Putty.
Una vez iniciada la sesión es necesario ingresar mediante las credecedenciales de la instancia, que en este caso es ubuntu.
Posteriormente, el primer proceso por realizar es la instalación de Apache2 en el servidor de Ubuntu.
ubuntu@<IP>:~$ sudo apt install apache2La siguiente configuración de la parte web, indica que se debe configurar el archivo script.js que se ubica en /var/www/esgtaciones.com/assets/js/script.js, donde se debe reemplazar la primera parte con el código obtenido en AWSCognito.
El resto del archivo solo se debe cambiar la referencia a la tabla EnvironmentalStation DB por el nombre de la tabla Ambiental (este caso).
Posteriormente se configura también el host virtual para el sitio.
ubuntu@<IP>:~$ sudo nano /etc/apache2/sites-available/estaciones.com.conf
--------------------------------------------------------------------------------------
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName estaciones.com
DocumentRoot /var/www/estaciones.com
DirectoryIndex dashboard.html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
--------------------------------------------------------------------------------------Finalmente, el último proceso consiste en habilitar el virtuahost y recargar el servicio para que la página pueda ser mostrada.
ubuntu@<IP>:~$ sudo a2ensite estaciones.com.conf
ubuntu@<IP>:~$ sudo a2dissite 000-default.conf
ubuntu@<IP>:~$ sudo apache2ctl configtest
sudo systemctl reload apache2Envio de datosdesde Kali Linux
Tabla en DynamoDB
Visualización de datos en Sitio Web





_AKxgSoQeiP.png)

Comments