O blog da AWS

Crie um aplicativo de rastreamento de segurança para iOS com Amazon Location Service e AWS Amplify

Por Fernando Rocha Silva, Arquiteto de Soluções especialista em Mobile e
Panna Shetty, Technical Account Manage Senior

 

Desastres naturais acontecem com frequência ao redor do mundo. Enchentes, incêndios, e furacões são eventos sazonais que ameaçam populações e precisam ser tratadas com cuidado e experiência. Entender a situação do problema em tempo real e ser capaz de proteger a população se torna crucial em situações como essas.

Em caso de incêndios florestais, por exemplo, membros de brigadas de incêndio seguem politicas e padrões de operações que descrevem como rapidamente reagir em situações de emergência para evitar riscos desnecessários. A situação nesses casos se torna complexa a ponto de dificultar a garantia de segurança de todos do time e uma abordagem diferente é necessária.

Uma das formas de controle envolve o estabelecimento de uma área de encontro ou segurança. Essa área nem sempre pode ser pré-determinada e pode precisar mudar para responder a condições de perigo que se desenvolvem, por isso brigadas de emergência precisam saber onde seus membros estão quando mudanças de normas acontecerem em tempo real. Uma das maneiras de melhorar esse processo é automatizar o rastreamento de membros e a atividade de resposta, para que os líderes da brigada de emergência possam responder rapidamente por todos os membros e então se concentrar nas operações de recuperação de pessoas em perigo.

As equipes de emergência devem ser capazes de ter sua localização atual rastreada para que os lideres da brigada que lidam com as comunicações vitais de campo possam determinar se eles estão em uma posição comprometida e estabelecer rapidamente uma cerca geográfica de segurança. Devem, também ser capazes de visualizar em tempo real a situação atual dos membros em campo e fornecer a localização da área de segurança definida. Cada um dos membros deve ser capaz de ver a cerca geográfica atual em seu dispositivo para que possam mover-se rapidamente para esse local. Assim que o membro estiver seguro, os lideres da brigada de emergência serão notificados.

O Amazon Location Service fornece recursos como mapas, locais, geocodificação, rotas, cercas geográficas, e rastreamento de posições. Você mantém o controle de seus dados de localização com o Location Service e, devido à simplicidade do serviço, você pode criar aplicativos sofisticados com serviços de localização, com dados em tempo real, rapidamente.

 

Visão geral da solução

Na arquitetura a seguir, temos dois tipos de aplicativos móveis que se conectam com segurança a um back-end com serviços provisionados pelo AWS Amplify. Neste exemplo específico, usamos a biblioteca do Amplify para iOS.

Os clientes iOS contam com o Amazon Cognito para autenticação e autorização, fornecida usando a categoria de autenticação do Amplify. O Amplify DataStore é usado para persistir os dados localmente no lado do cliente, fornecendo recursos que permitem a sincronização automática de dados entre os dispositivos e a nuvem. A categoria do Amplify DataStore depende de uma camada de API GraphQL fornecida pelo AWS AppSync conectada ao Amazon DynamoDB para armazenamento de dados.

O SDK da AWS é usado para coletar cercas geográficas criadas pelo Location Service usando a API fornecida pela biblioteca. A API de Rastreamento é usada para coletar a localização atual do membro da equipe de segurança e para identificar os eventos de ENTRADA e SAÍDA que ocorrem na coleção de cercas associadas ao rastreador. Assim que tais eventos ocorrem, eles são enviados para o Amazon EventBridge, onde uma regra é acionada e o evento é enviado para uma função do AWS Lambda. O evento é então analisado e enviado ao AppSync, persistindo os dados no DynamoDB. O aplicativo do líder da brigada detecta a mudança no DynamoDB e atualiza o status atual do usuário.

 

 

[ALT TEXT: O aplicativo móvel do membro da brigada se conecta ao rastreador do Amazon Location Service via SDK, uma vez que a latitude e longitude fornecidas pelo rastreador cruzam uma cerca, um evento é enviado para o EventBridge e uma função do Lambda é acionada. Esta função atualiza o DynamoDB via AppSync com as informações do usuário, marcando-o como seguro ou não. Outro aplicativo, utilizado pelos líderes da brigada, rastreia os usuários e seu status de segurança. Ambos os aplicativos móveis contam com o Cognito para autenticação e autorização. O AWS Amplify é usado pelo aplicativo móvel para se conectar ao Cognito, via Amplify Auth e AppSync, via Amplify API e Amplify DataStore.]

 

Privacidade de dados

Com o Amazon Location Service, você mantém o controle dos dados da sua organização. O serviço torna anônima todas as consultas enviadas aos provedores de dados, removendo metadados do cliente e informações da conta. Além disso, informações confidenciais de localização de cerca geográfica e rastreamento, como instalações e localizações pessoais, nunca saem de sua conta da AWS. Isso ajuda a proteger informações confidenciais de terceiros, proteger a privacidade do usuário e reduzir os riscos de segurança do seu aplicativo.

