Saludos Cordiales!Somos Daniel Benavides y Raúl Díaz estudiantes de la carrera de Ingeniería en Telecomunicaciones de la Universidad Técnica del Norte ubicada en la ciudad de Ibarra - Ecuador, este documento resume cómo enviar datos a la plataforma IoT de Amazon Web Services mediante MQTT-SN utilizando un banco de pruebas propiedad de FIT IoT-Lab para mostrar los datos obtenidos de dos estaciones meteorológicas en una página web alojada en una instancia AWS EC2.
DESAROLLOProblemáticaEl laboratorio FIT IoT-LAB se utiliza para la visualización de la simulación de la red de sensores, que da acceso a configuraciones reales de hardware y visualiza su funcionamiento. Por lo tanto, se propone una simulación de una red de cuatro nodos usando hardware OpenMote-b, el cual utilizará el sistema operativo RIOT OS.
Para obtener pruebas para el envío de datos desde una estación meteorológica alojada en dos nodos openmote-b, se debe implementar un router de borde para obtener una dirección IPv6 global a través de un nodo openmote-b, para el envío posterior de datos a través de MQTTSN, se debe implementar un servidor proxy. en el nodo A8. luego se realiza la conexión necesaria al puente, lo que le permite almacenar los datos recopilados en tablas propiedad de Dynamo DB y, finalmente, presentar estos datos desde el panel EC2 de Amazon Web Services a través de una página web alojada en el servidor web de la instancia.
Por lo tanto, las siguientes secciones desarrollarán paso a paso una configuración que le permita realizar esta tarea.
Creación de experimento en FIT IoT-LABEmpezamos ejecutando un experimento, para ello seleccionamos "Nuevo experimento" del portal principal, luego buscamos el nombre y el tiempo de ejecución, posteriormente seleccionamos los nodos, nos aseguramos que sean hardware OpenMote-b y estén en el base de datos de la prueba de Strasbourg también, que sugirió Seleccione el nodo, que está libre (activo) y finalmente, en la visualización del experimento, determinamos el número del nodo que se asignará como un enrutador de borde, para un mejor manejo se recomienda poner al primer nodo de la lista como el de borde, para no confundirse. A continuación se muestra una captura de pantalla del proceso descrito.
Primero ingresamos a nuestra cuenta de FIT IoT-LAB, y ponemos nuevo experimento.
Una vez abierta la siguiente pantalla, llenamos los solicitado, el nombre de proyecto, el tiempo para su ejecución y agregamos los nodos.
Para agregar los nodos escogemos las propiedades, donde destacamos el número de nodos, en este caso:
- 3 Nodos Openmote-b
- 1 Nodo A8
Seguimos y escogemos los host name de los nodos, en otras palabras escogemos los nodos que estén libres.
Creamos y verificamos lo que creamos, primero con el tiempo y el estado del experimento, luego en la otra ventana vemos los detalles de los nodos.
Configuración del firmware para nuestro Router de BordePara acceder a nuestros nodos físicos lo haremos de forma remota, en este caso usaremos hardware OpenMote-b compatible con IEEE802.15.4g y programable usando una plataforma de código abierto como RIOT OS. Por tanto, el nodo que actuará como router de borde es el que asigna direcciones a los nodos de la red, en este caso mediante direccionamiento IPv6, con el sistema operativo RIOT OS compilado en el hardware. Para ello, partimos de un servidor remoto con una configuración de entorno donde clonamos el repositorio iot-lab, que contiene varios ejemplos que se pueden ejecutar en hardware de laboratorio. Luego ingresamos al repositorio clonado e inicializamos el entorno.
ssh <login>@<site>.iot-lab.info
git clone https://github.com/iot-lab/iot-lab.git
cd iot-lab
make
Seguimos eligiendo el SO que se ejecutará en la placa, para ello elegimos RIOT y seguimos buscando el ejemplo gnrc_border_router, el mismo que se utilizará para este nodo, luego seguimos cargando y compilando la placa openmote de ejemplo.b especificar las funciones de compilación; tasa de símbolo y canal en el que operará.
make setup-riot
cd parts/RIOT/examples/gnrc_border_router
source /opt/riot.source
make ETHOS_BAUDRATE=115200 DEFAULT_CHANNEL=21 BOARD=openmote-b clean all
Después de compilar el ejemplo, se crea un archivo con la extensión.elf, que es el mismo que el firmware que debe cargarse en el nodo de laboratorio. Para hacer esto, necesitamos descargar este archivo a nuestro repositorio local, tal como está en el repositorio remoto. Así que aquí hay dos opciones para descargar el firmware integrado.
El comando scp copia archivos o directorios entre un sistema local y un sistema remoto, o entre dos sistemas remotos. En este punto, copie la ruta al archivo .elf ubicado al final del ejemplo de hardware. Además, debe especificar la ruta al servidor local copiado donde se guardará el archivo, que tendrá un nombre de archivo. Entonces, la sintaxis para copiar un archivo de un sistema remoto a un sistema local es la siguiente, y recuerde que el comando debe ejecutarse en el servidor local, por lo que se recomienda que abra una nueva terminal.
En esta configuración es necesaria para que el enrutador de borde distribuya los prefijos y direcciones IPv6 asignados. Para esto nos ubicamos en el mismo directorio que el ejemplo y usamos el comando ethos_uhcpd.py para propagar este proceso. Después de ejecutar el comando, no se recomienda cerrar la terminal en la que se está ejecutando, ni interrumpir el proceso, por lo que para configuraciones futuras, use una terminal diferente y vuelva a ingresar ssh. En el comando bajo openmoteb-3 encuentre el número de nodo de simulación.
cd iot-lab/parts/RIOT/examples/gnrc_border_router
sudo ethos_uhcpd.py openmoteb-3 tap0 2a07:2e40:fffe:00ff::/64
Primero, compilar el cliente MQTT implica descargar el repositorio de ejemplo creado por Francesco Ottaviani desde Strambourg Testbed.
ssh <login>@strasbourg.iot-lab.info
git clone https://github.com/Francesco31Ott/InternetOfThings19-20.git
El siguiente proceso consta en copiar la carpeta emcute_MQTTSN a la carpeta de ejemplos de RIOT meidante los siguientes comandos:
cd
cd InternetOfThings19-20/SecondAssignment
cp -r emcute_MQTTSN/ /senslab/users/<user>/iot-lab/parts/RIOT/examples/
cd
cd iot-lab/parts/RIOT/examples/parts/RIOT/examples/
Luego de obtener un directorio que te permita compilar el cliente MQTTSN que simula la adquisición de datos ambientales, el siguiente proceso consiste en compilar el sitio para obtener los archivos.elf que serán el firmware necesario para los dos openmote-b-notes restantes.
Compilación para las 2 estaciones:
cd iot-lab/parts/RIOT/examples/parts/RIOT/examples/emcute_MQTTSN
source /opt/riot.source
make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station1 clean all
De igual manera el proceso de descarga es necesario mediante una terminal Linux en donde se especifica el directorrio donde será almacenado con el nombre del archivo.elf
scp rdiaz@strasbourg.iot-lab.info:/senslab/users/rdiaz/iot-lab/parts/RIOT/examples/emcute_MQTTSN/bin/openmote-b/emcute_mqttsn.elf /home/rdiaz/Descargas/openmoteb-emcute_mqttsn1.elf
Implementación del BrókerEn este caso se utilizará el nodo A8 ya que es el tipo de nodo adecuado para ejecutar Mosquitto RSMB en el dispositivo proporcionado por IoT-LAB y será el encargado de recibir las publicaciones de la estación y enviar esta información al servicio de AWS. primero por acceso SSH al nodo a8-3 (ya que no hay otra forma de acceder a la consola ya que el tablero no lo soporta) y verifique que tenga una dirección IPv6 global addr show eth0 on el comando ip -6 - o (aunque ifconfig también se puede usar):
ssh root@node-a8-3
Saber la IP global del dispositivo no es suficiente, también debe verificar la conectividad con el resto de la topología, así que haga un ping6 para confirmar que la red es convergente.
Una vez que se verifica la conexión, se puede crear un archivo de configuración para ejecutar Mosquitto. Para hacer esto, use el editor vim para crear un archivo config.conf (en el directorio de inicio del usuario):
Contiene la información que se muestra en la siguiente imagen, que muestra los puertos de escucha para MQTTN-SN UDP 1885 y MQTT TCP 1886, que son válidos para conexiones desde direcciones IPv6.
Validamos nuevamente la dirección IPv6 del nodo A8-3
Ya con el archivo editado, se procede a ejecutar el bróker con el comando
broker_mqtts config.conf
y verifique que esté escuchando en el puerto definido.
Ahora pasamos a configurar los nodos que envían información al broker, para esto necesitamos descargar el repositorio de GitHub y copiar el ejemplo emcute_MQTTSN a la carpeta RIOT-examples en el front end FiT-IoT-LAB SSH. Dado que hay dos sitios, compile el firmware para cada sitio:
<login>@strasbourg:~$ cd iot-lab/parts/RIOT/examples/emcute_MQTTSN
$ make DEFAULT_SUBGHZ_CHANNEL=0 BOARD=openmote-b EMCUTE_ID=station# clean all
$ # es el número de la estación (1,2)
Este
proceso se realizara tanto para laEstación
1, como para laEstación
2:
Use el comando scp para descargar el firmware al almacenamiento local. Este nodo muestra el archivo previamente descargado:
- Configuración del puente MQTT-SN/MQTT:
Este proceso se realiza en el mismo nodo donde se ejecuta el agente (a8-3), para ello es necesario abrir una nueva sesión SSH en el dispositivo:
ssh root@node-a8-3
Luego, clone el repositorio de Francesco Ottaviani en el dispositivo (este proyecto se basa en el trabajo realizado por estudiantes de la Sapienza Università di Roma)
En el directorio SecondAssignment, se crea un directorio para almacenar los certificados (certificado de AWS, archivos de clave pública y privada obtenidos después de crear el objeto en AWS IoT-Core).
Debe crear un repositorio en GitHub para almacenar sus certificados de AWS y luego clonar ese repositorio en el nodo a8-3. Debe copiar el archivo descargado en la carpeta del certificado creada en el paso anterior. Luego navega a la carpeta client_MQTTSN para buscar archivos que se conectan a AWS mediante el código de Python.
vim MQTTNSNbridge.py
En el archivo, edite los parámetros utilizando la información de la tabla Dynamo DB y la región donde está configurada la cuenta de AWS.
Considere también los puntos de enlace de AWS IoT-Core para la colocación de archivos. Se puede encontrar en la sección de configuración del portal de Amazon Web Services.
Crear usuario IAM
Para poder realizar este paso lo que primero se realizo fue la creación de una cuanta en AWS, la cual se la puede registrar en https://aws.amazon.com/es/ , de preferencia crear una cuenta educativa, ya que esta es gratuita y sirve con el fin de aprender. Continuando con el proceso se crea este tipo de usuario por seguridad y para contar con algunas
herramientas extras. Una vez dentro nos dirigimos a la pestaña superior donde está el nombre de usuario, se da clic en Mi cuenta.
En la ventana que aparece se despliega hasta Usuario de IAM y acceso de rol a la información de facturación, se da en Editar, seleccionar la casilla de verificación
Activar IAM Access y luego en Actualizar.
En la barra de navegación, elegir Servicios y luego IAM.
En el panel de navegación, elija Usuarios y luego en Agregar usuario.
En la siguiente página Detalles, se debe realizar, primero escribir un Nombre de usuario, en este caso se ha utilizado “Administrador”. Seleccione la casilla de verificación Acceso a la consola de administración de AWS.
Se selecciona Contraseña personalizada y se escribe una nueva contraseña en el cuadro de texto. Se da clic en Siguiente: Permisos.
En la página de Permisos, se debe elegir Agregar usuario al grupi Crear grupo. En el cuadro de diálogo Crear grupo se escribe en Nombre de grupo, en este caso será “Administradores”. Seleccionar la casilla de verificación de la política AdministratorAccess. Y finalmente se da en Crear grupo.
En la página con lista de grupos, seleccionar la casilla de verificación para el nuevo grupo. Se elige Actualizar y se verá el grupo creado y las políticas asociadas.
Se debe elegir en Siguiente: Revisión, se verifica las membresías del grupo que se agregarán al nuevo usuario. Cuando esté listo se elige Crear usuario.
Crear una Objeto
Ingresamos a la consola de AWS y se dirige al servicio de IoT Core.
Cuando se encuentre dentro del servicio IoT Core, se da clic en Administrar. En la subpestaña Objetos, buscar el botón que diga Crear y luego en Crear una sola cosa.
Se debe car un nombre a la cosa y se da en Siguiente.
Luego se debe elegir en Crear certificado.
El siguiente paso es muy importante, se debe crear una carpeta de los certificados que proporcionará el sistema, estos se utilizan para configurar la conexión al Objeto. Se debe descargar un certificado y su clave privada.
A continuación, en A root CA for AWS IoT, se debe dar en Descargar, será redirigido a la página de Certificados de CA para la autenticación del servidor. Debe elegir Amazon Root CA1 y guardar el certificado que se mostrará en un archivo con extensión. pem. Finalmente se da clic en Activar.
Crear Política
Regresar a la página de inicio de AWS IoT Core y seleccionar la pestaña Seguro, luego en Políticas: en esta ocasión se crea una política para adjuntar a los certificados.
En la subpestaña Políticas, clic en Crear
Se agrega un nombre a la política, los campos de Acción y Arn de recursos se llena con el signo “ * ”, marcar la casilla Permitir y luego en Crear.
Cuando se haya creado la política, se debe regresar a la subpestaña de Certificados, se buscan los certificados y se da clic en los tres puntos.
Cuando se hayan seleccionado los certificados, es necesario dar en Asociar política y se selecciona la política que se creó y se da en Asociar.
Crear una base de datos en DynamoDB
Se necesita ahora una base de datos para almacenar todos los datos que transmitirán los sensores, para ello se debe dirigir a la consola de administración de AWS y se busca DynamoDB y se da clic en Crear tabla.
En la ventana que aparece se debe dar un Nombre a la tabla, elegir una clave primaria que será el ID, luego una clave de ordenación que se sugiere que sea la fecha y hora, tal como se indica a continuación.
Este proceso se realiza en el mismo nodo donde se ejecuta el agente (a8-3), para ello es necesario abrir una nueva sesión SSH en el dispositivo:
ssh root@node-a8-3
Luego, clone el repositorio de Francesco Ottaviani en el dispositivo (este proyecto se basa en el trabajo realizado por estudiantes de la Sapienza Università di Roma).
En el directorio SecondAssignment, se crea un directorio para almacenar los certificados (certificado de AWS, archivos de clave pública y privada obtenidos después de crear el objeto en AWS IoT-Core).
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.
vim MQTTNSNbridge.py
Servidor web- Configuración de grupo de identidades en AWS Cognito
Este paso es esencial para comenzar a ajustar su sitio para que interactúe con los servicios de AWS como DynamoDB, que es de interés en este caso. Para crear un grupo de identidades, vaya a Servicios → Cognito y seleccione Administrar grupos de identidades.
Creará un nuevo grupo de identidad, le dará un nombre al grupo (en este caso, WheaterInfoAccess) y seleccionará la casilla Habilitar acceso para identidades no autorizadas para permitir que los usuarios no registrados accedan a la información de la estación meteorológica que ve en línea.
Antes de configurar el sitio, hay que dar un paso más: asociar el rol de identidad no autenticado (en este caso, Cognito_WheaterInfoAccessUnauth_Role) con la política AdministratorAccess, porque los usuarios visibles no tienen autenticación. Esto se hace en la consola de IAM, seleccione el rol apropiado en Roles y haga clic en Agregar política.
- Configuración de Apache Web Server una instanciaUbuntu de AWS
Una vez que el proceso de Amazon Cognito ha sido completado el siguiente proceso consiste en implementar el dashboard de presentación de datos en una página web alojada en una instancia de AWS.
Después de configurar el grupo de identidades en AWS Cognito, se completa la configuración del sitio, que muestra información en una tabla de DynamoDB. Luego copie el contenido de la carpeta WebApp en InternetofThings19-20/FirstAssigment/ a la carpeta var/www/estaciones.com creada para este sitio.
git clone https://github.com/Francesco31Ott/InternetOfThings19-20.git
cd /var/www
sudo mkdir /var/www/estaciones.com
sudo chown -R $USER:$USER /var/www/estaciones.com
sudo chmod -R 755 /var/www/estaciones.com
cd /home/ubuntu/InternetOfThings19-20/FirstAssignment/WebApp
cp -r * /var/www/estaciones.com
cd /var/www/estaciones.com
cd web
cp * /var/www/estaciones.com
- Configuración JavaScript
La 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.
cd /var/www/estaciones.com
cd assets/js
nano script.js
Finalmente, el último proceso consiste en activar virtuahost y recargar el servicio para que se puedan mostrar las páginas.
sudo a2ensite estaciones.com.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
FUNCIONAMIENTO
El programa ha declarado dos funciones para abrir la conexión entre el cliente MQTT y el publicador, recibe respuestas de quien publica cuando el registro se haya realizado correctamente. Cuando se conecta con el servidor se comienza a generar valores que simulan el aspecto de sensores, además, envían la fecha y hora en que se da el registro de las operaciones.
Cuando todos los scripts están funcionando correctamente, el resultado de todo esto se puede ver en las pestañas del terminal o directamente en el servicio DynamoDB. Para ello, se abre la ventana de la base de datos desde la consola de AWS y se elige la tabla “BaseDatos”, todos los registros ahora se visualizan en la tabla.
Panel de control web
Una aplicación web mostrará los datos almacenados en la base de datos. En este caso, es una aplicación simple que se ejecuta en localhost.. La aplicación web proporciona: La última detección de cada estación virtual
El código está disponible en mi repositorio de Github y obviamente si quieres usarlo tienes que cambiar algunos parámetros como el punto final y la ruta de los certificados.
Los valores estarán disponibles en la página localhost.
Comments
Please log in or sign up to comment.