Trabajo correspondiente al examen del primer bimestre de la asignatura Internet de las Cosas de la carrera de Ingeniería en Telecomunicaciones, Facultad de Ingeniería en Ciencias Aplicadas (FICA-CITEL) de la "Universidad Técnica del Norte" (UTN), realizado por Ana Grijalva y David Hinojosa bajo tutoría del docente MSC. Edgar Maya.
El presente trabajo ha sido realizado tomando como referencia el tutorial publicado por Francesco Ottaviani en el siguiente enlace: https://www.hackster.io/francesco-ottaviani/aws-cloud-based-iot-system-with-mqtt-3296f1.
Objetivo:El presente trabajo tiene como objetivo emplear nodos reales de forma remota en el laboratorio FIT IoT LAB para el envío de datos vía MQTT hacia el broker de IoT Core de AWS para su visualización mediante el servidor Apache en una página web en alojada en un servidor de AWS
Topología:El desarrollo del siguiente proyecto se realiza en base a la topología presentada a continuación:
Cuentaen FIT IoT LAB y credenciales de acceso:
Previo al desarrollo de la práctica se debe poseer una cuenta en la plataforma de FIT IoT LAB, para lo que se puede proceder al registro en el siguiente enlace: https://www.iot-lab.info/testbed/signup
Al tener ya una cuenta dentro de la plataforma, es necesario obtener las credenciales de acceso que permitan ingresar al entorno virtual de FIT IoT LAB, para realizar esto se debe seguir las instrucciones dadas por la propia plataforma, para este caso se ha hecho uso de una máquina virtual de Ubuntu 20.04 y se siguieron los pasos especificados en el siguiente enlace: https://www.iot-lab.info/docs/getting-started/ssh-access/
Creaciónde elementos necesarios dentro de AWS
- Creaciónde una cuenta en AWS
En primer lugar, para poder tener todos los recursos usados en el trabajo, se requiere contra con una cuenta de Amazon Web Service, para lo que se puede acceder al siguiente enlace: https://portal.aws.amazon.com/billing/signup#/start/email
Una vez dentro, es requerido seguir todos los pasos presentados incluyendo toda la información solicitada, es importante destacar que al finalizar se debe verificar una tarjeta de crédito para poder acceder a las diferentes aplicaciones de AWS, el proceso se evidencia en la siguiente secuencia de imágenes:
- Creaciónde usuario IAM
1. Para iniciar con la configuración de IAM es necesario que esta se halle habilitada en la cuenta para proceder con la configuración, para realizar esto se debe acceder a la cuenta y buscar “Acceso de los usuarios y los roles de IAM a la información de facturación”.
2. A continuación es necesario buscar la herramienta IAM y una vez dentro acceder a los usuarios, para así poder definir que usuario se va a crear, se accede a “Crear un nuevo usuario ” y se completan los datos, se debe asignar un nombre, definir el acceso por contraseña personalizada.
3. A continuación se debe crear un grupo para añadir al usuario a su grupo, y una vez se ha definido esto se procede a finalizar la creación del usuario.
- Creaciónde objetos dentro de IoT Core
1. Para crear objetos dentro de IoT Core en AWS, primeramente es necesario buscar "IoT Core" en el apartado de "Servicios", lo cual nos llevará a una nueva página en la que se selecciona en la sección de "Objetos" y dentro de ella hacemos click en "Crear objetos". Posteriormente se debe crear un único objeto y le asignamos un nombre para después seleccionar la sombra del dispositivo, para lo cual en este apartado se debe seleccionar "Sombra sin nombre" y "Siguiente", a continuación en el apartado de "Certificado de dispositivo" seleccionamos la opción de "Generar automáticamente un certifficado nuevo" puesto a que este es recomendado. Posteriomente se debe hacer click en "Crear un objeto" y descargar los certificados y claves proporcionados para poder conectarse a AWS, finalmente se podrá visualizar que el objeto fue creado correctamente.
2. Para crear una política, es necesario dirigirse al apartado de "Políticas" dentro de IoT Core y se elecciona "Crear política" para posteriormente asignarle un nombre a la política que deseemos crear, después es necesario seleccionar "Permitir" en "Efecto de la política" y "*" tanto en "Acción de la política" como en "Recurso de la política" y se selecciona en el botón de "Crear" para poder visualizar si dicha política se ha creado correctamente. Posteriormente, se debe acceder al apartado de certificados y adjuntar la política creada al certificado creado anteriormente.
- Creaciónde tablas en DynamoBD
1. Se debe crear una tabla en DynamoBD, la cual almacenará los datos proporcionados por las instancias creadas en cada nodo, primeramente se debe acceder a DynamoBD dentro de los servicios de AWS y acceder a la sección de "Panel" y dar click en "Crear tabla". Posteriormente se debe asignar un nombre a la tabla y agreamos el parámetro "ID" en la clave de partición la cual es la clave principal de la tabla, así como el parámetro "datetime" en la clave de ordenación, misma que permite ordenar y buscar los elementos que comparten la misma clave de partición, finalmente hay que dar click en "Crear" y podremos visualizar si la tabla ha sido creada correctamente.
- Obtenciónde credenciales de accesopara Linux
1. Para poder vincular AWS con el terminal de Linux es necesario tener credenciales de la cuenta, para lo que se accede a acceder al apartado de credenciales de seguridad en la cuenta, y se accede a las “Claves de acceso” para crear una nueva contraseña, se elige “Crear una nueva clave de acceso” y se descarga, luego se verifica que esté activa y se guarda ese archivo para poder modificar posteriores archivos de configuración.
- Configuración de Amazon Cognito
1. Para permitir la visualización de datos es necesario crear un grupo de identidades en Amazon Cognito, para lo que se precisa en primer lugar acceder y seleccionar “Administrar Grupo de identidades” y crear una nueva identidad.
2. Posteriormente se accede IAM y en el apartado de roles se selecciona el grupo de identidades creadas y asociar la política necesaria.
3. Finalmente en las identidades federadas se selecciona el grupo creado, y se puede obtener el código muestra en formato Javascript para usar posteriormente en la configuración del servidor web.
- Inicio del experimento en FIT IoT LAB
1. Al tener el archivo.elf para el router de borde es posible iniciar el experimento, para lo cual se debe acceder al testbed y crear un nuevo experimento, para lo que se debe seleccionar los nodos correspondientes a la arquitectura que se va a emplear, en este caso Open mote b y A8, así como la localización que corresponda al servidor que se está empleando, que para este ejemplo es strasbourg.
2. Al iniciar el experimento pueden visualizarse los nodos agregados previamente.
- Obtención del Firmware para el Router de Borde
1. 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.
sudo ssh <user>@strasbourg.iot-lab.info2. A continuacion, se procede a cambiar al 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, el cual es el que permitirá flashear los nodos dentro del laboratorio virtual..
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 all3. Una vez obtenido el archivo, para poder usarlo es necesario copiarlo en un repositorio en la memoria real de la máquina virtual por lo que se requiere que, se copie directamente el fichero desde el servidor donde se aloja realmente, para esto es necesario seleccionar en que carpeta se va a guardar la copia haciendo uso del comando scp.
- Nota: este paso debe realizarse en un nuevo terminal sin cerrar el anterior.
sudo su
scp <user>@strasbourg.iot-lab.info:/senslab/users/<user>/iot-lab/parts/RIOT/examples/gnrc_border_router/bin/openmote-b/gnrc_border_router.elf /home/<destination directory>/openmoteb-border-router.elf4. A continuación, se debe flashear (Subir el archivo.elf proporcionado anteriormente) en el nodo que se le designará como Border router e iniciar la simulación.
5. Se debe proceder con el comando que inicia el router, el cual debería estar siempre activo para que siga administrando comunicación.
sudo ethos_uhcpd.py openmoteb-19 tap8 2a07:2e40:fffe:00f5::/64- Obtención del Firmware para losNodos (estaciones)
1. 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 proporcionado por Francesco Ottaviani.
git clone https://github.com/Francesco31Ott/InternetOfThings19-20.git2. Posteriormente, se enlista los repositorios para verificar si la clonación fue realizada correctamente, para despues cambiar al directorio de InternetOfThings19-20/SecondAssignment y verificar que exista el directorio emcute_MQTTSN.
ls
cd InternetOfThings19-20/SecondAssignment
ls3. A continuación es necesario copiar el directorio emcute_MQTTSN al directorio en donde se encuentran los ejemplos proporcionados por Fit IoT-LAB para posteriormenete porder hacer uso de él.
cp -r emcute_MQTTSN/ /senslab/users/<user>/iot-lab/parts/RIOT-examples/
cd /senslab/users/<user>/iot-lab/parts/RIOT-examples/
ls4. Para obtener el firmware de la estación 1, primeramente es necesario seleccionar la fuente del sistema operativo e implementar el comando make en donde se especifica el canal, placa a implementar e identificador de la estación para obtener el archivo. elf, el cual es el que permitirá flashear el nodo correspondiente a la estación 1 dentro del laboratorio virtual.
cd iot-lab/parts/RIOT/examples/emcute_MQTTSN
source /opt/riot.source
make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station1 clean all5. Una vez obtenido el archivo para la estación 1, para poder usarlo es necesario copiarlo en un repositorio en la memoria real de la máquina virtual por lo que se requiere que, se copie directamente el fichero desde el servidor donde se aloja realmente, para esto es necesario seleccionar en que carpeta se va a guardar la copia haciendo uso del comando scp.
- Nota: este paso debe realizarse en un nuevo terminal sin cerrar el anterior.
sudo su
scp <user>@strasbourg.iot-lab.info:/senslab/users/<user>/iot-lab/parts/RIOT/examples/emcute_MQTTSN/bin/openmote-b/emcute_mqttsn.elf /home/<destination directory>/openmoteb-emcute_mqttsn1.elf6. Para obtener el firmware de la estación 2, primeramente es necesario seleccionar la fuente del sistema operativo e implementar el comando make en donde se especifica el canal, placa a implementar e identificador de la estación para obtener el archivo. elf, el cual es el que permitirá flashear el nodo correspondiente a la estación 2 dentro del laboratorio virtual.
cd iot-lab/parts/RIOT/examples/emcute_MQTTSN
source /opt/riot.source
make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station2 clean all7. Una vez obtenido el archivo para la estación 2, para poder usarlo es necesario copiarlo en un repositorio en la memoria real de la máquina virtual por lo que se requiere que, se copie directamente el fichero desde el servidor donde se aloja realmente, para esto es necesario seleccionar en que carpeta se va a guardar la copia haciendo uso del comando scp.
- Nota: este paso debe realizarse en un nuevo terminal sin cerrar el anterior.
sudo su
scp <user>@strasbourg.iot-lab.info:/senslab/users/<user>/iot-lab/parts/RIOT/examples/emcute_MQTTSN/bin/openmote-b/emcute_mqttsn.elf /home/<destination directory>/openmoteb-emcute_mqttsn2.elf8. A continuación, se debe flashear (Subir los archivos.elf proporcionados anteriormente) en los nodos que se les designará como estación 1 y estación 2 e iniciar la simulación.
9. Finalmente, se procede a ingresar desde el terminal del sistema operativo a los nodos openmote-b designados como estaciones.
- Ingreso al nodo designador como estación 1.
nc openmoteb-<#nodo> 20000- Ingreso al nodo designador como estación 2.
nc openmoteb-<#nodo> 20000- Configuración del Broker MQTT-SN
1. Una vez se tiene flasheado e iniciado el router de borde es cumple con función de DHCP, es decir asigna de forma automática las direcciones IP a las diferentes estaciones que se van a emplear, por lo que una vez estas también se hallen flasheadas e iniciadas se procede a verificar su dirección ip global, para lo que en primer lugar se debe acceder desde el terminal con el siguiente comando, y a continuación con ifconfig se verifica la asignación de IP
nc openmoteb-<#nodo> 20000
nc openmoteb-<#nodo> 20000
IfconfigY al ya conocer sus direcciones IP se puede realizar un ping para asegurar que los nodos tengan comunicación entre ellos.
2. Cuando los nodos que van a representar a los clientes funcionen de forma adecuada, se procede a acceder de forma remota a la placa A8 que hará la función de bróker para que así se pueda realizar el envío de datos, para lo que se debe conocer también su dirección IP haciendo uso de los siguiente comandos, para el acceso al nodo y para verificar su dirección IP:
ssh root@node-a8-<#nodo>
ip -6 -o addr show eth03. Una vez que se verifica la dirección IP es necesario copiarla para posteriormente poder iniciar las estaciones, en primer lugar, 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 true4. A 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 2Y es posible visualizar en envío de datos en tiempo real de ambas estaciones al broker:
- Configuración del Bridge MQTT-SN
1. Para realizar la configuración del Bridge MQTT-SN se ha designado la placa A8 para cumplir este rol, para lo cual es necesario acceder por shh a la cuenta personal de FiT IoT-LAB y de igual forma hacia dicha placa designada como bridge.
sudo ssh <user>@strasbourg.iot-lab.info
ssh root@node-a8-<#nodo>2. Posteriormente es necesario clonar el repositorio proporcionado por Francesco Ottaviani.
git clone https://github.com/Francesco31Ott/InternetOfThings19-20.git3. A continuación, se debe cambiar al directorio InternetOfThings19-20/SecondAssignment para posteriormente clonar los certificados proporcionados por AWS, los cuales fueron subidos previamente a github para hacer uso de ellos.
cd InternetOfThings19-20/SecondAssignment
git clone https://github.com/<certs ubication>4. Posteriormente, es necesario modificar los parámetros dentro del archivo "MQTTSNbridge.py", los cuales son la región en la que que se ha desarrollado la máquina virtual, el nombre de la tabla creada previamente, el ID de la sombra y el nombre de los archivos clonados en el paso anterior.
cd /home/root/InternetOfThings19-20/SecondAssignment/client_MQTTSN
vim MQTTSNbridge.py5. A continuación se debe instalar pip en la placa bridge A8.
TMPDIR=/ pip3 install --cache-dir=/ --build / boto3==1.15.36. Para instalar AWS en el bridge es necesario crear el directorio y crear el archivo config credentials y posteriormente verificar la conectividad a la siguiente url mediante el comando curl.
cd
mkdir -p ~/.aws
cd ~/.aws
touch config credentials
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"pip3 install AWSIoTPythonSDK7. Para continuar con la instalación, es necesario descomprimir el archivo.zip de AWS.
unzip awscliv2.zip./aws/install8. A continuación, se deben configurar las credenciales de AWS en el archivo "config" y dentro de este ingresar la región en la que que se ha desarrollado la máquina virtual.
cd ~/.aws
vim config9. Posteriormente, es necesario agregar las credenciales proporcionadas por AWS en el archivo "credentials" como se puede observar a continuación.
vim credentials10. Finalmente, es necesario cambiar al directorio /home/root/InternetOfThings19-20/SecondAssignment/client_MQTTSN en el cual se encuentra el archivo para compilar el bridge "MQTTSNbridge.py" mediante python, el cual al compilarse se debe especificar las estaciones 1 y 2 para poder visualizar lo datos que estas se encuentren enviando y a su vez para que sean almacenadas en la tabla creada dentro de AWS.
cd /home/root/InternetOfThings19-20/SecondAssignment/client_MQTTSN
python3 MQTTSNbridge.py- Una vez compilado el bridge se debe especificar las estaciones para las que se desee recibir los datos que estas se encuentren almacenando, para el presente caso se especifica ambas secciones de la siguiente manera,
1
2
stop- Creación del servidor web con una instancia en AWS
1. Para poder tener un servidor web activo que a su ve asigne una dirección IP pública y DNS se hace uso de otro de los servicios de AWS, y se procede a lanzar una nueva instancia para alojar este servidor, en este caso se escoge una máquina virtual de Ubuntu Server 18.04.
2. Se debe seleccionar crear un nuevo grupo de seguridad, hace uso de una nueva clave.pem y crear un nuevo grupo de seguridad, así también se debe permitir el tráfico SSH para tener el acceso remoto, también se debe permitir el tráfico HTTPS en caso de querer manejar un servidor web confiable y el HTTP que es el que se va a emplear.
3. Una vez configurado se procede a lanzar la instancia y se debe esperar a que esta se halle completamente lista para acceder desde un terminal externo con la dirección IP pública y la clave creada junto a la instancia.
4. Una vez iniciada la conexión SSH por el terminal, se procede a realizar la instalación del servidor web mediante el comando:
sudo apt install apache25. Y sin realizar ninguna otra configuración se puede acceder con el DNS dado por la instancia o la IP pública.
- Creación de la página web
1. Con el repositorio clonado es necesario ejecutar la siguiente serie de comandos para crear el repositorio que almacene dentro de la carpeta de Apache los archivos que reemplacen al index base.
git clone https://github.com/Francesco31Ott/InternetOfThings19-20.git2. Una vez ejecutados los comandos se procede a ir al repositorio base y del fichero First assigment se obtiene los archivos de la página web para copiarlos hacia el fichero que se acaba de crear.
cd /var/www
sudo mkdir /var/www/<nombre_fichero>
sudo chown -R $USER:$USER /var/www/<nombre_fichero>
sudo chmod -R 755 /var/www/<nombre_fichero>3. A continuación se debe acceder al archivo scrip.js y se procede a realizar diferentes cambios, para acceder es necesario cambiar de directorios hasta llegar al adecuado y realizar los cambios.
cd /home/ubuntu/InternetOfThings19-20/FirstAssignment/WebApp
cp -r * /var/www/<nombre_fichero>
cd /var/www/<nombre_fichero>
cd web
cp * /var/www/<nombre_fichero>4. En primer lugar se debe cambiar el encabezado por el que se obtuvo de forma previa en Amazon Cognito para que corresponda a las credenciales de AWS, luego dentro del archivos se deben cambiar datos como el nombre de la tabla de la que se van a extraer los datos para la visualización en todos los campos que se nombre.
cd /var/www/<nombre_fichero>
cd assets/js
nano script.js5. Cerca de los últimos pasos pata concluir con la configuración de la página web, es necesario crear un archivo para almacenar el host virtual que permita tener acceso a la página web como tal haciendo uso del siguiente comando y estableciendo el siguiente texto dentro del archivo.
sudo nano /etc/apache2/sites-available/iot.com.conf
-------------------Texto para el archivo---------------------
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName iot.com
DocumentRoot /var/www/<nombre_fichero>
DirectoryIndex dashboard.html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>6. Finalmente hay que reiniciar el servidor web con los siguientes comandos:
sudo a2ensite iot.com.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2Una vez modificada la página web y con las estaciones enviando datos, es posible visualizar todos que se están recibiendo en la página web que se actualiza de forma constante, debido a la facilidad de AWS de ofrecer IP pública y un DNS es posible acceder desde cualquier dispositivo, ya sea desde un navegador en una PC o en un dispositivo móvil, siempre y cuando exista conexión a internet.






Comments