Passo a passo

A solução consiste em três peças igualmente importantes: o rastreador e coleta de cercas do Amazon Location Service, os aplicativos móveis juntamente com seus back-ends de suporte e a regra do Amazon EventBridge.

Para implementar a solução, siga o tutorial de implementação no GitHub.

 

Os Rastreadores e Cercas Geográficas do Amazon Location Service

Neste exemplo, usamos a API de cercas geográficas para criar uma coleção de cercas, que representa os pontos de encontro de segurança que são coletados no aplicativo dos membros da brigada, apontando para locais seguros para onde eles podem se mover; e APIs de rastreamento, usadas pelo aplicativo para detectar a localização atual do dispositivo conforme ele se move.

Conforme a localização do dispositivo é atualizada, o serviço de rastreamento detecta se a localização atual está dentro de uma cerca geográfica para gerar eventos de ENTRADA ou SAÍDA que são enviados para o Amazon EventBridge. Abaixo, você vê um exemplo de um evento ENTRADA(ENTER) gerado pelo rastreador:

{

"version": "0",

"id": "aa11aa22-33a-4a4a-aaa5-example",

"detail-type": "Location Geofence Event",

"source": "aws.geo",

"account": "636103698109",

"time": "2020-11-10T23:43:37Z",

"region": "eu-west-2",

"resources": [

"<GeofenceCollection-ARN>",

"<TRACKER-ARN>"

],

"detail": {

"EventType": "ENTER",

"GeofenceId": "<GEOFENCE-ID>",

"DeviceId": "<DEVICE-ID>",

"SampleTime": "2020-11-10T23:43:37.531Z",

"Position": [

-123.12390073297821,

49.23433613216247

]

}

}

 

Aplicativo iOS, AWS Amplify e o SDK da AWS

Os aplicativos são desenvolvidos em iOS (SwiftUI) e se beneficiam das categorias Auth e DataStore do AWS Amplify para autenticar e autorizar usuários com Cognito, além de sincronizar os dados do usuário com a nuvem usando AppSync e DynamoDB. O Amplify também é usado para criar a função AWS Lambda que é acionada pelo EventBridge quando um evento de ENTRADA ou SAÍDA ocorre.

 

 

[ALT TEXT: A imagem exibe um aplicativo móvel onde o usuário é representado como um ponto azul central e as áreas de segurança são mostradas como polígonos vermelhos no mapa. O usuário está dentro da cerca geográfica.]

 

Coletando as cercas geográficas

O aplicativo utiliza a API de listGeofences provida pelo SDK da AWS para coletar as áreas associadas as cercas criadas no Location Service.

 

@Published var overlays = [MKPolygon]()




func listGeofences() {

let request = AWSLocationListGeofencesRequest()!

request.collectionName = “<GEOFENCE-COLLECTION-NAME>”




let result = AWSLocation.default().listGeofences(request)

result.continueWith { (task) -> Any? in

if let error = task.error {

print("error \(error)")

} else if let taskResult = task.result {

var overlays = [MKPolygon]()




for entry in taskResult.entries! {

let polygonEntry = entry.geometry?.polygon![0]




var polygons = [CLLocationCoordinate2D]()

for polygon in polygonEntry! {

let lon = polygon[0] as! Double

let lat = polygon[1] as! Double

polygons.append(CLLocationCoordinate2D(latitude: lat, longitude: lon))

}




let polygon = MKPolygon(coordinates: polygons, count: polygons.count)

overlays.append(polygon)

}

DispatchQueue.main.async {

self.overlays = overlays

}

}

return nil

}

}

 

A sobreposição retornada pela API de listGeofences é usada para desenhar os pontos de encontro no aplicativo mobile.

 

Criando o rastreador

Para rastrear a posição geográfica do celular, vamos utilizar a API AWSLocationTracker providenciada pelo SDK da AWS.

 

let locationTracker = AWSLocationTracker(

trackerName: <YOUR-TRACKER-NAME>,

region: AWSRegionType.<YOUR-REGION>,

credentialsProvider: AWSMobileClient.default())

 

Quando o usuário autoriza o aplicativo móvel a detectar a localização do dispositivo, iniciamos o rastreador de localização usando o id do usuário como um id do dispositivo. Também configuramos uma subscrição para interceptar a resposta do Amazon Location Service depois que a posição for transmitida.

