O blog da AWS
Criando o seu próprio Rastreador Veicular – Parte 1
Por Gerson Itiro Hidaka, Arquiteto de Soluções AWS Brasil
Introdução
Durante o re:Invent 2020 recebemos o anúncio de um novo serviço, o Amazon Location Service. Esse serviço tem como principal objetivo facilitar a inserção de mapas e controle dos dados de localização nas nossas aplicações. Fiquei curioso quanto as funcionalidades do serviço e resolvi incorporá-lo em um novo projeto: “Rastreador Veicular”.
O resultado será uma aplicação que exiba um mapa no navegador com as informações de rastreamento do veículo e algumas funcionalidades de navegação, como mostra a figura abaixo.
Este post é a primeira de 3 partes e vamos explorar aqui a concepção da idéia, arquitetura da solução e os componentes em Nuvem para a recepção dos dados de geolocalização.
Visão Geral da Arquitetura
O objetivo principal é desenvolver uma aplicação simples que nos mostre a informação dos trajetos realizados pelo carro nas últimas 24 horas. Esta aplicação precisa armazenar os dados de geolocalização do veículo, portanto temos que desenvolver também o dispositivo que ficará dentro do carro, capturando os dados de geolocalização (latitude, longitude e data/hora) e enviando para o sistema Back End. O diagrama apresentado a seguir é um exemplo de como podemos coletar os dados do Edge Device, armazená-los no Location Service e consultá-lo com uma chamada de API.
A seguir descreveremos os serviços e os componentes que foram utilizados no diagrama:
- Edge Device / Raspberry Pié um computador de placa única, de tamanho reduzido, que pode ser conectado a um monitor ou TV (através da porta HDMI) ou trabalhar no modo Headless, e usa um teclado e um mouse padrão. Foi desenvolvido no Reino Unido pela Fundação Raspberry Pi. Utilizaremos o Raspberry Pi para processar e filtrar os dados proveniente do GPS conectado a porta serial USB e enviá-los a nuvem através do protocolo MQTT.
- O sistema de posicionamento global, mais conhecido pela sigla GPS, é um sistema de navegação por satélite que fornece a um aparelho receptor móvel a sua posição, assim como o horário, sob quaisquer condições atmosféricas, a qualquer momento e em qualquer lugar na Terra; desde que o receptor se encontre no campo de visão de três satélites GPS.
- O Node-RED é uma ferramenta de desenvolvimento baseada em fluxo para programação visual (flow based programming) desenvolvido para conectar dispositivos de hardware, APIs, e serviços online como parte da Internet das Coisas. O Node-RED fornece um editor de fluxo baseado em navegador web, que pode ser usado para criar funções JavaScript e os elementos dos aplicativos podem ser salvos ou compartilhados para reutilização. O runtime é construído em Node.js e os fluxos criados no Node-RED são armazenados usando JSON. Utilizaremos o Node-Red, instalado no no dispositivo Edge, para construir rapidamente um protótipo que transforme os dados de GPS em uma estrutura JSON e envie essas informações para a Nuvem.
- O AWS Lambda permite que você execute um código sem provisionar ou gerenciar servidores. Utilizaremos o Lambda em dois pontos da aplicação. O primeiro será o processamento da informação recebida via IoT Core e envio para o Location Service. O segundo será para processar as chamadas de API e consultar o Location Service a procura de informações de rastreamento.
- O AWS Amplify é um conjunto de ferramentas e serviços para permitir que desenvolvedores de Front End (web e de dispositivos móveis) criem aplicações seguras e escaláveis full-stack, com tecnologia desenvolvida pela AWS. Utilizaremos o Amplify para a integração do Front End com as APIs e com o serviços de Autenticação.
- Com o Amazon Location Service, você pode facilmente adicionar recursos como mapas, pontos de interesse, geocodificação, roteamento, cercas geográficas e rastreamento para aplicativos. Utilizaremos o Location Service para a exibição de mapas no front end e para armazenar as informações de rastreamento do veículo.
Agora vamos analisar a arquitetura da solução que está dividida em 3 principais áreas:
- Broker MQTT e armazenamento dos dados: Utilizaremos o AWS IoT Core na função de broker MQTT (serviço para receber os dados de geolocalização) e através de suas Rules enviaremos os dados para o processamento no AWS Lambda. A função Lambda será responsável por receber esses eventos e enviá-los para o Location Service.
- Protótipo do dispositivo que ficará dentro do veículo: Esse dispositivo é responsável pela captura de dados de geolocalização (latitude, longitude e data/hora) e transmissão para a nuvem utilizando a internet como meio físico e organizando os dados através do protocolo MQTT (Message Queue Telemetry Transport – https://mqtt.org/).
- Front End, Autenticação, e APIs: Esta parte da aplicação será responsável pelo Front End, ou seja, exibição do mapa para os usuários finais e também a consulta dos pontos de GPS (Tracking) capturados pelo Edge Device. Utilizo o React JS integrado ao Amplify para prover as funcionalidades de Autenticação (Amazon Cognito) e REST API (Amazon API Gateway e Lambda) para a aplicação final.
Pré-Requisitos
Para que você possa executar todas as etapas deste tutorial e criar o seu próprio Rastreador Veicular será necessário que você possua alguns componentes e alguns conhecimentos prévios, que listamos nesta seção:
- React JS para aplicar os exemplos citados durante o post e modificar alguns trechos de código.
- Noções básicas sobre Linux, Raspberry Pi, Node-Red, e MQTT;
- Possuir um Raspberry Pi e GPS USB. Utilizamos o modelo “Zero W” neste tutorial, mas outros modelos também poderão ser utilizados com alguns poucos ajustes.
- Uma conta na AWS. Se tem dúvidas de como criar uma conta na AWS acesse o link aqui.
- O Amplify Command Line Interface (CLI) é um pré-requisito para a execução deste tutorial.
Mão na Massa 1: Amazon Location Service
Nesta seção vamos iniciar a parte prática e instanciar dois recursos do Location Service: Maps e Trackers. Os Maps são responsáveis por fornecerem os recursos necessários para que o navegador possa renderizar os mapas na tela do usuário final. O recurso chamado de Tracker irá armazenar e processar os dados de geolocalização para que possamos rastrear um determinado dispositivo, que no nosso caso será um veículo.
O diagrama abaixo destaca os 3 serviços responsáveis pelo processamento e armazenamento dos dados de geolocalização. Faremos a configuração de cada um deles a seguir, iniciando pelo Location Service.
- Primeiro vamos criar o Mapa e o Asset Tracking no serviço Location Service. Acesse o serviço (Location Service), na console de gerenciamento da AWS, através do Dashboard ou pelo campo Search. Escolher Maps no menu.
- Na próxima tela, selecionar o botão Create map.
- Determinar um nome para o serviço de mapas no campo Name, uma descrição, e selecionar um dos estilos de mapas disponíveis.
- Anotar o Nome do Mapa e o ARN, que serão utilizados durantes as demais etapas de configuração.
- O próximo passo será a criação do Tracker, que é semelhante a criação dos mapas. Para isso selecione o item Trackers, no meu, e depois selecione o botão Create tracker.
- Na próxima tela, determinar um nome para o Tracker (exemplo que utilizei foi o MySampleTracker), uma breve descrição, e selecionar no botão Create tracker.
- Anotar o Nome do Tracker e o ARN, que serão utilizados durante as demais etapas de configuração.
Mão na Massa 2: AWS IoT Core e o AWS Lambda
Agora vamos configurar o serviço AWS IoT Core que é o Broker para o protocolo MQTT. O objetivo principal nesta seção será criar um dispositivo lógico no serviço, políticas de acesso e regras para redirecionarmos as mensagens para o posterior processamento no Lambda.
- Para iniciar a configuração do AWS IoT Core, basta acessá-lo através do menu principal da console AWS ou digitar o nome do serviço no campo Search.
- A primeira ação será criar uma Policy para os dispositivos. Para isso, acesse o menu Secure / Policies e selecionar o botão Create. Essa política será responsável pela segurança no envio dos dados e determinará quais funcionalidades do AWS IoT Core o dispositivo terá permissão de utilizar.
- Preencher os dados conforme a figura abaixo. Para este exemplo criamos uma política restritiva que permite apenas 3 ações de IoT (Connect, Re ceive e Publish). Utilizar o botão Add statement para adicionar mais ações na política. Após isso selecionar o botão Create.
- O próximo passo será criar uma Thing, ou seja, um dispositivo lógico. Selecionar o menu Manage / Things e clicar no botão Create. Em seguida clicar no botão “Create a single thing”, pois iremos cadastrar um único dispositivo.
- Na janela Add your device to the thing registry, inserir o nome do dispositivo no campo Name e clicar no botão Next. No próximo passo criaremos os certificados e chaves (Keys) que permitirão o envio dos dados dos Edge Devices para o AWS IoT Core de maneira segura (criptografada). Selecionar o botão Create certificate.
- Na tela seguinte efetuar o download do arquivo do certificado, da chave publica, e da chave privada, clicando em todos os 3 links Download. Você também precisará do root CA, portanto selecionar o link Download do root CA e verificar as instruções da documentação. Esses arquivos serão necessários para a configuração do NodeRed (MQTT Out Node), que faremos na seção “Mão na Massa – Parte 3”. Em seguida clicar no botão Activate e depois em Attach a policy.
- Selecionar a policy, que acabamos de criar, e selecionar o botão Register Thing.
Pronto o seu dispositivo foi configurado no AWS IoT Core.
- Vamos agora coletar mais uma informação que será necessária no processo de configuração do NodeRed, o endpoint do IoT Broker. Para isso clique no nome do dispositivo que acabou de criar (exemplo: MyCar01).
- Clique no menu Interact e anote o endereço que aparece no campo HTTPS. Esse endereço é o endpoint (Server) que será utilizado na configuração do MQTT Out Node (NodeRed) na seção “Mão na Massa – Parte 3”.
- A próxima tarefa será configurar a Rule do AWS IoT Core. A Rule tem a função de filtrar as mensagens que desejamos redirecionar para o AWS Lambda.
- Para iniciar a configuração da Rule, clique no Menu Act / Rules. Selecione o Botão Create. Preencha o campo Name e Description com o nome da regra e uma descrição, respectivamente, e modifique a query SQL conforme código abaixo. Determinei como “mycartopic” o nome do Topic onde enviaremos as mensagens IoT.
SELECT * FROM ‘mycartopic’
- O Broker MQTT é um serviço do tipo Pub/Sub. Você poderá filtrar as mensagens recebidas no tópico antes de redirecioná-las a outros serviços na nuvem. Essa configuração irá redirecionar todas as mensagens recebidas no tópico “mycartopic” para a Rule em questão. Na sequência clique no botão Add action para adicionar uma regra.
- Selecionar Send a message to a Lambda function e clicar no botão Configure action.
- Selecionar o botão Create a new Lambda function. Você será redirecionado para uma nova janela/tab no navegador para a criação de um Lambda Function.
- Determinar um nome para a função (exemplo: MyCarTrackerBlog) e selecionar Python no campo Runtime. Clicar no botão Create Function.
- Na seção Function Code, duplo clique em lambda_function.py e substituir o código padrão do Lambda pelo código abaixo. Substituir o valor da variável TRACKER_NAME pelo nome do Tracker que anotou na seção 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)
}
- Esse código irá receber um evento do AWS IoT Core e irá enviar os dados para o Location Service numa Track chamada MySampleTracker (exemplo). Será necessário ajustar o permissionamento do Lambda para o envio dos dados para o Asset Tracking system do Location Service. Para isso clique em Permissions, e clique no nome da
- Clique em Add inline policy. Selecione Location no campo Service. Para uma maior segurança no ambiente limitamos as permissões para apenas uma ação, o BatchUpdateDevicePosition do Location Services.
- Na próxima seção (Resources) adicionar o ARN do tracker através do link Add ARN (tracker).
- Especificar a ARN do Tracker no campo Specify ARN for Tracker. Esse parâmetro foi criado durante a seção “Mão na Massa – Parte 1”. Selecionar no botão Add.
- Selecionar o botão Review policy.
- Em seguida insira um nome para a sua policy no campo Name. Clique no botão Create Policy.
- Retorne para a tela/tab do Lambda Function. Clique na aba Configuration e na section Function Code salve o arquivo (File / Save), clique no botão Deploy e depois em Action / Publish new version. Pronto agora a sua função está pronta para uso.
- Retorne para a Janela do AWS IoT Core Rules. Clique no botão Select e depois em Refresh. Procure pela função Lambda que acabou de criar. Selecione a função e clique no botão Add action.
- Clique em Create Rule e sua Rule estará criada. Ativar a Rule através do item “…”/Enable.
Conclusão
Neste primeiro post instanciamos e configuramos o Amazon Location Service e com isso conseguimos explorar duas funcionalidades do serviço, Maps e o Tracker. Conseguimos verificar a simplicidade na criação das funcionalidades e exploramos a integração com o AWS IoT Core e também com o AWS Lambda para o recebimento de coordenadas de GPS.
No próximo post (Parte 2) criaremos o dispositivo para captura das informações do GPS. Se você tem algum comentário ou dúvida, poderá utilizar o link abaixo e nos enviar o seu feedback. Até o próximo post!
Sobre o Autor
Gerson Itiro Hidaka atualmente trabalha como Arquiteto de Soluções da AWS e atua no atendimento a parceiros mundiais chamados de Global System Integrators and Influencers (GSIIs) na região da América Latina. Entusiasta de tecnologias como Internet das Coisas (IoT), Drones, Devops e especialista em tecnologias como virtualização, serverless, container e Kubernetes. Trabalha com soluções de TI a mais de 24 anos, tendo experiência em inúmeros projetos de otimização de infraestrutura, redes, migração, disaster recovery e DevOps em seu portifólio.
Revisores
Murilo Nascimento é um gerente de produtos na AWS. Especialista em tecnologias de bancos de dados, gosta muito de estudar sobre o tema e gosta mais ainda de compartilhar o que aprende com outras pessoas.
Giovanna Chiaratti é Arquiteta de Soluções para Parceiros na América Latina focada em países de língua espanhola. Admiradora e estudiosa de tecnologias como Machine Learning, Inteligência Artificial e Serverless. Trabalha para escalar parceiros de consultoria e tecnologia para que possam apoiar a AWS em criar soluções seguras, inovadoras e inteligentes.
Juliano Fernandes Baeta é Arquiteto de Soluções para Global Systems Integrators para a América Latina. É um entusiasta de Big Data, Analytics, Machine Learning e sua missão é ajudar parceiros a construir soluções seguras, eficazes e resilientes na AWS.