Full text
–Equation Chapter 1 Section 1 Trabajo de Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Autor: Juan Jiménez Casas Tutor: María Teresa Ariza Gómez Departamento de Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019
2 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular
Índice de Figuras 3 Trabajo de Fin de Grado Grado en Ingeniería de Tecnologías de Telecomunicación Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Autor: Juan Jiménez Casas Tutor: María Teresa Ariza Gómez Profesor titular Departamento de Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019
4 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Trabajo fin de Grado: Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Autor: Juan Jiménez Casas Tutor: María Teresa Ariza Gómez El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2019 El Secretario del Tribunal
Índice de Figuras 5 A mi familia A mis amigos A mis maestros
6 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular
Índice de Figuras 7 Agradecimientos Sin duda, el momento más difícil y a la vez más importante en la realización de toda esta memoria no es más que el que acontece en este apartado. Es de especial importancia para mí el acto de agradecer a todas las personas que me han acompañado durante este camino. Por ello, y a pesar de todo, creo que con este apartado nunca será suficiente para agradecer todo lo que os debo. Agradecer, en primer lugar, a la tutora de este proyecto, María Teresa Ariza Gómez, el tiempo, la confianza y empeño dedicado en ayudar a la realización de este trabajo. Además, me gustaría agradecer al resto de profesores que, en cualquier momento de estos años, me han servido como ayuda y han tendido su mano para que todo esto sea más sencillo. Todo esto no hubiese sido posible sin vosotros, mis padres, mis hermanos, mis abuelos, mi familia. Muchas gracias, nunca podré compensaros todo lo que hacéis por mí. Este trabajo también es igual de vuestro que mío. Gracias por confiar tanto en mí y por guiarme para ser quien soy. Por enseñarme día tras día, por inculcarme unos valores. Por darlo todo, sin pedir nada a cambio. Os quiero. No puedo dejar atrás a otro de mis pilares fundamentales, mi compañera en todo este camino, quien me ha apoyado día tras día, ha aguantado mis días malos y me ha ayudado a desconectar en todo el caos que han sido estos cuatro años. Este párrafo va por ti. Por último, pero no por ello menos importante, me gustaría hacer un agradecimiento a la casualidad, a la casualidad de encontrarme unos compañeros, que pasaron a ser amigos y hoy en día son familia. Sin ellos, hoy en día no estaría escribiendo esto y sin ellos no volvería a repetir. Desde ese primer encuentro casual, las risas por no llorar, los días tristes y los días felices, los consejos, los momentos vividos, los desvaríos frutos del agotamiento, los agobios y como no, las quejas. No hace falta que os nombre, si ya leyendo este párrafo os habéis sentido identificados, significa que sois parte de esta dedicatoria. Juan Jiménez Casas De Las Cabezas de San Juan a Sevilla, 2019
8 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Resumen Debido a la imparable digitalización que está aconteciendo en la actualidad, numerosos objetos y dispositivos que en el pasado no eran más que eso, se están viendo actualizados y conectados en una red formada por estos. Surge así el concepto de Internet of Things. Este concepto intenta proponer soluciones que hagan que la vida cotidiana de las personas sea mucho más sencilla, haciendo uso de la tecnología. Para ello, se le dota a los objetos de una conectividad que antes no tenían, abriendo paso a un conjunto de infinitas posibilidades, como la facilidad de realizar alguna acción o el análisis de datos para poder tomar mejores decisiones. Como consecuencia, numerosos dispositivos se están viendo conectados y surgen conceptos como las Smart Cities o la Domótica. Este trabajo viene a plantear una solución en este campo, haciendo uso de tecnologías de vanguardia, como el uso de Eclipse Kura como Gateway IoT 1 en una Raspberry Pi. Además, se ponen en marcha servicios en la nube haciendo uso del conjunto de utilidades que proporciona Amazon AWS, como IoT Core, DynamoDB, Lambda y API Gateway, otorgando fiabilidad, seguridad y facilidad de uso al sistema. Para la presentación e interacción con estos sistemas a través de una interfaz web se hace uso de Angular. 1 Un Gateway IoT es un dispositivo físico o un programa de software que sirve como punto de conexión entre la nube y los controladores, sensores y dispositivos inteligentes.
Índice de Figuras 9 Abstract Due to the unstoppable digitalization that is happening today, several objects and devices that in the past were nothing more than that, are being updated and connected in a network formed by them. So, it arises the concept of Internet of Things. This concept tries to propose solutions that make people's daily life much simpler and easier, making use of technology. To do this, the objects are provided with a connectivity that they did not have before, opening the way to a set of infinite possibilities, such as the ease of performing some action or the analysis of data in order to make better decisions. As a result, several devices are being connected and concepts such as Smart Cities or Home Automation arise. This work comes to propose a solution in this field, making use of cutting-edge technologies, such as the use of Eclipse Kura as Gateway IoT in a Raspberry Pi. In addition, cloud services are deployed using the set of utilities provided by Amazon AWS, such as IoT Core, DynamoDB, Lambda and API Gateway, providing reliability, security and ease of use to the system. Angular is used to present and interact with these systems through a web interface.
16 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 1.2 Objetivos El objetivo del Trabajo es la implementación de un sistema formado por: • Sensores de temperatura y humedad conectados a una Raspberry Pi, la cual convertiremos en un dispositivo IoT, haciendo uso de Eclipse Kura. • Entorno de Cloud Computing el cual recibirá información de un dispositivo IoT mediante MQTT, almacenará dicha información en una Base de Datos y la ofrecerá a través de una API REST. • Aplicación web desarrollada en Angular con la que el usuario pueda obtener información de un determinado terrario y pueda interactuar con este. 1.3 Antecedentes Los antecedentes de este trabajo corresponden a un proyecto realizado en la asignatura Sistemas Operativos, la cual imparte la tutora de este Trabajo Fin de Grado, María Teresa Ariza Gómez. Aquel proyecto tenía como funcionalidad la de controlar y monitorizar un terrario a pequeña escala, desde la terminal de la Raspberry Pi y haciendo uso de los contenidos impartidos en aquella asignatura, para obtener la información de los distintos sensores. Como propuesta de mejora a este, se ha buscado el convertir la Raspberry Pi en un dispositivo IoT, para enviar esta información a la nube, con el fin de procesar esta, almacenarla en una base de datos y ofrecerla a través de un servicio REST. Además, se ha desarrollado una aplicación Web que nos permita acceder a la información de este terrario, así como de más terrarios si fuese necesario, con el uso de este servicio. 1.4 Descripción de la solución A continuación, se describe de manera generalizada la solución implementada, con el fin de alcanzar los objetivos propuestos. 1.4.1 Objetivos Específicos • Obtención y envío de los datos de los sensores. Para obtener la información de humedad y temperatura se han utilizado sensores DHT11, de bajo coste, pero de gran utilidad para representar la toma de datos. Para la obtención y envío de la información de estos, se ha utilizado Eclipse Kura, que se encarga de obtener la información de los sensores y publicarlas en el IoT Core de AWS, haciendo uso del protocolo MQTT. • Publicación de forma segura de información en Amazon AWS. Para ello se han utilizado certificados de clave pública y privada, firmados por la propia CA 3 raíz de Amazon. De esta forma, cuando un dispositivo quiera publicar o suscribirse a la información del IoT Core de Amazon, deberá tener un certificado válido. • Almacenamiento y consulta de los datos. Se ha utilizado una Base de Datos noSQL, llamada Amazon DynamoDB, donde se almacena la información de cada uno de los estados en los que está un Objeto IoT. 3 Autoridad de certificación.
Introducción 17 • Creación de un servicio serverless, basado en el procesamiento en la nube. Haciendo uso de las distintas herramientas que proporciona Amazon Web Services, como son IoT Core, DynamoDB, Lambda Function y API Gateway; se ha implementado un servicio REST sin tener que implementar de forma local un servidor que ofrezca de estos recursos para que luego, una aplicación Web consuma de estos. • Objetivos de disponibilidad, escalabilidad y eficiencia. Al hacer uso de la computación en la nube, otorgamos a nuestro sistema de una robustez, que, desarrollándolo en un servidor local, no podríamos. Además, con herramientas como AWS Lambda, nuestro servicio solo consume la capacidad de procesamiento que necesita. Esto en conjunción con IoT Core, le otorga una gran capacidad de escalabilidad, por lo que nuestro sistema puede pasar de forma automática de escasas peticiones a un gran número de estas. • Presentación Para que nuestro sistema pueda ser usable por cualquier usuario se hace uso de una aplicación Web. Esta está desarrollada en Angular. Este framework proporciona, entre otras, la capacidad de recarga automática del contenido que se está mostrando en una página, así como la posibilidad de interactuar con una API REST de forma sencilla, haciendo uso del protocolo HTTP. 1.4.2 Funcionalidades De cara al usuario final, el sistema diseñado ofrece las siguientes funcionalidades: • Consulta de los distintos terrarios que hay disponibles para consultar. • Obtención de información de humedad y temperatura de cada uno de los terrarios. • Modificación del nombre de un terrario, así como de su descripción. • Acceso al histórico de humedad y temperatura de un terrario. • Interacción con el sistema IoT, pudiendo activar o desactivar posibles funcionalidades de este, como serían un radiador o una bombilla.
18 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 1.4.3 Esquema de la arquitectura A continuación, se muestra la arquitectura de la solución adoptada: Figura 1: Esquema de la arquitectura GPIO MQTT Reglas IoT NoSQL HTTP Eventos REST Usuario TERRARIO
Introducción 19 Como podemos observar en la Figura 1: Esquema de la arquitectura, en el escenario formado, un terrario a controlar y monitorizar estaría compuesto por un sensor DHT11 y una Raspberry Pi. Esta Raspberry Pi tendría instalado Eclipse Kura, que sería el encargado de obtener la información que los sensores DHT11 envían a la Raspberry Pi, mediante los pines GPIO. Una vez tiene esta información, haciendo uso del protocolo MQTT, publicará en un topic MQTT proporcionado por el IoT Core de Amazon AWS. De esta forma, la Raspberry Pi se convierte en un dispositivo IoT. De igual manera, se suscribirá a otro topic para recibir información del IoT Core, enviándosela posteriormente a la Raspberry Pi. El entorno de Cloud Computing de AWS tendría dos puntos de entrada y salida de información. Uno sería el IoT Core, que mediante el protocolo MQTT se comunicaría con Eclipse Kura y la Raspberry Pi. El otro sería la API REST que proporcionamos haciendo uso del servicio API Gateway, para la comunicación con el usuario, a través de una Aplicación Web Angular. Internamente, en AWS utilizamos 4 servicios: • IoT Core: mediante el cual recibimos/enviamos información perteneciente a los Dispositivos IoT, haciendo uso de MQTT. • API Gateway: proporciona una URL a la que podremos hacer peticiones HTTP, para acceder a los recursos de Amazon AWS. Proporcionaría un servicio REST. • DynamoDB: proporciona una Base de Datos donde almacenaremos el histórico de humedades y temperaturas que ha tenido un Dispositivo IoT. • Lambda Functions: funciones ejecutadas cuando se produce un evento o se activa una Regla IoT. Son el punto de interconexión entre los distintos servicios de AWS. Particularmente: • Almacenará la información en DynamoDB, cuando se produzcan eventos procedentes de la API Gateway de escritura de información (método POST de HTTP) o cuando se actualice el estado de un Dispositivo IoT en el IoT Core. • Proporcionará la información almacenada en DynamoDB cuando un evento procedente de API Gateway se lo solicite mediante un método GET de HTTP. En su conjunto, se forma un sistema interconectado de extremo a extremo, que hace uso de diferentes protocolos, como MQTT o HTTP en cada uno de sus puntos de interconexión. Como resultado, se proporciona la monitorización y control de un terrario. 1.5 Estructura de la memoria Con el fin de facilitar la lectura del documento, se proporciona en este apartado un resumen de cada capítulo: 1. Introducción: Presentación del problema, el contexto que lo involucra y la solución adoptada. 2. Recursos utilizados: Recursos hardware y software utilizados para la lectura de la información, despliegue de las distintas tecnologías empleadas (bases de datos, aplicación web, servicios en la nube) así como para implementar los sensores y su comunicación con el sistema. 3. Tecnologías utilizadas: Resumen de las principales tecnologías utilizadas para la implementación. 4. Aplicación desarrollada: Raspberry Pi y Eclipse Kura: Análisis y Características de la implementación en la Raspberry Pi, así como la publicación de la información en la nube de Amazon.
20 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 5. Aplicación desarrollada: Nube Amazon AWS: Estructura y análisis de la implementación en Amazon AWS (IoT Core, DynamoDB, Lambda, API Gateway). 6. Aplicación desarrollada: Interfaz web Angular: Estructura y análisis de la aplicación web desarrollada en Angular, así como la obtención de la información de la API REST de AWS. 7. Conclusiones y líneas futuras: Ideas y características que podrían implementarse para mejorar el sistema en próximas versiones de este. Además de los capítulos mencionados, se proporciona una serie de Anexos que permitirán implementar el Sistema paso a paso: • Anexo A: Instalación de Sensores DHT11 y Leds en Raspberry Pi. • Anexo B: Instalación y configuración de Eclipse Kura en Raspberry Pi. • Anexo C: Creación de usuarios y configuración de servicios en AWS. • Anexo D: Despliegue del sistema.
Recursos utilizados 21 2 RECURSOS UTILIZADOS continuación se exponen los recursos utilizados para llevar a cabo la implementación. Se detallarán las características más relevantes de cada uno de ellos. 2.1 Recursos Hardware 2.1.1 MacBook Pro El ordenador en el que se ha desarrollado todo el código necesario para que funcione el trabajo ha sido un MacBook Pro-Retina de 13 pulgadas, de principios de 2015. Entre sus especificaciones encontramos: • Procesador Intel Core i5 a 2,7 GHz. • 16 GB de memoria RAM DDR3 a 1867 MHz. • Gráficos Intel Iris Graphics 6100. • 128 GB de almacenamiento SSD. Figura 2: MacBook Pro de 13 pulgadas modelo 2015. A The pessimist sees difficulty in every opportunity. The optimist sees the opportunity in every difficulty. - Winston Churchill -
22 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 2.1.2 Raspberry Pi Model 3B+ Este es el núcleo de procesamiento y comunicación IoT. En esta se conectarán los sensores de los que se obtendrá la información, los leds para indicar que se está actuando en base a las decisiones tomadas. También será el dispositivo encargado de publicar y suscribirse en la nube para el intercambio de información. Por lo tanto, cumple las funciones de Gateway IoT. Figura 3: Raspberry Pi Model 3B+ Especificaciones [1]: • SoC: Broadcom BCM2837B0 quad-core A53 (ARMv8) 64-bit @ 1.4GHz • GPU: Broadcom Videocore-IV • RAM: 1GB LPDDR2 SDRAM • Tarjeta de red: Gigabit Ethernet (via USB channel), 2.4GHz and 5GHz 802.11b/g/n/ac Wi-Fi • Bluetooth: Bluetooth 4.2, Bluetooth Low Energy (BLE) • Storage: Micro-SD • GPIO: 40-pin GPIO header, populated • Puertos: HDMI, 3.5mm analogue audio-video jack, 4x USB 2.0, Ethernet, Camera Serial Interface (CSI), Display Serial Interface (DSI) 2.1.3 Sensor de humedad y temperatura DHT11 Sensor de humedad y temperatura de bajo coste, muy útil para experimentos y usos donde se necesitan gran cantidad de medidas. La versión utilizada de este es la que contiene 3 pines de conexión con los puertos GPIO de la Raspberry Pi. Los valores que es capaz de captar son los siguientes [2]:. El implementado es el que se muestra en la Figura 4: Sensor DHT11. • Humedad: 20-80% (5% precisión) • Temperatura: 0-50°C (±2°C precisión)
Recursos utilizados 23 Figura 4: Sensor DHT11 2.1.4 LEDs Para emitir señales luminosas simulando la actuación sobre cada uno de los posibles elementos con los que interactuar. Los leds son de distintos colores, conectándose estos a la Raspberry Pi a través de una placa de pruebas. Se muestran en la Figura 5: LED Figura 5: LED 2.2 Recursos Software 2.2.1 Sistema Operativo MacOs Mojave Este Proyecto se ha desarrollado sobre MacOs Mojave versión 10.14.6, como sistema operativo para los distintos recursos software que han sido necesarios para el desarrollo de la aplicación. 2.2.2 Navegador Web Google Chrome Se ha utilizado el navegador de Google para la interacción con las distintas interfaces web, así como la depuración y desarrollo de la aplicación web. Figura 4: Google Chrome
24 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 2.2.3 Eclipse IDE Para el desarrollo de los bundles que utilizará Eclipse Kura se ha utilizado el entorno de desarrollo que proporciona Eclipse para Eclipse Kura. [3] Figura 5: Eclipse 2.2.4 Postman Es un entorno de desarrollo de API. Ha sido de gran utilidad para desarrollar la API REST, así como verificar la publicación/suscripción a los diferentes temas MQTT. Figura 6: Postman 2.2.5 StackBlitz y Sublime Text 3 Se han utilizado ambos editores de texto para la codificación. Sublime Text 3 se ha utilizado para desarrollar los controladores de los distintos sensores. Cabe destacar que StackBlitz ha sido de gran utilidad para el desarrollo de la aplicación Web en Angular, ya que permitía la codificación del código online, guardando automáticamente y un control de versiones en GitHub de forma sencilla. Además, permitirá el despliegue de la aplicación Web mediante un navegador web integrado. Figura 6: StackBlitz y Sublime Text 3
Recursos utilizados 25 2.2.6 VNC Permite utilizar de forma remota la Raspberry Pi. Se accede a esta indicando la dirección IP que tiene asignada e iniciando sesión con el nombre de usuario y contraseña que hayamos configurado. Figura 7: VNC
32 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 3.3 Angular Angular es un framework 7 para aplicaciones web desarrollado en TypeScript [22], de código abierto, mantenido por Google, que se utiliza para crear y mantener aplicaciones web de una sola página (SPA). Su objetivo es aumentar las aplicaciones basadas en navegador con capacidad de Modelo Vista Controlador (MVC) 8 , en un esfuerzo para hacer que el desarrollo y las pruebas sean más fáciles. Figura 14: Aplicaciones web de una sola página Una aplicación web SPA creada con Angular es una web de una sola página, en la cual la navegación entre secciones y páginas de la aplicación, así como la carga de datos, se realiza de manera dinámica, casi instantánea, asíncronamente haciendo llamadas al servidor (backend con un API REST) y sobre todo sin refrescar la página en ningún momento. Angular se basa en clases tipo "Componentes.ts", cuyas propiedades son las usadas para hacer el binding 9 de los datos. En dichas clases tenemos propiedades (variables) y métodos (funciones a llamar). Angular es la evolución de AngularJS [23] aunque incompatible con su predecesor. Figura 15: Arquitectura Angular 7 Un framework es una estructura conceptual y tecnológica de asistencia definida, normalmente, con artefactos o módulos concretos de software, como librerías, que puede servir de base para la organización y desarrollo del software. 8 Modelo-vista-controlador (MVC) es un patrón de arquitectura de software, que separa los datos y la lógica de negocio de una aplicación de su representación y el módulo encargado de gestionar los eventos y las comunicaciones. 9 Binding: Enlazado o unión de variables.
Tecnologías utilizadas 33 A continuación, se explicará la arquitectura que tiene una aplicación en Angular. Para que sea más visual la arquitectura que queremos explicar, cada uno de los apartados que se muestran a continuación hacen referencia a los mostrados en la Figura 15: Arquitectura Angular . 3.3.1 Módulos El bloque básico para construir una aplicación en Angular son los NgModules, estos proporcionan una compilación de los distintos componentes, teniendo en cuenta el contexto y haciendo uso de los módulos que necesite. Será necesario un módulo root, el cual nos permitirá indicar el resto de los módulos de los que queremos hacer uso para lanzar la aplicación. Este se llama por convención AppModule. Esto ayuda a organizar el código en módulos funcionales, de forma que la administración del desarrollo en aplicaciones complejas sea más sencilla. 3.3.2 Componentes Cada aplicación en Angular tiene, al menos, un componente: el componente root. Este se encarga de conectar los distintos componentes con el contenido que se transfiere a la página Web, conocido como document object model (DOM). Cada componente define una clase que contiene los datos de la aplicación y la lógica de esta. Esta clase es asociada con una plantilla HTML, que define la vista en la que se va a mostrar. Para identificar una clase como componente se utiliza el decorator 10 @Component(). Este identifica a la clase en la que se escribe como un componente y le asocia un metadato específico que lo identifica como clase. 3.3.3 Plantillas, directivas y enlace de datos Las plantillas combinan HTML con marcado en Angular para que los elementos HTML puedan ser modificados antes de ser mostrados. Las directivas de las plantillas proporcionan al programa la lógica y el marcado para el enlazado que conecta los datos de la aplicación con el DOM. Hay dos tipos de enlazado de datos: • Event binding: deja a tu aplicación responder a una entrada de información por parte del usuario, actualizando los datos de la aplicación. • Property binding: deja interpolar los valores que han sido obtenidos desde los datos de la aplicación al HTML. Antes de que una vista sea presentada, Angular evalúa las directivas y resuelve el enlazado, haciendo uso de las plantillas, para modificar los elementos HTML o el DOM, de acuerdo con la lógica del programa. 3.3.4 Servicios e inyección de dependencias Para los datos o la lógica que no está asociada con una vista específica y se quiere compartir con los distintos componentes, se crean clases de Servicios. Para la definición de una clase Servicio, se debe acompañar del decorator @Injectable (). Este proporciona los metadatos para que otros componentes puedan inyectar estas dependencias en sus clases. La inyección de dependencias te permite que tus clases sean limpias y eficientes, ya que no obtienen la información directamente del servidor, sino que delega esto a los servicios, que inyectan lo obtenido. 10 Un decorator es una función que modifica las clases de JavaScript. Angular tiene definidos una serie de decorators que asocia metadatos específicos a las clases. De esta forma, el sistema sabe qué clases son y cómo deben funcionar.
34 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 3.3.5 Routing El NgModule Router de Angular proporciona un servicio que te deja definir una ruta de navegación para los diferentes estados y vistas de la aplicación. De esta forma podemos acceder a cada una de las vistas de la aplicación haciendo uso de la URL en la barra de navegación del buscador o asociando botones de las vistas a rutas.
Aplicación desarrollada: Raspberry Pi y Eclipse Kura 35 4 APLICACIÓN DESARROLLADA: RASPBERRY PI Y ECLIPSE KURA a arquitectura del sistema diseñado, consta de tres bloques diferenciados. La implementación en la Raspberry Pi, la parte en la nube de Amazon y la aplicación Web. En este capítulo se profundiza en la implementación que involucra la Raspberry Pi, así como su integración con Eclipse Kura. 4.1 Lectura de información de los sensores en la Raspberry Pi Los sensores DHT11, se comunican mediante comunicación serie a través de los pines GPIO de la Raspberry Pi. Estos estarán conectados a esta tal y como se indica en el Anexo A: Instalación de Sensores DHT11 y Leds en Raspberry Pi. A través de estos se puede obtener la información de temperatura y humedad. Para ello, necesitan hacer uso de una librería de Python, llamada Adafruit. Esta se encarga de convertir la información recibida mediante comunicación serie a un valor de temperatura y humedad válido. Para la implementación de esta, se ha utilizado Python 3. El código que es capaz de suministrar esta información se corresponde con el fichero AdafruitDHT.py. Este código viene incluido como un enlace, en el paquete que vienen los sensores. Para descargar este se puede acceder a la Web proporcionada como referencia [2]. Para ejecutarlo tenemos que ejecutar el comando que vemos a continuación y pasarle como parámetros el tipo de sensor DHT que es, que en nuestro caso es 11 y el pin GPIO al que está conectado, que en nuestro caso es el 20. $ python AdafruitDHT.py 11 20 La información obtenida de esta lectura será escrita en el fichero temperatura.log donde se almacenará el histórico de temperatura y humedades. El bundle de Eclipse Kura accederá a este y obtendrá la información de los sensores. L I have not failed. I´ve just found 10,000 ways that won´t work. - Thomas A. Edison -
36 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 4.2 Publicación y suscripción de la información IoT Core de Amazon AWS. Servicio CloudService. Para la comunicación con el servicio IoT que proporciona Amazon AWS, utilizaremos el protocolo MQTT. Publicaremos y nos suscribiremos a los topics que el IoT Core nos proporciona para la interacción con las sombras. Los topics se ven en el capítulo 5.1.1 Interacción con el Objeto: Thing Shadow. Eclipse Kura proporciona un servicio para ello, CloudService [24]. Este nos proporcionará los servicios que podemos ver en la Figura 16: CloudService. Figura 16: CloudService Para nuestro sistema, han sido de utilidad los servicios: • CloudPublisher: Permite a las aplicaciones publicar en una plataforma cloud. • CloudSuscriber: Permite a las aplicaciones suscribirse a una plataforma cloud. Para que todo funcione, es necesario establecer conexión con un CloudEnpoint. En nuestro caso será el proporcionado por Amazon AWS. En el apartado Configuración para la compatibilidad con AWS, del Anexo B: Instalación y configuración de Eclipse Kura en Raspberry Pi, se muestra cómo crear un CloudService, asociándole un CloudEndpoint [25]. Una vez se ha creado el CloudService, podemos modificar mediante la interfaz Web de Eclipse Kura parámetros de este en el apartado MQTTDataTransport de Cloud Connections, en nuestro caso, asignamos los que se pueden ver en la Figura 17: MQTTDataTransport. Son los siguientes:
Aplicación desarrollada: Raspberry Pi y Eclipse Kura 37 • Broker-url: CloudEndpoint proporcionado por Amazon AWS. • Account-Name: Para una conexión con Amazon AWS. En nuestro caso lo llamaremos aws. • Client-id: Opcional, en nuestro caso le hemos puesto things. Lo utilizaremos para establecer la ruta en la que publicar/suscribirnos. • Topic: Topic en el que queremos publicar. En nuestro caso será $#account-name/#client-id. El "#" lo relaciona con los parámetros (account-name, client-id) mencionados anteriormente. Con esta configuración, los publicadores/suscriptores lo harán en los topics del CloudEndpoint indicado en el campo Broker-url. Además, lo harán con la ruta $aws/things gracias a la información del campo Topic. Figura 17: MQTTDataTransport 4.2.1 CloudPublisher Para publicar la información en un topic de Amazon AWS, crearemos un servicio CloudPublisher. Para crear uno, lo hemos realizado tal y como se indica en el tutorial de Eclipse Kura [25]. Partiendo de que ya hemos creado el CloudService, como se indica en el Anexo B: Instalación y configuración de Eclipse Kura en Raspberry Pi. Debemos ir al menú que aparece en la parte izquierda de la interfaz Web de Eclipse Kura. En este seleccionamos Cloud Connections. Hacemos click sobre el CloudService que tenemos creado. Presionamos sobre el botón que indica New Pub/Sub. Le asignamos el PID (nombre) que queramos y elegimos que queremos un Publisher. A continuación, se nos mostrará el desplegable de configuración que se muestra en la Figura 18: CloudPublisher.
38 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 18: CloudPublisher Lo destacable de la configuración, que podemos ver en la Figura 18: CloudPublisher es que le hemos indicado en el campo Application Id, la ruta para hacer referencia a la sombra de un objeto, en este caso kura-gateway/shadow. En el campo Application Topic, le hemos asignado update, ya que cuando publicamos, lo que queremos es actualizar una sombra. Por lo tanto, la ruta del topic en el que vamos a publicar es: $aws/things/kura-gateway/shadow/update En el apartado 5.1.1 Interacción con el Objeto: Thing Shadow veremos que se corresponde con la ruta que nos proporciona IoT Core de AWS para actualizar el estado de una sombra mediante MQTT. 4.2.2 CloudSuscriber La información y configuración en el CloudSuscriber es análoga a la del CloudPublisher. Por lo que para crear un CloudSuscriber, lo podemos hacer como se ha indicado en el apartado 4.2.1 CloudPublisher, pero indicando que queremos un CloudSuscriber en lugar de un CloudPublisher. Lo destacable de este es la ruta del topic a la que nos vamos a suscribir, que es: $aws/things/kura-gateway/shadow/update/accepted Esta es la ruta en la que se publica el estado de una Sombra una vez se ha actualizado. Para poder ver la información que recibimos de este, lo vamos a enlazar con el servicio Logger que proporciona Eclipse Kura. Este servicio nos escribirá en el fichero /var/log/kura.log toda la información que recibamos. Para realizar el enlazado, se puede hacer mediante la interfaz Web de Eclipse Kura. Se hace de manera gráfica, tal y como se puede ver en la Figura 19: Kura Wires.
Aplicación desarrollada: Raspberry Pi y Eclipse Kura 39 Se deben seleccionar de la columna Wire Components los componentes que queremos enlazar, en este caso Suscriber y Logger. Con el uso del ratón se conectan ambos componentes. Figura 19: Kura Wires De esta forma, si mostramos el contenido del fichero /var/log/kura.log obtenemos la información recibida del topic al que nos hemos suscrito. Esto se muestra en la Figura 20: Fichero /var/log/kura.log. Figura 20: Fichero /var/log/kura.log 4.3 Bundle implementado en Eclipse Kura: Heater Como ya se comentó en la sección 3.1.1.1 Bundles, los bundles son unos JAR y un manifiesto. Para implementar estos bundles, es necesario utilizar Eclipse como entorno de desarrollo [26]. Para desarrollar nuestros bundles se han utilizado los ejemplos que aparecen en esta documentación. La clase que se encarga de obtener la información de los sensores y de implementar los métodos necesarios para el funcionamiento de cada uno de los servicios que utiliza y exporta es la clase Heater.java.
40 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular A continuación, se van a detallar los ficheros de metadatos del bundle, los servicios que esta usa y su funcionamiento. 4.3.1 Ficheros de metadatos Proporcionarán información acerca de nuestro bundle. Estos ficheros son: MANIFEST.MF y component.xml 4.3.1.1 MANIFEST.MF El fichero MANIFEST.MF de nuestro proyecto es el siguiente: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.kura.demo.heater Bundle-SymbolicName: org.eclipse.kura.demo.heater;singleton:=true Bundle-Version: 1.0.600.qualifier Bundle-Vendor: Eclipse Kura Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Service-Component: OSGI-INF/*.xml Bundle-ActivationPolicy: lazy Import-Package: org.eclipse.kura.cloud;version="[1.0,2.0)", org.eclipse.kura.cloudconnection.listener;version="[1.0,2.0)", org.eclipse.kura.cloudconnection.message;version="[1.0,2.0)", org.eclipse.kura.cloudconnection.publisher;version="[1.0,2.0)", org.eclipse.kura.configuration;version="[1.0,2.0)", org.eclipse.kura.message;version="[1.0,2.0)", org.osgi.service.component;version="1.2.0", org.slf4j;version="1.6.4" Con la cabecera Manifest-Version indicamos la versión de la especificación para ficheros manifiesto que sigue el fichero. En este caso la 1.0. El resto de las cabeceras que comienzan por Bundlenos especifican características de OSGi. Las más destacadas son: • Bundle-Name: Especifica el nombre del bundle. • Bundle-SymbolicName: Especifica el nombre del paquete que identifica al bundle. • Bundle-Version: Especifica la versión del bundle. • Bundle-RequiredExecutionEnvironment: Especifica la versión de Java con la que se ejecuta. Con la cabecera Service-Component: especificamos la ruta local al proyecto donde se sitúa un fichero de definición del componente component.xml. Mediante la cabecera Import-Package indicamos las dependencias necesarias del workspace de Kura para el funcionamiento de nuestro Bundle. 4.3.1.2 component.xml Este fichero nos permite indicar cual es la clase principal del bundle, los servicios que implementa, exporta y utiliza. En nuestro proyecto es el siguiente:
Aplicación desarrollada: Raspberry Pi y Eclipse Kura 41 <?xml version="1.0" encoding="UTF-8"?> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.2.0" name="org.eclipse.kura.demo.heater.Heater" activate="activate" deactivate="deactivate" modified="updated" enabled="true" immediate="true" configuration-policy="require"> <implementation class="org.eclipse.kura.demo.heater.Heater"/> <property name="service.pid" type="String" value="org.eclipse.kura.demo.heater.Heater"/> <service> <provide interface="org.eclipse.kura.configuration.ConfigurableComponent"/> </service> <reference name="CloudPublisher" policy="dynamic" bind="setCloudPublisher" unbind="unsetCloudPublisher" cardinality="0..1" interface="org.eclipse.kura.cloudconnection.publisher.CloudPublisher"/ > </scr:component> El elemento raiz es scr:component. Mediante el elemento implementation indicamos que clase es nuestra clase componente. Esta clase que se encarga de implementar los métodos activate y deactivate para arrancar y parar el bundle. Este además contiene un elemento service por cada servicio que implementa y exporta. Contiene un elemento reference por cada servicio que utiliza. En este caso implementa y exporta ConfigurableComponent y utiliza el servicio CloudPublisher. En cada elemento service, indicamos mediante el elemento provide cuál es la interfaz del servicio que se implementa. En nuestro caso: org.eclipse.kura.configuration.ConfigurableComponent. En cada elemento reference, indicamos mediante el atributo: • name: El nombre del servicio. • policy: Política asociada. • bind: Método llamado para obtener la referencia del servicio. • unbind: Método llamado para eliminar la referencia del servicio. Por lo tanto, la clase Heater debe: • Implementar la interfaz ConfigurableComponent. • Implementar los métodos activate, deactivate y update. • Implementar los métodos setCloudPublisher y unsetCloudPublisher.
48 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 25: Kura Wires El contenido del script es el siguiente: var record = input.records[0] //Se obtiene la información del Suscriber for (var prop in record) { // Se itera en el contenido recibido if(record[prop].getType()==BOOLEAN){ //Se busca el campo con información booleana logger.info('{}: {}', prop, record[prop]) var counterRecord = newWireRecord() //Flujo de salida counterRecord.LED = record[prop] // Se asigna el valor al Led output.add(counterRecord) //Se inserta el valor en el flujo de salida } } De esta forma, se consigue encender/apagar el LED conectado al pin GPIO 21 cuando se reciba información de control (boolean) en el topic al que está suscrito el CloudSuscriber. En las figuras: Figura 26: Control enciende LED, Figura 27: Control apaga LED, se refleja el mensaje MQTT que produce este cambio.
Aplicación desarrollada: Raspberry Pi y Eclipse Kura 49 Figura 26: Control enciende LED Figura 27: Control apaga LED
50 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 5 APLICACIÓN DESARROLLADA: CLOUD COMPUTING EN AMAZON AWS ran cantidad del desarrollo realizado en este trabajo está directamente implementado sobre los servicios que proporciona el entorno de Amazon Cloud Computing. En este capítulo se analiza cómo se ha conseguido desarrollar en este entorno concreto tanto el conexionado de los servicios que ofrece, como el código que lo hace posible. En el Anexo C: Creación de usuarios y configuración de servicios en AWS, se muestra la información necesaria para registrarnos en AWS, así como los pasos necesarios para crear cada uno de los servicios utilizados. 5.1 IoT Core: Puerta de acceso al Cloud Computing para un Gateway IoT. Nuestro sistema está pensado para que pueda ser usado tanto por un único terrario, como por múltiples terrarios que podrían llegar a agruparse en tiendas. Para simplicidad y facilidad, se va a suponer que un terrario contiene una RaspberryPi, junto con los sensores necesarios para obtener la información. Así es como se muestra en la Figura 1: Esquema de la arquitectura. Es por esto por lo que es de vital importancia separar la información de cada terrario. Del mismo modo, es necesario que cada terrario tenga una identidad y que esto le permita manejar su información de manera segura, es decir, que nadie que no tenga permisos para acceder a la información de este pueda enviar u obtener información relativa a él. Para ello se hace uso del componente Registro que proporciona IoT Core. Cada terrario se creará en el sistema como un "Objeto" en el registro de "Objetos". Para más información de cómo registrar un objeto en IoT Core, consultar el apartado 7.4 IoT Core del Anexo C: Creación de usuarios y configuración de servicios en AWS. Como podemos observar, hemos creado un Objeto denominado "kura-gateway" correspondiente a una Raspberry Pi con Eclipse Kura instalado. Para cada objeto, en su creación se crea y se activa un certificado, del cual podemos obtener su clave privada. Esto se muestra en la Figura 28: Certificado asociado a un objeto. G If your business is not on the Internet, then your business will be out of business. - Bill Gates -
Aplicación desarrollada: Cloud Computing en Amazon AWS 51 Figura 28: Certificado asociado a un objeto Con este certificado, el Objeto adquiere una Identidad, que utiliza el componente Servicio de seguridad e identidad para que la Raspberry Pi pueda conectarse a la nube y acceder a la información en su nombre. La funcionalidad del servicio de seguridad e identidad es la que se detalla en el apartado 3.2.1 AWS IoT Core A este certificado se le van a asociar unas Políticas personalizadas, que nos van a permitir restringir el número de Raspberry Pi que pueden publicar en un Objeto. Para su simplicidad, se tendrá en cuenta la consideración realizada anteriormente y a cada objeto asignaremos una Raspberry Pi.
52 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 29: Política asociada a un certificado Como vemos en la Figura 29: Política asociada a un certificado, el documento de una política se escribe en formato JSON, y su objeto Statement contiene una serie de reglas en las que se especifica si se permite o no (Effect) una operación (Action) sobre un recurso (Resource) [30]. Si quisiéramos asignar una restricción de los dispositivos que se pueden conectar bastaría con cambiar a " Resource" : " topic_publicación_eclipse_kura 12 " 5.1.1 Interacción con el Objeto: Thing Shadow Para cada objeto se crea una Sombra de este, haciendo uso del componente Sombra del Dispositivo, que no es más que un documento JSON que nos indica el estado de un objeto. 12 topic_publicacion_eclipse_kura: Ruta del topic MQTT en el que se quiera publicar/suscribir.
Aplicación desarrollada: Cloud Computing en Amazon AWS 53 Figura 30: Sombra de un Objeto Como podemos ver en la Figura 30: Sombra de un Objeto, cada Sombra puede tener varios estados, con información relativa a este. • El estado desired corresponde a una información de estado deseado. En este campo es donde se modificará y almacenará la información procedente de la aplicación Web para controlar cada uno de los terrarios. • El estado reported corresponde a una información de estado reportado. En este campo es donde se modificará y almacenará la información procedente del Dispositivo Kura, ya que contendrá la información reportada por cada uno de los sensores. • El estado delta corresponde a una información de estado variante. En este campo se incluye la información que se ha modificado en la última actualización de una Sombra. Es de gran utilidad para comprobar que todo funciona según lo esperado y no se ha producido ningún error. Para poder interactuar con los distintos objetos creados utilizaremos el componente Servicio Device Shadow. La funcionalidad de este se indica en el apartado 3.2.1 AWS IoT Core. Este componente nos proporciona la posibilidad de actualizar y obtener información de una Sombra mediante: 1. Un punto de enlace a una API REST [31]: Esta API es la que utilizaremos para actualizar la información de la sombra desde la aplicación Web. Los métodos que proporciona son: GET, UPDATE y DELETE. 2. Un tema MQTT para actualizar, obtener o eliminar la información de estado de una Sombra [32]: En los temas MQTT que podemos ver en la Figura 31: Servicio Device Shadow, nos suscribiremos y publicaremos la información obtenida procedente/destinada a la Raspberry Pi.
54 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 31: Servicio Device Shadow 5.1.2 Reglas Las reglas son una parte fundamental para la interconexión entre los distintos servicios que proporciona AWS. Estas son acciones que realizar cuando se produce un evento dado, ya sea un mensaje recibido/enviado por un objeto o actualizar la sombra de este. Estas reglas necesitan saber el origen de los mensajes, y los atributos que se quieren de este. Para facilitar su uso, estas consultas se realizan en lenguaje SQL: SELECT <Attribute> FROM <Topic Filter> WHERE <Condition> En la Figura 32: Acciones AWS, se muestran las diferentes acciones que se pueden hacer desde el IoT Core.
Aplicación desarrollada: Cloud Computing en Amazon AWS 55 Figura 32: Acciones AWS Para el desarrollo de nuestra plataforma, han sido de gran utilidad las reglas de Insertar un mensaje en una tabla de DynamoDB, así como Invocar a una función Lambda para pasar los datos del mensaje. El funcionamiento de estas se detallará en los apartados a continuación. Para el desarrollo de nuestra aplicación, hemos creado una regla llamada sendToDB. Esta se encarga de invocar una función Lambda cuando se actualiza la Sombra de un Objeto. Cuando se produce la regla, a la función Lambda se le pasa el contenido de esta sombra, así como el nombre del Objeto al cual se le está actualizando la Sombra. Esto se consigue con la sentencia SQL: SELECT state.reported.* , state.desired.* , topic(3) AS kuraId FROM '$aws/things/+/shadow/update/accepted' Ya que estaríamos haciendo un SELECT sobre el topic en el que se guarda la información actualizada de una Sombra ($aws/things/+/shadow/update/accepted) y extrayendo los parámetros de estado "deseado" y "reportado". Como aclaración, el '+' es el elemento comodín para elegir el topic, (es como un *). Significa cualquiera. Esto es de gran utilidad de cara a la escalabilidad, ya que vamos a poder utilizar la misma regla para obtener la Sombra de todos los Objetos que tengamos creados. Para saber de qué objeto se ha obtenido la información, se obtiene también el parámetro topic (3), correspondiente al tercer elemento de la ruta del topic, que se correspondería con lo que se introduce en el elemento '+'. En caso de que se produzca algún error se enviará un mensaje con los datos de error a CloudWatch 13 . Desde la interfaz Web de AWS, una vez se ha creado la regla, se nos debe mostrar la información contenida en la Figura 33: Regla SendToDB. 13 CloudWatch es el servicio de eventos y alertas interno de Amazon AWS.
56 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 33: Regla SendToDB 5.2 Dynamo DB Para almacenar la información perteneciente a los estados de las distintas Sombras, utilizaremos una Base de Datos noSQL. El objetivo de esta Base de Datos es la de almacenar un histórico de los distintos estados en los que se ha encontrado un terrario, para poder visualizarlo y actuar en consecuencia. Además, esta será la Base de Datos a la que se acceda mediante la API REST proporcionada por API Gateway. Hemos creado una tabla llamada terrario. Esta tiene una clave primaria llamada kuraId (string) y una clave de ordenación llamada date (number). Se han elegido de esta forma ya que identificaremos a cada terrario por su nombre y utilizaremos la clave de ordenación para acceder al histórico de información por fechas de un terrario. Una vez hayamos creado la tabla, se nos debe mostrar la información que se muestra en la Figura 34: Información Base de Datos terrario. La Base de Datos posee un ARN propio, que utilizaremos para asignar los distintos permisos necesarios para poder leer/escribir en esta desde el resto de los servicios de AWS. Tanto la creación de la Base de Datos como el ARN se ve en más detenimiento en el Anexo C: Creación de usuarios y configuración de servicios en AWS, apartado 7.5 DynamoDB.
Aplicación desarrollada: Cloud Computing en Amazon AWS 57 Figura 34: Información Base de Datos terrario Para el uso que se ha definido, la tabla contendrá elementos con información: • kuraId (string): Nombre identificativo que se le asigna al terrario. • date (number): Fecha en la que se ha incluido la información. • name (string): Nombre que indica información acerca del terrario, como el dueño o la tienda. • type (string): Campo que indica si la información introducida es de tipo desired o reported. • humidityDesired (string): Humedad deseada. • humidityReported (string): Humedad reportada. • temperatureDesired (string): Temperatura deseada. • temperatureReported (string): Temperatura reportada. • moistureReported (string): Campo que indica si ha habido alguna incidencia o no. • id (number): Índice que hace referencia a un terrario en un momento dado. Es de utilidad para acceder a un estado dado del terrario desde la aplicación Web. En la Figura 35: Elementos de terrario, podemos observar cómo se visualizan los distintos elementos que se incluyen en la tabla. Figura 35: Elementos de terrario
64 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Como podemos observar en la Figura 44: Función dynamodb_write, tiene un evento desencadenador, la API Gateway. Por lo tanto, el contenido del objeto event contendrá la información relativa a la petición HTTP que se haga a esta. En el apartado de API Gateway se indica cómo se tiene que enviar esta información para que ambos extremos puedan funcionar. Se responderá a la petición HTTP con el resultado de la ejecución del código. Como esta función se encarga de actualizar el estado de la Sombra, no es necesario que acceda a la Base de Datos, pero si a la Sombra del Objeto. Para ello, son necesarias las líneas de código: const AWS = require('aws-sdk'); var config = { "thingName":"kura-gateway", "endpointAddress":"a2if4dwpo41h6e-ats.iot.eu-west3.amazonaws.com" }; var iotdata = new AWS.IotData({endpoint: config.endpointAddress}); Donde thingName se corresponde con el nombre del Objeto al que queremos acceder y endpointAddress es la dirección correspondiente al punto de acceso personalizado que podemos obtener en nuestro IoT Core. En el Anexo C: Creación de usuarios y configuración de servicios en AWS, IoT Core se ve de forma detallada como obtener esta dirección. La dirección es la que se muestra en la Figura 45: Punto de acceso personalizado. Figura 45: Punto de acceso personalizado Para que la actualización de la Sombra sea posible, creamos una variable llamada update, con la información perteneciente al estado "desired" 14 que puede tener la Sombra de un Objeto. Con el método updateThingShadow() actualizaremos la información de la Sombra, incluyendo en esta la información de la variable update [34]. El contenido de este se muestra en la Figura 46: Método updateThingShadow. 14 Como mencionamos en el apartado 5.1.1 Interacción con el Objeto: Thing Shadow, el estado "desired" es el que utilizaremos para almacenar la información perteneciente a la interacción de la aplicación Web, por lo que es este el estado que actualizaremos.
Aplicación desarrollada: Cloud Computing en Amazon AWS 65 Figura 46: Método updateThingShadow Cabe destacar que como con esta función lo que actualizamos es la Sombra de un Objeto, como consecuencia directa, se invoca la función Lambda shadowToDB, por lo que también se actualizaría la Base de Datos con la información del nuevo estado de la Sombra. Por lo tanto, si realizamos una petición POST a la URL que nos proporciona la API Gateway, que veremos en el apartado 5.4 API Gateway, con la información de un nuevo estado de la Sombra, esta se actualizará y podremos consultarlo tanto en el IoT Core, como en la Base de Datos. Para esta petición hacemos uso de Postman. Esto se recoge en las figuras: Figura 47: Actualización sombra mediante POST usando Postman, Figura 48: Sombra actualizada en IoT Core y Figura 49: Base de Datos actualizada con el nuevo estado de la sombra. Figura 47: Actualización sombra mediante POST usando Postman
66 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 48: Sombra actualizada en IoT Core Figura 49: Base de Datos actualizada con el nuevo estado de la sombra. 5.4 API Gateway Para que nuestro sistema serverless en la nube sea de utilidad, es necesario que otras aplicaciones puedan acceder, sin tener conocimiento de cómo estén implementadas estas a través de una API. Amazon AWS propone una herramienta denominada API Gateway para ello. Esta nos proporciona acceso a los recursos que tenemos en AWS a través de una API REST. Por lo tanto, podremos acceder a este servicio realizando peticiones HTTP.
Aplicación desarrollada: Cloud Computing en Amazon AWS 67 Gracias a esto, tendremos desarrollado el backend de nuestra aplicación, sin tener que desplegar nosotros mismos un servidor local, sino que lo "tendremos en la nube". Para que sea más visual lo que se quiere conseguir con todos estos servicios, es de gran ayuda la Figura 50: Backend IoT AWS [35]: Figura 50: Backend IoT AWS Como podemos ver, el backend de nuestro sistema estaría compuesto por: • Entorno IoT: El cual involucra la Sombra de un Objeto. Interaccionaremos con esta mediante su topic IoT. Además, tendremos una serie de reglas que tienen como objetivo final introducir la información de esta Sombra en una Base de Datos. Para ello se hará uso de una función Lambda llamada shadowToDB. • Entorno Web: En este entorno obtenemos/modificamos la información que hemos almacenado tanto en la Sombra de un Objeto, como en la Base de Datos mediante HTTP. Para ello haremos uso de una API REST, proporcionada por API Gateway. Esta invocará a la función Lambda dynamodb_read si queremos leer información de la Base de Datos o a la función dynamodb_write si queremos publicar información en el topic IoT para actualizar una sombra, y como consecuencia, actualizar la Base de Datos. Para ello, en la herramienta API Gateway crearemos una API, llamada kura. La información de cómo crear una API se recoge en el Anexo C: Creación de usuarios y configuración de servicios en AWS. En la Figura 51: API kura podemos ver la API creada. Figura 51: API kura
68 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular En esta crearemos los métodos mediante los cuales queremos acceder a los recursos. En nuestro caso serán los métodos GET y POST para obtener y modificar la información respectivamente. En el Anexo C: Creación de usuarios y configuración de servicios en AWS, apartado 7.7 API Gateway se indica como crear los diferentes métodos que se muestran en la Figura 52: Recursos API kura. Figura 52: Recursos API kura 5.4.1 Método GET El método GET correspondiente a la API REST llamada kura, que se ha creado con API Gateway, se ha configurado para que llame a una función Lambda. En este caso a la función dynamodb_read, vista en el apartado 5.3.2 Función dynamodb_read. Un esquema de este método se muestra en la Figura 53: Método GET. En este se muestra la secuencia en la que se produce la ejecución de un método GET. No se le han configurado parámetros de seguridad, por lo que actualmente, cualquiera que disponga de la URL que nos proporciona la API al implementarla, podrá acceder a la información de la Base de Datos.
Aplicación desarrollada: Cloud Computing en Amazon AWS 69 Figura 53: Método GET Para que podamos acceder a la base de datos y consultar un único elemento de la tabla (utilizar método get () de la función Lambda), es necesario que añadamos una plantilla de mapeo como la que se muestra en la Figura 54: Plantilla de mapeo GET. En el Anexo C: Creación de usuarios y configuración de servicios en AWS se indica como crear tanto un método de la API como las plantillas de mapeo. Figura 54: Plantilla de mapeo GET Esto lo que indica son los distintos parámetros que podemos obtener en la petición GET. En este caso, tenemos un campo en formato JSON: "kuraId":"identificador", cuando enviemos la información a la función Lambda, se corresponderá con la información que contenga event.kuraId. 5.4.2 Método POST El método POST correspondiente a la API REST llamada kura, que se ha creado con API Gateway, se ha configurado para que llame a una función Lambda. En este caso a la función dynamodb_write, vista en el apartado 5.3.3 Función dynamodb_write. Un esquema de este método se muestra en la Figura 55: Método POST. En este se muestra la secuencia en la que se produce la ejecución de un método POST. No se le han configurado parámetros de seguridad, por lo que actualmente, cualquiera que disponga de la URL que nos proporciona la API al implementarla, podrá acceder a la información de la Base de Datos.
70 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 55: Método POST Para que podamos actualizar la información de la Sombra, es necesario que añadamos una plantilla de mapeo, para que la nueva información se traslade a la función Lambda tal y como esta lo espera. Esta se muestra en la Figura 56: Plantilla de mapeo POST. En el Anexo C: Creación de usuarios y configuración de servicios en AWS se indica como crear tanto un método de la API como las plantillas de mapeo. Figura 56: Plantilla de mapeo POST
Aplicación desarrollada: Cloud Computing en Amazon AWS 71 Esto lo que indica es la información recibida en formato JSON, de igual manera que con el método GET. 5.4.3 Implementación de la API Una vez hemos creado los distintos métodos que tendrá nuestra API, tendremos que implementarla, para que consigamos una URL a la cual acceder. Para ellos tenemos que crear una Etapa. Esto nos permite tener varias API de unos mismos métodos, con el fin de poder probar nuevas versiones de la API sin que la que está en funcionamiento deje de estarlo. En nuestro caso, crearemos la Etapa prod. Para más información de cómo crear una Etapa, consultar el Anexo C: Creación de usuarios y configuración de servicios en AWS. En la Figura 57: Etapa prod se muestra la API implementada. Figura 57: Etapa prod Si queremos acceder a los recursos que proporciona esta API, tendremos que acceder a la URL https://lvjjltcwr8.execute-api.eu-west-3.amazonaws.com/prod/kura El resultado es el que se muestra en la Figura 58: Acceso API. Como podemos ver, la información mostrada se corresponde con el de la base de datos anteriormente mostrada en la Figura 49: Base de Datos actualizada con el nuevo estado de la sombra.. Figura 58: Acceso API
72 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 6 APLICACIÓN DESARROLLADA: INTERFAZ WEB ANGULAR ara poder obtener toda la información almacenada en la Base de Datos, así como poder interactuar con la Sombra de un Objeto y por consecuente, la Raspberry Pi, se ha proporcionado una interfaz de usuario o frontend desarrollado en Angular. 6.1 Módulos utilizados En el fichero app.module.ts es donde hemos indicado los distintos módulos de Angular que vamos a utilizar, así como los componentes que hemos declarado nosotros mismos. Figura 59: Módulo app.module.ts P The only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle - Steve Jobs -
Aplicación desarrollada: Interfaz web Angular 73 Como podemos ver en la Figura 59: Módulo app.module.ts, se importan al código los distintos módulos y componentes a través de las rutas donde se encuentran cada uno de los módulos que se quieren referenciar posteriormente en @NgModule{}. Los módulos que se importan provienen de la librería de Angular y son: • BrowserModule: Permite hacer búsquedas de elementos en los datos de la aplicación. • FormsModule: Permite rellenar un formulario y transferir la información a los datos de la aplicación. • AppRoutingModule: Permite hacer Routing dentro de la aplicación. • HttpClientModule: Permite hacer peticiones HTTP a la API REST. Los componentes que se declaran y exportan como consecuencia, son los creados para llevar a cabo las funcionalidades deseadas y son: • AppComponent: Componente principal, es la primera vista que se muestra. Se encarga de llamar al resto de componentes. • DashboardComponent: Componente que muestra los últimos terrarios a los que hemos accedido, permitiendo hacer click en ellos para obtener una información más detallada. • TerrariosComponent: Componente que almacena cada uno de los terrarios, así como la información reciente de cada uno de estos. • TerrariosDetailComponent: Componente que contiene la información de cada uno de los terrarios, así como el histórico de temperatura de estos. • MessagesComponent: Componente que nos permite saber el estado de cada una de las peticione realizadas, en forma de mensajes, para la depuración. La implementación de estos componentes se detalla en el apartado 6.3 Componentes Implementados. 6.2 Servicio Terrario Service Este servicio es el encargado de realizar las peticiones HTTP a la API REST que nos proporciona API Gateway, vista en el apartado 5.4 API Gateway. Para ello hace uso del módulo HTTPClient. Este proporciona los métodos GET y POST necesarios para obtener la información almacenada en AWS. Los parámetros de configuración que vamos a utilizar son los que se muestran en la Figura 60: Configuración terrario.service.ts.
80 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular @Component({ selector: 'app-terrarios', templateUrl: './terrarios.component.html', styleUrls: ['./terrarios.component.css'] }) Creamos dos objetos, para hacer el mapeo del JSON obtenido a clases a las que podamos acceder. terrarios: Terrario[]; items: Items; Por último, cabe destacar el método que se llamará para obtener los terrarios. Este se suscribirá a el método getTerrarios() de TerrarioService. getTerrarios(): void {this.terrarioService.getTerrarios() .subscribe(items => { this.items = { items: (items as any).Items, count: (items as any).Count, scannedCount: (items as any).ScannedCount }; this.terrarios = this.items.items; console.log(this.terrarios); }); } Esto lo que hace es asignar al objeto items, el JSON obtenido de la petición GET. Posteriormente, al objeto terrarios se le asignan todos los terrarios que se obtienen, que es el contenido de la variable items del objeto items. De esta forma, la vista obtiene todos los terrarios. 6.3.4 Componente Dashboard Component Este componente nos permite obtener una vista rápida de los últimos terrarios a los que hemos accedido. 6.3.4.1 Vista HTML En este componente, la vista queda tal y como se muestra en la Figura 66: Página principal. La única diferencia es el tamaño de los botones. 6.3.4.2 Datos y lógica TypeScript La lógica de este componente es idéntica a la del componente Terrarios, pero a la hora de asignar los terrarios al objeto terrarios, sólo se asignarán los 2 primeros. Esto se consigue con la siguiente línea de código: this.terrarios = this.items.items.slice(0,2); 6.3.5 Componente Terrarios Detail Este componente es el que nos permite ver el histórico de temperaturas que ha tenido un terrario dado. Además, permite controlar el terrario mediante un formulario.
Aplicación desarrollada: Interfaz web Angular 81 6.3.5.1 Vista HTML Este componente nos mostrará en forma de lista el histórico de temperatura y humedad de un terrario. Además, se podrá rellenar un formulario que nos permita activar o desactivar el controlador y enviar la temperatura o humedad deseada. La vista en el navegador Web sería la mostrada en la Figura 69: Vista Terrarios Detail. Figura 69: Vista Terrarios Detail Para representar cada uno de los estados del terrario en forma de lista se ha empleado el siguiente código: <ul class="terrarios"> <li *ngFor="let terrario of terrarios"> <a> <span class="badge">Fecha: {{terrario.date}} </span> Temperatura: {{terrario.temperatureReported}} Humedad: {{terrario.humidityReported}} </a> </li> </ul> Para crear el formulario y asignar esta información a los datos de la parte TypeScript se ha empleado el siguiente código: <div> <label>Activar/Desactivar Controlador: <input #terrarioControl /> </label> <label> Temperatura deseada: <input #temperature /> </label>
82 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular <label> Humedad deseada: <input #humidity /> </label> <!-- (click) passes input value to add() and then clears the input --> <button (click)="add(terrarioControl.value, temperature.value, humidity.value); terrarioControl.value=''; temperature.value=''; humidity.value=''"> Enviar </button> </div> De esta forma, cuando le demos al botón enviar de la interfaz Web, se enviará una petición POST a la URL "https://lvjjltcwr8.execute-api.eu-west-3.amazonaws.com/prod/kura" proporcionada por API Gateway de AWS con el contenido del formulario en el cuerpo de la petición POST. Esta se encargará de invocar a la función Lambda 5.3.3 Función dynamodb_write para actualizar la Sombra del Objeto correspondiente y la Base de Datos. Como la Raspberry Pi está suscrita a esta mediante el CloudSuscriber visto en el apartado 4.2.2 CloudSuscriber, esta recibirá la información de control y se encenderán/apagarán los LEDs tal y como se muestra en las figuras: Figura 26: Control enciende LED, Figura 27: Control apaga LED del apartado 4.4 Kura Wires y GPIODriver: Control de LEDs. 6.3.5.2 Datos y lógica TypeScript Este compontente se ha definido utilizando la dependencia: @Component({ selector: 'app-terrario-detail', templateUrl: './terrario-detail.component.html', styleUrls: [ './terrario-detail.component.css' ] }) Como queremos que la información de ruta sea utilizable por RoutingComponent, así como poder obtener información de la ruta para hacer la petición GET necesaria, necesitamos implementar el siguiente constructor: constructor( private route: ActivatedRoute, private terrarioService: TerrarioService, ) {} Con esto conseguimos introducir en la variable route, la URL en la que nos encontramos. Para obtener la variable kuraId, que es la clave de un terrario, sólo tenemos que obtenerla de la variable route: let kuraId = this.route.snapshot.paramMap.get('kuraId'); Para obtener la información del terrario, llamamos al método getTerrario(kuraId) del apartado 6.2 Servicio Terrario Service, en la que nos devuelve la información y la asignamos de la misma forma que en TerrariosComponent, pero en este caso, sólo es la información relativa a un terrario.
Aplicación desarrollada: Interfaz web Angular 83 Para enviar la información de control, llamamos al método addTerrario(terrarioEnv) del apartado 6.2 Servicio Terrario Service. Para que esta petición se produzca de forma satisfactoria, hemos tenido que crear una interfaz denominada Posting. La interfaz Posting contiene los atributos: export class Posting { id: number; name: string; temperatureDesired: string; kuraId: string; humidityDesired: string; control: boolean; } Esta nos permite introducir información de control en un terrario y de temperatura/humedad deseada. Es la que se utiliza para mapear la información procedente del formulario. Esto se consigue con el siguiente código: add(control: boolean,temperature: string, humidity: string): void { this.terrarioEnv = { id : this.terrario.id, temperatureDesired :temperature, kuraId : this.kura, humidityDesired : humidity, name: this.terrario.name, control : control, } } Siendo el método add el que se invoca cuando se pulsa el botón Enviar del formulario. 6.3.6 Componente Messages Este componente nos permite visualizar información de depuración en la pantalla. Para definirlo se ha utilizado la siguiente dependencia: @Component({ selector: 'app-messages', templateUrl: './messages.component.html', styleUrls: ['./messages.component.css'] }) Por lo tanto, en el resto de las vistas se incluirá <app-messages></app-messages> para que se muestre la información capturada en este. Muestra la información como se puede apreciar en las figuras: Figura 66: Página principal y Figura 68: Vista Terrarios Component.
84 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Con la finalidad de aclarar el funcionamiento y las posibles interacciones que esta aplicación Web ofrece, en la Figura 70: Casos de uso se muestran los distintos casos de uso que esta aplicación proporciona. Figura 70: Casos de uso Además en la Figura 71: Diagrama de secuencia obtener terrario, se muestra un diagrama de secuencia para el caso de uso de obtener el detalle de un terrario. Figura 71: Diagrama de secuencia obtener terrario
Aplicación desarrollada: Interfaz web Angular 85 Por último, en la Figura 72: Diagrama de secuencia controlar terrario se muestra un diagrama de secuencia para el caso de uso de controlar terrario. Figura 72: Diagrama de secuencia controlar terrario
86 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular 7 CONCLUSIONES Y LÍNEAS FUTURAS omo punto final a este Trabajo de Fin de Grado me gustaría reflexionar sobre los conocimientos adquiridos, la funcionalidad conseguida para este, así como la capacidad de mejora que tiene. Desde el punto de vista del aprendizaje, me gustaría remarcar los conocimientos adquiridos para la creación de un servicio basado en el Cloud Computing, que nos proporciona facilidades como no preocuparse por el mantenimiento, por el aprovisionamiento de los recursos, por la integridad de la información. Además, todo el desarrollo modular con Eclipse Kura y la Raspberry Pi me han hecho tener consciencia de la importancia de la modularidad y la reutilización de código, aspectos clave hoy en día para el desarrollo. Desde el punto de vista de la funcionalidad desarrollada, considero que se obtiene una buena solución inicial para el problema que se planteaba. Sin embargo, aún tiene mucho margen de mejora. Actualmente, se proporciona un sistema IoT, que permite la monitorización de la temperatura y humedad de un terrario y el control de unos LEDs mediante una interfaz Web. La interfaz Web implementada en Angular, es capaz de mostrar la información y acceder a los distintos recursos de una forma sencilla. Por contraposición, la forma de mostrar esta información no es la más visual ni intuitiva, ya que lo mejor para esto sería hacer uso de gráficas y estilos a la orden del día. Para ello considero una mejora sustancial el incluir una plantilla de estilos en Bootstrap. En el apartado del Cloud Computing, se otorga al sistema de una seguridad interna en el procesamiento y gestión de la información, así como en la comunicación con la Raspberry Pi. Se han utilizado diferentes servicios dentro de este entorno, como son IoT Core, DynamoDB como Base de Datos, Lambda y API Gateway. Sin embargo, la API REST no proporciona ningún tipo de seguridad, por lo que cualquiera que conozca la URL de esta, puede acceder a los recursos mediante los métodos que propone. Por lo tanto, en un futuro estaría a bien incorporarle esa seguridad que le falta. Finalmente, la implementación en Eclipse Kura ha sido la que más quebraderos de cabeza me ha dado, aunque a priori parecía la más sencilla. Esto se debe a que se necesita tener un conocimiento muy profundo de cómo funciona para poder empezar a desarrollar tus propias aplicaciones. Una vez se adquiere, la modularidad y la cantidad de recursos que proporciona "lo ponen todo en bandeja". A pesar de todo, me hubiese gustado implementar más funcionalidades en esta, como la integración con motores y relés que se accionen en función de una temperatura y humedad deseada. C If you get up in the morning and think the future is going to be better, it is a bright day. Otherwise, it´s not. - Elon Musk-
Anexo A: Instalación de Sensores DHT11 y Leds en Raspberry Pi 87 ANEXO A: INSTALACIÓN DE SENSORES DHT11 Y LEDS EN RASPBERRY PI En este anexo se explica paso a paso cómo conectar los sensores de humedad y temperatura DHT11 a los pines GPIO de la Raspberry Pi, para que se pueda obtener la información de estos. Además, se muestra el conexionado de los LEDs utilizados. Para el conexionado del sensor DHT11, se ha utilizado la siguiente referencia [2]. Inicialmente, hay que identificar qué tipo de sensor DHT11 tenemos. Los hay de 3 pines y de 4 pines. La diferencia entre estos radica en que el de 3 pines no necesita una resistencia para conectarlo con los pines GPIO de la Raspberry Pi, ya que la trae incorporada. En el caso de que tengamos uno de 4 pines, necesitaremos adicionalmente una resistencia de entre 4,7K y 10 K Ohmios que colocaremos entre el pin 1 y el in 2 [2]. En nuestro caso, el sensor es de 3 pines, por lo que no la necesitaremos. Figura 73: Sensor DHT11 Para hacer referencia a los pines del sensor mostrados en la Figura 73: Sensor DHT11, de izquierda a derecha nos referiremos como: • Pin 1: Positivo. • Pin 2: Datos. • Pin 3: Negativo. Para referirnos a los pines GPIO de la Raspberry Pi los numeraremos como se indica en la Figura 74: Pines GPIO. Figura 74: Pines GPIO
88 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Por lo tanto, el conexionado del Pin 1 debería hacerse con un pin de voltaje positivo, por ejemplo, el Pin 1 (3.3V) de la Raspberry Pi. El conexionado del Pin 3 deberá hacerse con un pin de tierra, en este caso el Pin 39 (GND) de la Raspberry Pi. Para la transmisión de datos, debemos conectar el Pin 2 con alguno de los pines denominados como GPIO XX, que son los que permiten el intercambio de datos. En nuestro caso, lo haremos con el Pin 38 (GPIO 20). Con todo esto, si ejecutamos el programa que nos permite leer la información de los sensores DHT11 (AdafruitDHT.py) nos mostrará la siguiente salida: Para el conexionado de los LEDs, se han conectado directamente al PIN GPIO del que van a obtener información en el polo positivo de este. El polo negativo se ha conectado a una resistencia de 1K Ohmios y posteriormente a un pin de tierra (GND). El conexionado tanto de los sensores como del LED se muestra en la Figura 75: Conexionado Raspberry Pi. Figura 75: Conexionado Raspberry Pi
ANEXO B: INSTALACIÓN Y CONFIGURACIÓN DE ECLIPSE KURA EN RASPBERRY PI En este anexo se explica paso a paso cómo instalar y configurar Eclipse Kura 4.1.0 en una Raspberry Pi 3, así como los parámetros necesarios para su configuración. 7.1 Instalación de Eclipse Kura 4.1.0 en una Raspberry Pi 3 con Raspbian Buster Se instalará Eclipse Kura en una Raspberry Pi 3 con la imagen Raspbian Buster, versión Julio de 2019 [36] para convertir este dispositivo en una pasarela IoT. Para ello se han seguido los pasos indicados en la documentación de Eclipse Kura. [37] Desde una terminal en la Raspberry Pi ejecutamos los siguientes comandos: 1. Desinstalamos paquetes que son incompatibles con Eclipse Kura. $ sudo apt-get purge dhcpcd5 2. Instalamos la herramienta gdebi, necesaria para el funcionamiento. $ sudo apt-get update $ sudo apt-get install gdebi-core 3. Instalamos Java 8 en caso de no tenerlo instalado. $ sudo apt-get install openjdk-8-jre-headless 4. Descargamos el paquete de Eclipse Kura y lo instalamos usando la herramienta gdebi $ wget http://download.eclipse.org/kura/releases/<version>/kura_4 .1.0_raspberry-pi-2-3_installer.deb $ sudo gdebi kura_4.1.0_raspberry-pi-2-3_installer.deb Tras ejecutar estos comandos tendríamos instalado Eclipse Kura en nuestra Raspberry Pi. A continuación, se puede reiniciar y acceder a la interfaz Web de Kura haciendo uso de un navegador Web, haciendo uso de una de las direcciones IP que tenga asignada, o en nuestro caso, la local. Se debe mostrar el contenido de la Figura 76: Interfaz inicio sesión de Eclipse Kura. https://localhost
96 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular ANEXO C: CREACIÓN DE USUARIOS Y CONFIGURACIÓN DE SERVICIOS EN AWS En este anexo se explica paso a paso cómo crear un usuario y crear y configurar los distintos servicios utilizados en Amazon AWS. Para el desarrollo de este Trabajo de Fin de Grado, todos los servicios utilizados han sido gratuitos, ya que no se ha excedido el límite de recursos gratuitos que la plataforma proporciona. 7.3 Creación de usuario AWS Para crearnos un usuario en la plataforma de Amazon AWS, tenemos que dirigirnos a la siguiente URL: https://aws.amazon.com/free. Una vez en esta, podemos ver todos los productos que AWS oferta en su plataforma de Cloud Computing. Para crear una cuenta, debemos hacer click en el botón naranja de la esquina superior derecha (Crear una cuenta de AWS). Figura 83: Formulario AWS Se deberá rellenar el formulario que aparece en la Figura 83: Formulario AWS con la información personal del usuario a crear. Se deberá rellenar toda la información que se solicite en cada paso. Pide una tarjeta de crédito para verificar la identidad, pero no se hará ningún cargo a esta. Una vez hayamos completado el registro, tendremos nuestra sesión creada. Se nos mostrará nuestro panel principal, como podemos ver en la Figura 84: Panel principal AWS.
Anexo C: Creación de usuarios y configuración de servicios en AWS 97 Figura 84: Panel principal AWS 7.4 IoT Core En este apartado se indican los pasos necesarios para crear un Objeto en el IoT Core de AWS. Este objeto será el utilizado en el entorno de Cloud Computing de AWS para representar un dispositivo IoT, en este caso, la Raspberry Pi con Eclipse Kura. Para empezar a utilizar IoT Core, debemos hacer click en el elemento Servicios que aparece en la Figura 84: Panel principal AWS. Ahí introduciremos en el buscador IoT Core. Se nos debe mostrar lo que aparece en la Figura 85: IoT Core.
98 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 85: IoT Core Una vez en este, debemos crear un Objeto. Para ello debemos ir a Administración -> Objetos -> Crear. Debemos elegir la opción crear un solo Objeto. Habrá que rellenar cada uno de los campos que se solicitan en la Figura 86: Creación Objeto. Figura 86: Creación Objeto
Anexo C: Creación de usuarios y configuración de servicios en AWS 99 En este caso, le asignaremos el nombre kura-gateway. Este objeto representará la Raspberry Pi, ya que es un Gateway IoT, haciendo uso de Eclipse Kura. No le aplicaremos ningún tipo. No es necesario asignarle ahora un grupo al que pertenecer. A continuación, debemos darle a Siguiente. Para que este Objeto adquiera una Identidad, que nos permita que se conecten a este dispositivo IoT de forma segura, debemos asignarle unos certificados. La forma más fácil es hacerlo a través de la opción que proporciona Amazon AWS. Para ello debemos hacer click en Crear certificado en un click. Debemos de descargarnos y activar los certificados que aparecen en la Figura 28: Certificado asociado a un objeto. Estos son los que utilizaremos en el Anexo B: Instalación y configuración de Eclipse Kura en Raspberry Pi, apartado 7.2.2 y en el apartado 5.1.1 Interacción con el Objeto: Thing Shadow. Figura 28: Certificado asociado a un objeto Por último, debemos asociarle unas políticas al objeto. Las políticas asociadas son las que se muestran en la Figura 29: Política asociada a un certificado. Estas son las políticas por defecto que se incluyen en la documentación de AWS [30]. Con todo esto, ya tendríamos nuestro Objeto kura-gateway configurado y con las direcciones que se muestran en la Figura 31: Servicio Device Shadow, para que se pueda interactuar con estos. La dirección que aparece en el apartado HTTPS coincide con la dirección de punto de enlace personalizado.
100 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 31: Servicio Device Shadow 7.5 DynamoDB En este apartado se indica cómo crear una base de datos NoSQL en AWS. Utilizaremos la Base de Datos gratuita que se proporciona en este entorno. En ella almacenaremos la información relativa a un terrario. Para empezar a utilizar DynamoDB debemos hacer click en el elemento Servicios que aparece en la Figura 84: Panel principal AWS. Ahí introduciremos en el buscador DynamoDB. Se nos debe mostrar lo que aparece en la Figura 87: Panel de control DynamoDB.
Anexo C: Creación de usuarios y configuración de servicios en AWS 101 Figura 87: Panel de control DynamoDB El primer paso es crear una tabla. Para ello hacemos click en el botón que indica Crear tabla. Debemos rellenar los campos tal y como se muestran en la Figura 88: Parámetros tabla terrario. Con estos parámetros, la tabla se corresponderá con la indicada en el apartado 5.2 Dynamo DB. Figura 88: Parámetros tabla terrario Una vez creada, nos debe aparecer la información de esta tal y como se muestra en la Figura 34: Información Base de Datos terrario. Como podemos apreciar, se nos proporciona un Nombre de recurso de Amazon (ARN). Este es el que utilizaremos para referirnos a esta tabla, desde cualquier punto del entorno de Amazon AWS (asociar políticas o acceder desde las funciones Lambda).
102 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular Figura 34: Información Base de Datos terrario 7.6 Funciones Lambda En este apartado se indica cómo crear una función Lambda en AWS. Escogeremos como lenguaje de programación Node.js. Además, se verá como asignarle los permisos necesarios para que pueda acceder a los recursos que necesite (IoT Core o DynamoDB). Para empezar a utilizar Lambda debemos hacer click en el elemento Servicios que aparece en la Figura 84: Panel principal AWS. Ahí introduciremos en el buscador Lambda. Se nos debe mostrar lo que aparece en la Figura 89: Panel de control Lambda. Figura 89: Panel de control Lambda Para crear una función debemos hacer click en el botón Crear una función. Debemos rellenar los campos con la información que se muestra en la Figura 90: Crear función. En el campo de Rol, para la
Anexo C: Creación de usuarios y configuración de servicios en AWS 103 primera función se deberá crear uno nuevo. Para el resto de las funciones se puede utilizar el mismo si se quieren compartir los permisos que se le asignen a ese Rol. Figura 90: Crear función Una vez se haya creado la función, deberá aparecernos un panel como se muestra en la Figura 91: Panel de control de una función Lambda. Lo primero que debemos hacer es asignarle los desencadenadores que pueda tener la función (API Gateway, AWS IoT o DynamoDB). Ahí le asignaremos la regla o la petición que la invoque. Figura 91: Panel de control de una función Lambda Posteriormente, en el editor de texto que proporciona, implementaremos lo que queremos que la función haga en cada caso. Para que todo funcione correctamente, al Rol de la función tenemos que darle
104 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular permisos para que acceda a los recursos a los que se necesite acceder en cada caso. Esto se hace tal y como se indica en el tutorial de Amazon AWS para crear una función Lambda [40]. Para ello, tenemos que ir al apartado que se muestra en la Figura 92: Rol de ejecución Lambda. Haciendo click en Consulte el rol (nombre_rol), nos reenviará al servicio que nos permite gestionarlo, que es AWS IAM. Figura 92: Rol de ejecución Lambda Figura 93: Resumen Rol En este se nos mostrará un panel como el que se muestra en la Figura 93: Resumen Rol. Como podemos apreciar, tiene 3 políticas insertadas.
Anexo C: Creación de usuarios y configuración de servicios en AWS 105 • AWSLambdaBasicExecutionRole-bd0cb128-5510-4521-bf85-bf76b8773022: Es la que se le asocia automáticamente al crear el rol con la función Lambda. Esta le asocia los permisos necesarios para que pueda ejecutar la función cuando recibe un evento desencadenador. • fullDynamoDB: Política creada para que este rol tenga tanto acceso de escritura como de lectura a la Base de Datos terrario. El contenido de esta política es el que se puede ver en la Figura 94: Política fullDynamoDB. Figura 94: Política fullDynamoDB • iotfullaccess: Política creada para que este rol tenga permisos para publicar/suscribirse a un topic IoT del IoT Core. El contenido de esta política es el que se muestra en la Figura 95: Política iotfullaccess. Figura 95: Política iotfullaccess Con estas políticas, las funciones Lambda que tengan asociado este Rol para sus ejecuciones, podrán tener todos los permisos necesarios para acceder a los recursos que se necesitan para este proyecto.
112 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular REFERENCIAS [1] «Raspberry Pi 3B+ Specs and Benchmarks - The MagPi MagazineThe MagPi Magazine». [En línea]. Disponible en: https://www.raspberrypi.org/magpi/raspberry-pi-3bplus-specs-benchmarks/. [2] «DHT11 Temperature and Humidity Sensor and the Raspberry Pi - Raspberry Pi Spy». [En línea]. Disponible en: https://www.raspberrypi-spy.co.uk/2017/09/dht11-temperature-and-humidity- sensor-raspberry-pi/#prettyPhoto. [3] «Getting Started». [En línea]. Disponible en: https://eclipse.github.io/kura/dev/kura-setup.html. [4] «Eclipse Kura | The Eclipse Foundation». [En línea]. Disponible en: https://www.eclipse.org/kura/. [5] «Gateways | IoT development made simple - iot.eclipse.org». [En línea]. Disponible en: https://iot.eclipse.org/gateways/. [6] «Gateways IoT | Aprendiendo Arduino». [En línea]. Disponible en: https://aprendiendoarduino.wordpress.com/2018/11/21/gateways-iot/. [7] «What is OSGi? – OSGiTM Alliance». [En línea]. Disponible en: https://www.osgi.org/developer/what-is-osgi/. [8] «What is OSGi (Open Service Gateway Initiative)? - Definition from WhatIs.com». [En línea]. Disponible en: https://searchnetworking.techtarget.com/definition/OSGi. [9] «Benefits of Using OSGi – OSGiTM Alliance». [En línea]. Disponible en: https://www.osgi.org/developer/benefits-of-using-osgi/. [10] «Architecture – OSGiTM Alliance». [En línea]. Disponible en: https://www.osgi.org/developer/architecture/. [11] «Amazon Web Services (AWS) : ¿qué es y qué ofrece?» [En línea]. Disponible en: https://www.ticportal.es/temas/cloud-computing/amazon-web-services. [12] J. M. L. Sillero, «Amazon Web Services». [En línea]. Disponible en: https://www2.deloitte.com/es/es/pages/technology/articles/introduccion-a-amazon-web- services.html. [13] «What is AWS IoT (Amazon Web Services internet of things)? - Definition from WhatIs.com». [En línea]. Disponible en: https://searchaws.techtarget.com/definition/AWS-IoT-Amazon-Web- Services-internet-of-things. [14] «¿Qué es AWS IoT? - AWS IoT». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/iot/latest/developerguide/what-is-aws-iot.html. [15] «¿Qué es Amazon DynamoDB? - Amazon DynamoDB». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/Introduction.html. [16] «Cifrado en reposo de DynamoDB - Amazon DynamoDB». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/EncryptionAtRest.ht ml. [17] «What is Serverless? | Serverless Stack». [En línea]. Disponible en: https://serverlessstack.com/chapters/what-is-serverless.html. [18] «¿Qué es AWS Lambda? - AWS Lambda». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/lambda/latest/dg/welcome.html. [19] «Tiempos de ejecución de AWS Lambda. - AWS Lambda». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/lambda/latest/dg/lambda-runtimes.html. [20] «▷ ¿Qué es una API REST? | Guía 【2019】 - Idento». [En línea]. Disponible en: https://www.idento.es/blog/desarrollo-web/que-es-una-api-rest/. [21] «¿Qué es REST? Conoce su potencia | OpenWebinars». [En línea]. Disponible en: https://openwebinars.net/blog/que-es-rest-conoce-su-potencia/. [22] «TypeScript - Wikipedia, la enciclopedia libre». [En línea]. Disponible en: https://es.wikipedia.org/wiki/TypeScript. [23] «Qué es Angular | OpenWebinars». [En línea]. Disponible en: https://openwebinars.net/blog/quees-angular/.
Referencias 113 [24] «Overview». [En línea]. Disponible en: https://eclipse.github.io/kura/cloud-api/1-overview.html. [25] «User guide». [En línea]. Disponible en: https://eclipse.github.io/kura/cloud-api/2-user- guide.html. [26] Raspberry Pi Foundation, «Deploying Bundles». [En línea]. Disponible en: https://eclipse.github.io/kura/dev/deploying-bundles.html. [27] «Configurable Application». [En línea]. Disponible en: https://eclipse.github.io/kura/dev/configurable_component.html. [28] «Publishing Application». [En línea]. Disponible en: https://eclipse.github.io/kura/dev/heater_demo.html. [29] «GPIO driver in Kura Wires». [En línea]. Disponible en: https://eclipse.github.io/kura/wires/kurawires-gpio.html. [30] «Políticas de AWS IoT - AWS IoT». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/iot/latest/developerguide/iot-policies.html. [31] «API RESTful de sombra de dispositivo - AWS IoT». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/iot/latest/developerguide/device-shadow-rest-api.html. [32] «Temas - AWS IoT». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/iot/latest/developerguide/topics.html. [33] «¿Qué es AWS Lambda? | Serverless Stack». [En línea]. Disponible en: https://serverlessstack.com/chapters/es/what-is-aws-lambda.html. [34] «API RESTful de sombra de dispositivo - AWS IoT». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/iot/latest/developerguide/device-shadow-rest-api.html. [35] «Implementing a Serverless AWS IoT Backend with AWS Lambda and Amazon DynamoDB | AWS Compute Blog». [En línea]. Disponible en: https://aws.amazon.com/es/blogs/compute/implementing-a-serverless-aws-iot-backend-with-aws- lambda-and-amazon-dynamodb/. [36] Raspberry Pi Foundation, «Installing operating system images - Raspberry Pi Documentation», 2008. [En línea]. Disponible en: https://www.raspberrypi.org/documentation/installation/installing-images/. [37] Raspberry Pi Foundation, «Raspberry Pi- Quick start», 2012. [En línea]. Disponible en: https://eclipse.github.io/kura/intro/raspberry-pi-quick-start.html. [38] Raspberry Pi Foundation, «Network Configuration». [En línea]. Disponible en: https://eclipse.github.io/kura/config/network-configuration.html. [39] «Amazon AWS IoTTM platform». [En línea]. Disponible en: https://eclipse.github.io/kura/cloudstacks/kura-aws-cloud.html. [40] «Uso de políticas basadas en recursos para AWS Lambda - AWS Lambda». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/lambda/latest/dg/access-control-resource-based.html. [41] «TUTORIAL: Desarrollar una API con integración HTTP que no sea de proxy - Amazon API Gateway». [En línea]. Disponible en: https://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/api-gateway-create-api-step- by-step.html. [42] «Angular - Architecture overview». [En línea]. Disponible en: https://angular.io/guide/architecture.
114 Sistema IoT para el control y monitorización de un terrario con Eclipse Kura, Amazon AWS y Angular