Blog de Amazon Web Services (AWS)
Creación de su propio rastreador de vehículos – Parte 1
Por Gerson Itiro Hidaka, Arquitecto de Soluciones AWS Brasil
Introducción
Al largo de Re:Invent 2020 recibimos el anuncio de un nuevo servicio, Amazon Location Service. Este servicio tiene como objetivo facilitar la inserción de mapas y el control de datos de localización en nuestras aplicaciones. Me puse curioso por la funcionalidad del servicio y decidí incorporarlo a un nuevo proyecto: “Rastreador de vehículos”.
El resultado será una aplicación que muestra un mapa en el navegador con información de seguimiento del vehículo y algunas características de navegación, como se muestra en la siguiente figura.
Este post es el primero de 3 partes y vamos a explorar aquí el concepto de la idea, la arquitectura de la solución y los componentes de Nube para la recepción de datos de geolocalización.
Descripción general de la arquitectura
El objetivo principal es desarrollar una aplicación sencilla que nos muestre la información sobre las rutas realizadas por el automóvil en las últimas 24 horas. Esta aplicación necesita almacenar los datos de geolocalización del vehículo. También tenemos que desarrollar el dispositivo que estará dentro del coche, capturando los datos de geolocalización (latitud, longitud y fecha/hora) y enviándolos al sistema Back-End. El siguiente diagrama es un ejemplo de cómo recopilamos datos de Edge Device, los almacenamos en Location Service y los consultamos con una llamada API.
A continuación se describen los servicios y componentes que se utilizaron en el diagrama:
- Edge Device / Raspberry Pi es una computadora de tarjeta única, tamaño reducido que se puede conectar a un monitor o televisor (a través de la puerta HDMI) o trabajar en modo Headless, y utiliza un teclado y un ratón estándar. Fue desarrollado en Reino Unido por la Fundación Raspberry Pi. Utilizaremos la Raspberry Pi para procesar y filtrar los datos procedentes del GPS conectado a una puerta serie USB y enviarlos a la nube a través del protocolo MQTT.
- El sistema de posicionamiento global, más conocido por las siglas GPS, es un sistema de navegación por satélite que proporciona a un receptor móvil su posición, así como la hora, en cualquier condición meteorológica, en cualquier momento y en cualquier lugar de la Tierra; siempre que el receptor se encuentre en el campo de visión de tres satélites GPS.
- Node-Red es una herramienta de desarrollo basada en flujos para programación visual (flow based programming) diseñada para conectar dispositivos de hardware, APIs y servicios en línea como parte del Internet de las cosas. Node-Red provee un editor de flujo basado en navegador web, que se puede utilizar para crear funciones JavaScript y los elementos de la aplicación se pueden guardar o compartir para su reutilización. El runtime se construye en Node.js y las secuencias creadas en Node-Red se almacenan usando JSON. Utilizamos Node-Red, instalado en el dispositivo Edge, para construir rápidamente un prototipo que convierta los datos GPS en una estructura JSON y envíe esa información a la N
- AWS Lambda le permite ejecutar código sin aprovisionar ni administrar servidores. Utilizaremos Lambda en dos puntos de la aplicación. El primero será el procesamiento de la información recibida a través de IoT Core y el envío a Location Service. El segundo punto es para procesar llamadas API y consultar Location Service para el seguimiento de la información.
- AWS Amplify es un conjunto de herramientas y servicios que permiten a los desarrolladores de Front End (web y móviles) crear aplicaciones seguras y escalables full-stack, con tecnología desarrolada por Utilizaremos Amplify para la integración de Front End con APIs y servicios de autenticación.
- Con Amazon Location Service, puede agregar fácilmente características como mapas, puntos de interés, geocodificación, enrutamiento, geovallas y seguimiento a aplicaciones. Utilizaremos Location Service para mostrar mapas en front end y almacenar información de seguimiento de vehículos.
Ahora veamos la arquitectura de la solución que se divide en 3 áreas principales:
- Broker MQTT y almacenamiento de datos: Utilizaremos AWS IoT Core en la función de broker de MQTT (servicio para recibir datos de geolocalización) y por medio de sus reglas enviaremos los datos para su procesamiento a AWS Lambda. La función Lambda será responsable de recibir los eventos y enviarlos a Location Service.
- Prototipo del dispositivo que permanecerá dentro del vehículo: Este dispositivo es responsable de capturar datos de geolocalización (latitud, longitud y fecha/hora), y la transmisión a la nube utilizando Internet como medio físico, organizando los datos por medio del protocolo MQTT (Message Queue Telemetry Transport – https://mqtt.org/).
- Front End, Autenticación y API: Esta parte de la aplicación será responsable del Front End, es decir, la visualización del mapa a los usuarios finales y también la consulta de los puntos GPS (Tracking) capturados por el dispositivo Edge. Utilizo React JS integrado con Amplify para proporcionar funcionalidades de autenticación (Amazon Cognito) y REST API (Amazon API Gateway y Lambda) para la aplicación fin
Requisitos previos
Para que pueda realizar todos los pasos de este tutorial y crear su propio Rastreador de Vehículos, necesitará tener algunos componentes y conocimientos previos, que enumeramos en esta sección:
- 1. React JS para aplicar los ejemplos citados durante la publicación y modificar algunos fragmentos de código.
2. Nociones basicas en Linux, Raspberry Pi, Node-Red y MQTT.
3. Poseer un Raspberry Pi y GPS USB. Hemos utilizado el modelo “Zero W” en este tutorial, pero otros modelos también se pueden utilizar con algunos ajustes.
4. Una cuenta en AWS. Si tiene preguntas sobre cómo crear una cuenta de AWS, visite el enlace aquí.
5. La Interfaz de Línea de Comandos (CLI) de Amplify es un requisito previo para ejecutar este tutorial.
Manos a la obra 1: Amazon Location Service
En esta sección comenzaremos la parte práctica e instanciaremos dos recursos de Location Service: Maps y Trackers. Los Maps son responsables de proporcionar las funciones necesarias para que el navegador procese los mapas en la pantalla del usuario final. El recurso llamado Tracker almacenará y procesará los datos de geolocalización para que podamos rastrear un dispositivo en particular, que en nuestro caso será un vehículo.
El siguiente diagrama destaca los 3 servicios responsables del procesamiento y almacenamiento de datos de geolocalización. Configuraremos cada uno de ellos a continuación, comenzando con Location Service.
1. Primero creemos el Mapa y Asset Tracking en Location Service. Acceda al servicio (Location Service) desde la consola de administración de AWS, por medio del panel o del campo de Search. Elija Maps en el menú.
2. En la siguiente pantalla, seleccione el botón Create map.
- Determine un nombre para el servicio de mapas en el campo Name, una descripción y seleccione uno de los estilos de mapa disponibles.
- Tenga en cuenta el nombre del mapa y el ARN , que se utilizarán durante los otros pasos de configuración.
5. El siguiente paso será la creación de Tracker, que es similar a la creación de mapas. Para ello, seleccione el item Trackers, en menu y, a continuación, seleccione el botón Create tracker.
6. En la siguiente pantalla, determine un nombre para el Tracker (el ejemplo que utilicé fue MySampleTracker), una breve descripción y seleccione el botón Create tracker.
7. Tenga en cuenta el nombre del Tracker y ARN , que se utilizarán durante los otros pasos de configuración.
Manos a la obra 2: AWS IoT Core y AWS Lambda
Ahora vamos a configurar el servicio AWS IoT Core que es el Broker para el protocolo MQTT. El objetivo principal de esta sección será crear un dispositivo lógico en el servicio, políticas de acceso y reglas para redirigir mensajes para su posterior procesamiento en Lambda.
- Para comenzar a configurar AWS IoT Core, simplemente accedalo desde el menú principal de la consola de AWS o introduzca el nombre del servicio en el campo de Search.
- La primera acción será crear una Policy para los dispositivos. Para ello, vaya al menú Secure/Policies y seleccione el botón Create. Esta política será responsable por la seguridad del envío de datos y determinará qué funcionalidad de AWS IoT Core puede utilizar el dispositivo.
- Rellene los datos como se muestra a continuación. Para este ejemplo hemos creado una política restrictiva que permite sólo 3 acciones de IoT (Connect, Receive y Publish). Utilice el botón Add statement para agregar más acciones a la política. Después de eso, seleccione el botón Create.
- El siguiente paso será crear una Thing, es decir, un dispositivo lógico. Seleccione el menú Manage/Things y haga clic en el botón Create. Luego haga clic en el botón “Create a single thing” ya que registraremos un solo dispositivo.5. En la ventana Add your device to the thing registry, ingrese el nombre del dispositivo en el campo Name y haga clic en el botón Next. En el siguiente paso crearemos los certificados y llaves (keys) que permitirán enviar datos desde los dispositivos perimetrales a AWS IoT Core de forma segura (cifrada). Seleccione el botón Create certificate.6. En la pantalla siguiente, descargue el archivo de certificado, la clave de publicación y la clave privada haciendo clic en los 3 vínculos de Download. También necesitará root CA, así que seleccione el enlace Download root CA y compruebe las instrucciones de la documentación. Estos archivos serán necesarios para la configuración de NodeDred (MQTT Out Node), que haremos en la sección “Manos a la Obra- Part 3”. A continuación, haga clic en el botón Activate y luego en Attach a policy.
- Seleccione la policy, que acabamos de crear y seleccione el botón Register Thing.
Listo su dispositivo se ha configurado en AWS IoT Core.
- Ahora vamos a recopilar una información más que será necesaria en el proceso de configuración de NodeD, el endpoint IoT Broker. Para hacer esto, haga clic en el nombre del dispositivo que acaba de crear (ejemplo: MyCar01).
- Haga clic en el menú Interact y anote la dirección que aparece en el campo HTTPS. Esta dirección es el endpoint (Server) que se utilizará en la configuración MQTT Out Node (NodeD) en la sección “Manos a la obra — Part 3”.
10. La siguiente tarea será configurar la regla básica de AWS IoT. La regla tiene la función de filtrar los mensajes que queremos redirigir a AWS Lambda.
11. Para empezar a configurar Rule, haga clic en el menú Act / Rules. Seleccione el botón Create. Rellene el campo Name y Description con el nombre de la regla y una descripción, respectivamente, y modifique la consulta SQL conforme al código de abajo. Determiné como ”mycartopic” el nombre del Topic donde enviaremos mensajes de IoT.
SELECT * FROM ‘mycartopic’
12. El Broker MQTT es un servicio de tipo Pub/Sub. Puede filtrar los mensajes que reciba en el tema antes de redirigirlos a otros servicios en la nube. Esta configuración redirigirá todos los mensajes entrantes del tema ”mycartopic” a la Rule correspondiente. A continuación, haga clic en el botón Add action para agregar una regla.
13. Seleccione Send a message to a Lambda function y haga clic en el botón Configure action.
14. Seleccione el botón Create a new Lambda function. Será redirigido a una nueva ventana/pestaña en el navegador para crear una Lambda Function.
15. Determine un nombre para la funcion (ejemplo: MyCarTrackerBlog) y seleccione Python en el campo Runtime. Haga clic en el botón Create Function.
16. En la sección Function Code, haga doble clic en lambda_function.py y reemplace el código predeterminado de Lambda por el siguiente código. Sustituya el valor de la variable TRACKER_NAME por el nombre del Tracker que anotó en la sección anterior.
import sys
from pip._internal import main
main(['install', '-I', '-q', 'boto3', '--target', '/tmp/', '--no-cache-dir', '--disable-pip-version-check'])
sys.path.insert(0,'/tmp/')
from datetime import datetime
import json
import os
import boto3
# Update this to match the name of your Tracker resource
TRACKER_NAME = " MySampleTracker "
def lambda_handler(event, context):
# load the side-loaded Amazon Location Service model; needed during Public Preview
os.environ["AWS_DATA_PATH"] = os.environ["LAMBDA_TASK_ROOT"]
print(event)
updates = [
{
"DeviceId": event["deviceid"],
"SampleTime": datetime.fromtimestamp(event["timestamp"]).isoformat(),
"Position": [
event["lon"],
event["lat"]
]
}
]
print(updates)
client = boto3.client("location")
response = client.batch_update_device_position(TrackerName=TRACKER_NAME, Updates=updates)
return {
"statusCode": 200,
"body": json.dumps(response)
}
- Este código recibirá un evento AWS IoT Core y enviará los datos a Location Service en un Track denominado MySampleTracker (ejemplo). Tendrá que ajustar el permiso de Lambda para enviar datos al sistema de Asset Tracking system de Location Service. Para ello, haga clic en Permissions y, a continuación, haga clic en el nombre del
- Haga clic en Add inline policy. Seleccione Location en el campo Service. Para una mayor seguridad en el entorno, limitamos los permisos a una sola acción, el BatchUpdateDevicePosition de Location Services.
- En la siguiente sección (Resources) agregue el ARN del tracker por medio del enlace Add ARN (tracker).
- Especifique el ARN del Tracker en el campo Specify ARN for Tracker. Este parámetro se creó durante la sección “Manos a la obra — Parte 1”. Seleccione en el botón Add.
5. Seleccione el botón Review policy.
6. A continuación, introduzca un nombre para su policy en el campo Name. Haga clic en el botón Create policy.
7. Vuelva a la pestaña Función Lambda. Haga clic en la ficha Configuration y en la sección Funtion Code guarde el archivo (File/Save), haga clic en el botón Deploy y, a continuación, haga clic en Action/Publish new version. Listo ahora su función está lista para su uso.
8. Vuelva a la ventana de AWS IoT Core Rules. Haga clic en el botón Select y, a continuación, haga clic en Refresh. Busque la función Lambda que acaba de crear. Seleccione la función y haga clic en el botón Add action.
9. Haga clic en Create Rule y se creará la regla . Activar regla por medio del elemento “…” /Enable.
Conclusión
En esta primera publicación hemos instanciado y configurado Amazon Location Service y con esto pudimos explorar dos características del servicio, Maps y Trackers. Hemos verificado la simplicidad de la creación de funciones y exploramos la integración con AWS IoT Core y AWS Lambda para recibir coordenadas GPS.
En el siguiente post (Parte 2) crearemos el dispositivo para capturar información GPS. En caso de duda, comentario o pregunta, puede utilizar el siguiente enlace. ¡Hasta el próximo post!
Este artículo fue traducido del Blog de AWS en Portugués
Sobre el Autor
Gerson Itiro Hidaka actualmente trabaja como Arquitecto de Soluciones de AWS y presta servicios a socios de todo el mundo denominados Global System Integrators and Influencers (GSII) en la región de América Latina. Entusiasta de tecnologías como Internet de las cosas (IoT), drones, Devops y un experto en tecnologías como la virtualización, serverless, contenedor y Kubernetes. Ha trabajado con soluciones de TI durante más de 24 años, con experiencia en numerosos proyectos de infraestructura, red, migración, recuperación ante desastres y optimización de DevOps en su portafolio.
Revisores
Murilo Nascimento es Gerente de Producto de AWS. Especialista en tecnologías de bases de datos, le encanta estudiar sobre el tema y disfruta aún más compartir lo que aprende con los demás.
Giovanna Chiaratti es Arquitecta de Soluciones para Socios en América Latina enfocada en los países hispano-hablantes. Admiradora y estudiosa de tecnologías como Machine Learning, Artificial Intelligence y Serverless. Trabaja para escalar los socios de consultoría y tecnología para que puedan apoyar a AWS en la creación de soluciones seguras, innovadoras e inteligentes.
Juliano Fernandes Baeta es Arquitecto de Soluciones para Integradores Globales de Sistemas para América Latina. Es un entusiasta del big data, el análisis y el aprendizaje automático y su misión es ayudar a los socios a crear soluciones seguras, eficaces y resistentes en AWS.