El pasado 11 de febrero BEEVA estuvo presente en el evento T3chfest con una charla técnica. El tema de la conferencia, titulada ‘Ruling the world with your voice and the cloud’, era el de las arquitecturas serverless en aplicaciones de Internet of Things. Concretamente la plataforma AWS IoT y Lambda. Como introducción se llevó a cabo una prueba de concepto con un robot Sphero BB8 y un Amazon Echo como asistente para comandos de voz.
Amazon Echo es un dispositivo físico que hace las veces de asistente de voz, similar a Cortana o Siri. Internamente utiliza el servicio de voz Alexa, por lo cual es fácil implementar comandos de voz con la API Alexa Skills Set. Se puede utilizar cualquier lenguaje y servidor, pero teniendo integración directa con Lambda, decidimos usar éste último. Ya que nos permite implementar microservicios sin gestionar un servidor o el despliegue y monitorización.
El droide BB8 es un robot esférico fabricado con Sphero. Tiene conectividad Bluetooth Smart 4.0, habilidad para desplazarse, un LED RGB y sensores de colisión u odómetro. Los fabricantes han liberado el protocolo, por lo que existe una gran cantidad de librerías disponibles, tanto oficiales como hechas por la comunidad. Nos hemos decantado por el lenguaje javascript y el framework NodeJS, así conseguimos una aplicación multiplataforma y versátil para cualquier tarea. Para controlar el robot, usamos la librería sphero.js conjuntamente con noble.
Usamos AWS IoT para conectar el BB8 a la nube y poder controlarlo de manera remota. Representamos el objeto con un ‘device’ y mediante su ‘shadow’ sincronizamos el estado de los LEDs y obtenemos los valores de velocidad y posición, de manera que si el robot está desconectado y le pedimos que se vuelva azul, en el momento de reiniciar, su estado pasará a azul. Además, utilizamos un canal de MQTT del servicio de Amazon para enviar comandos. Como backup utilizamos DynamoDB mediante Rules Engine para persistir cualquier información intercambiada. Utilizando esta persistencia junto a API Gateway y Lambda conseguimos una API Rest con los datos del BB8.
Para enviar información a la nube y conectar por Bluetooth con el BB8 hemos desarrollado un gateway, una aplicación NodeJS que intermedia entre los dos. Utilizamos el SDK de NodeJS de Device Thing oficial de AWS. Para poder utilizar la demo sin la necesidad de un ordenador donde ejecutar dicho gateway, usamos una Raspberry Pi. Resin.io nos permite desplegar la app en un contenedor de Docker y desplegar automáticamente el código. Así nos despreocupamos de instalar dependencias, gestionar la conexión a internet o bajarnos la última versión de código. Adicionalmente usamos PM2 para monitorizar el proceso, ponerlo en background y vigilar logs.
Arquitectura para conectar BB8 en la nube con Amazon Echo
Uno de los aprendizajes del experimento es la versatilidad de Lambda como Backend Serverless, contenedores de aplicaciones autogestionados y con soporte para Python, NodeJS y Java a los que simplemente les tenemos que entregar código. Uno de sus puntos negativos es la falta de la gestión de dependencias, de manera que tenemos que empaquetar todas las librerías usadas junto al código. Por otro lado, comprobamos la simplicidad de AWS IoT y como utiliza tecnologías ligeras enfocadas a makers como MQTT a nivel industrial con la elasticidad y el autoescalado proprio de los productos de AWS.
Las slides de la charla están disponibles en Slideshare de BEEVA.