Nodos de RIOT-OS que envían datos a AWS IoT a través de MQTT-SN
En el siguiente proyecto vamos a realizar la implementación de un sistema IoT con servicio en la nube cloud computing y una aplicación web. Para lo cual, construiremos una estación ambiental virtual basada en Amazon Web Services (AWS) que simule unos sensores (temperatura, humedad, altura de lluvia, dirección del viento e intensidad del viento) con el emulador nativo de RIOT-OS que se enviaran a una base datos con un brocker MQTT.
DesarrolloCreación de AWSLo primero que demos hacer es crear una cuenta en la plataforma de AWS, para esto seguimos los pasos que nos indica en la página, debemos tomar en cuenta que nos pedirán una tarjeta para descontar 1 dólar que se descontará únicamente para la verificación de los datos.
Creación de usuario IAM
Una vez creada la cuenta iniciamos sesión para crear el usuario IAM, esto lo realizamos para tener un mejor control de recursos AWS. Se sigue los siguientes pasos:
- Mi cuenta
- Acceso de los usuarios
- Roles de IAM
- Activar el acceso de IAM
- Actualizar
Luego de esto buscamos el panel IAM y se crea un nuevo usuario con los siguientes parámetros.
- Establecemos los detalles de usuario
- Seleccionamos el tipo de acceso AWS (utilizamos la opción con contraseña)
Creación una Nueva Política
Confirmamos la creación del usuario, para luego crear un objeto IoT Core con el que vamos a realizar la interacción entre las estaciones de los nodos y el cliente.
Creamos un objeto IoT para luego crear la política que nos ayudara a asociarla con el certificado del objeto. Lo realizamos de la siguiente manera:
- Seguridad
- Políticas
- Crear
Configuramos las propiedades de la política con EnvironmentalStationAccess
Ahora en el apartado de certificados, creamos un nuevo certificado.
Lo generamos de manera automática para obtener una clave de certificación de AWS IoT.
Descargamos todos los certificados y claves que se crean.
Ahora asociamos el certificado a la política que ya creamos previamente.
Elegimos la política de AWS IoT que creamos en este caso la EnvironmentalStationAccess y adjuntamos el certificado con la política.
Creación de la tabla en DynamoDB
Ahora realizamos la configuración de la tabla en DynamoDB en la plataforma de AWS, para lo cual creamos una tabla en donde se almacenarán los registros de las estaciones.
Definimos el nombre de la tabla, la clave de partición y ordenación, estos datos ayudaran en el correcto funcionamiento del sistema
Podemos observar que se creó nuestra tabla correctamente.
Obtencion de las credenciales de acceso
Es necesario obtener una clave de acceso entre la plataforma AWS y la terminal de Linux que vamos a utilizar. Para lo cual se ingresa a:
- Mis credenciales de seguridad
- Claves de acceso
- crear clave de acceso
Descargamos el archivo .csv que va a contener la keyID y el Access keyID que necesitamos para nuestra maquina Linux.
Obtención del Firmware para el Router de Borde
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.
sudo ssh <user>@strasbourg.iot-lab.infoA 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 allUna vez obtenido el archivo, debemos copiarlo en un repositorio de nuestra máquina virtual, para lo cual seleccionamos la carpeta donde se va a guardar el archivo con el comando scp.
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.elfEn este caso nuestro documento se creo en la carpeta Descargas, en donde se podrá visualizar el archivo .elf
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.
Es necesario regresar a la terminal en donde se accedió por ssh para ingresar el comando que activará el Border router, para lo cual es necesario especificar el nodo designado como Border router.
sudo ethos_uhcpd.py openmoteb-19 tap8 2a07:2e40:fffe:00f5::/64Obtención del Firmware para losNodos (estaciones)
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.gitA continuación, es necesario copiar el directorio emcute_MQTTSN al directorio en donde se encuentran los ejemplos proporcionados por Fit IoT-LAB.
cp -r emcute_MQTTSN/ /senslab/users/<user>/iot-lab/parts/RIOT-examples/
cd /senslab/users/<user>/iot-lab/parts/RIOT-examples/
lsPara obtener el firmware de la estación 1, seleccionamos la fuente del sistema operativo e implementamos el comando make para obtener el archivo. elf
cd iot-lab/parts/RIOT/examples/emcute_MQTTSN
source /opt/riot.source
make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station1 clean allUna vez obtenido el archivo para la estación 1, lo copiamos en un directorio de nuestra máquina virtual en donde se copiará el fichero, para esto necesitamos seleccionar la carpeta en donde vamos a guardar la copia haciendo uso del comando scp.
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.elfPara 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
cd iot-lab/parts/RIOT/examples/emcute_MQTTSN
source /opt/riot.source
make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station2 clean allUna vez obtenido el archivo para la estación 2, lo copiamos en un directorio de nuestra máquina virtual en donde se copiará el fichero, para esto necesitamos seleccionar la carpeta en donde vamos a guardar la copia haciendo uso del comando scp.
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.
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> 20000Ingreso al nodo designador como estación 2.
Configuración del Broker MQTT-SN
Una vez que si inicia el router de borde que designara de forma automática las direcciones IP a las diferentes estaciones cumpliendo la función de DHCP. Luego debemos verificar que se tenga una dirección IP global, para lo que accedemos desde el terminal a los nodos con el comando nc para luego verificar la asignación de IP.
nc openmoteb-<#nodo> 20000
nc openmoteb-<#nodo> 20000
IfconfigPara verificar la conexión entre nodos, realizamos un ping entre ellos con las direcciones IP que confirmamos
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, para el acceso al nodo y para verificar su dirección IP
ssh root@node-a8-<#nodo>
ip -6 -o addr show eth0Una 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 2Configuración del Bridge MQTT-SN
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>Posteriormente es necesario clonar el repositorio proporcionado por Francesco Ottaviani.
git clone https://github.com/Francesco31Ott/InternetOfThings19-20.gitA 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>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.pyA continuación se debe instalar pip en la placa bridge A8.
TMPDIR=/ pip3 install --cache-dir=/ --build / boto3==1.15.3Para 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 AWSIoTPythonSDKPara continuar con la instalación, es necesario descomprimir el archivo.zip de AWS.
unzip awscliv2.zip./aws/installA 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 configPosteriormente, es necesario agregar las credenciales proporcionadas por AWS en el archivo "credentials" como se puede observar a continuación.
vim credentialsFinalmente, 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.pyUna 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
stopCreación del servidor web con una instancia en AWS
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.
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.
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.
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 apache2Y 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
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.gitUna 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>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.
start 2a07:2e40:fffe:c0::c 1885 1En 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.jsCerca 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>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 apache2



Comments