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.

 

Figura 1 – Preview da Aplicação

 

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.

 

Figura 2 – Diagrama da Solução e as 3 partes da Arquitetura

 

A seguir descreveremos os serviços e os componentes que foram utilizados no diagrama:

 

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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:

  1. 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.
  2. 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/).
  3. 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:

  1. React JS para aplicar os exemplos citados durante o post e modificar alguns trechos de código.
  2. Noções básicas sobre Linux, Raspberry Pi, Node-Red, e MQTT;
  3. 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.
  4. Uma conta na AWS. Se tem dúvidas de como criar uma conta na AWS acesse o link aqui.
  5. 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.

 

Figura 3 – Diagrama da Solução

 

  1. 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.
  2. Na próxima tela, selecionar o botão Create map.

 

Figura 4 – Amazon Location Service (Maps)

 

  1. Determinar um nome para o serviço de mapas no campo Name, uma descrição, e selecionar um dos estilos de mapas disponíveis.

 

Figura 5 – Criação do Mapa

 

  1. Anotar o Nome do Mapa e o ARN, que serão utilizados durantes as demais etapas de configuração.

 

 

  1. 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.
  2. 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.
  3. Anotar o Nome do Tracker e o ARN, que serão utilizados durante as demais etapas de configuração.

 

Figura 7 – Tracker

 

 

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.

  1. 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.
  2. 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.
  3. 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.

 

 

  1. 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.
  2. 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.
  3. 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.

 

Figura 9 – Certificado e Chaves

 

  1. Selecionar a policy, que acabamos de criar, e selecionar o botão Register Thing.

 

Figura 10 – Anexando a política

 

Pronto o seu dispositivo foi configurado no AWS IoT Core.

  1. 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).

 

Figura 11 – Criando Things

 

  1. 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”.

 

Figura 12 – AWS IoT Core Endpoint

 

  1. 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.
  2. 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’

 

  1. 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.
  2. Selecionar Send a message to a Lambda function e clicar no botão Configure action.

 

Figura 13 – Rules

 

  1. 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.
  2. Determinar um nome para a função (exemplo: MyCarTrackerBlog) e selecionar Python no campo Runtime. Clicar no botão Create Function.
  3. 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)

  }

 

  1. 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

 

Figura 14 – Permissionamento

 

  1. 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.

 

Figura 15 – InLine Policy

 

  1. Na próxima seção (Resources) adicionar o ARN do tracker através do link Add ARN (tracker).

 

Figura 16 – Inline Policy

 

  1. 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.

 

Figura 17 – Inline Policy

 

  1. Selecionar o botão Review policy.
  2. Em seguida insira um nome para a sua policy no campo Name. Clique no botão Create Policy.

 

Figura 18 – Politica

 

  1. 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.
  2. 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.
  3. Clique em Create Rule e sua Rule estará criada. Ativar a Rule através do item “…”/Enable.

 

Figura 19 – Habilitando a Rule

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.