func locationManagerDidChangeAuthorization(manager: CLLocationManager) {

switch manager.authorizationStatus {

case .authorizedWhenInUse:

print("Received authorization of user location, requesting for location")

let result = locationTracker.startTracking(

delegate: self,

options: TrackerOptions(

customDeviceId: Amplify.Auth.getCurrentUser()?.userId,

retrieveLocationFrequency: TimeInterval(5),

emitLocationFrequency: TimeInterval(20)),

listener: onTrackingEvent)

switch result {

case .success:

print("Tracking started successfully")

case .failure(let trackingError):

switch trackingError.errorType {

case .invalidTrackerName, .trackerAlreadyStarted, .unauthorized:

print("onFailedToStart \(trackingError)")

case .serviceError(let serviceError):

print("onFailedToStart serviceError: \(serviceError)")

}

}

default:

print("Failed to authorize")

}

}

 

Quando o usuário começa a se mover, podemos interceptar a nova latitude e longitude:

func locationManager(

manager: CLLocationManager,

didUpdateLocations locations: [CLLocation])

{

print("Got locations: \(locations)")

locationTracker.interceptLocationsRetrieved(locations)

}

 

Utilizando o Amazon EventBridge para modificar o status de segurança do usuário

A última parte de nossa solução é realizada pela configuração de uma regra no Amazon EventBridge para detectar eventos de ENTRADA e SAÍDA gerados pelo dispositivo, baseados em sua localização. Esta regra dispara uma função do Lambda que utiliza o AppSync para atualizar a tabela no DynamoDB que contém o status de segurança do usuário.

Este é o código da função Lambda:

/* Amplify Params - DO NOT EDIT

API_MUSTERPOINTLOCATIONAPI_GRAPHQLAPIENDPOINTOUTPUT

API_MUSTERPOINTLOCATIONAPI_GRAPHQLAPIIDOUTPUT

ENV

REGION

Amplify Params - DO NOT EDIT */




const https = require('https')

const AWS = require('aws-sdk')

const urlParse = require('url').URL

const region = process.env.REGION

const appsyncUrl = process.env.API_MUSTERPOINTLOCATIONAPI_GRAPHQLAPIENDPOINTOUTPUT




const request = (queryDetails, appsyncUrl, apiKey) => {

const req = new AWS.HttpRequest(appsyncUrl, region)

const endpoint = new urlParse(appsyncUrl).hostname.toString()




req.method = 'POST'

req.path = '/graphql'

req.headers.host = endpoint

req.headers['Content-Type'] = 'application/json'

req.body = JSON.stringify(queryDetails)




if (apiKey) {

req.headers['x-api-key'] = apiKey

} else {

const signer = new AWS.Signers.V4(req, 'appsync', true)

signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate())

}




return new Promise((resolve, reject) => {

const httpRequest = https.request({ ...req, host: endpoint }, (result) => {

result.on('data', (data) => {

resolve(JSON.parse(data.toString()))

})

})




httpRequest.write(req.body)

httpRequest.end()

})

}




const updateSafetyMutation = /* GraphQL */ `

mutation updateUser($input: UpdateUserInput!) {

updateUser(input: $input){

id

isSafe

username

_lastChangedAt

_version

_deleted

}

}

`

const queryUser = /* GraphQL */ `

query getUser($id: ID!) {

getUser (id: $id) {

id

username

isSafe

_version

}

}

`




exports.handler = async (event) => {

const userId = event?.detail?.DeviceId

console.log('new geofence event:', event)




var queryResult = await request(

{

query: queryUser,

variables: { id: userId },

},

appsyncUrl

)

console.log('query result', queryResult)







const user = queryResult?.data?.getUser

if (!user) {

return {

statusCode: 404,

body: `User with id ${userId} not found in the database.`,

};

}




const version = user?._version

var result = await request(

{

query: updateSafetyMutation,

variables: {

input: {

id: userId,

isSafe: event?.detail?.EventType === "ENTER",

_version: version

},

},

},

appsyncUrl

)

console.log('appsync result', result)

}

[ALT TEXT: o aplicativo do gerente da brigada mostra uma lista de usuários, representadas em vermelho se o usuário não está seguro e verde, se está seguro.]

 

Conclusão

Essa arquitetura serverless que utiliza o Amazon Location Service em conjunto com AWS Amplify, Amazon Cognito, AWS AppSync, e outros serviços AWS, fornece uma solução simples e eficaz para gerenciar e monitorar agentes de segurança durante uma emergência.

O papel dos gerentes de emergência é complexo devido à natureza de seu trabalho. Com o Amazon Location Service, você pode criar facilmente aplicativos simples com rastreamento, cercas geográficas, e outros recursos. A capacidade de estabelecer rapidamente uma área de segurança e rastrear o movimento dos membros no campo em tempo real é crítica para a segurança dos membros da brigada de emergência, nossos heróis do dia a dia!

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre os autores

Fernando Rocha é um arquiteto de soluções especialista em Mobile, Front-end e tecnologias geoespaciais na AWS.

 

 

 

 

Panna Shetty é uma Sr. Technical Account Manage Senior na AWS