Blog de Amazon Web Services (AWS)

Cree una aplicación de seguimiento para iOS con Amazon Location Service y AWS Amplify

Por Fernando Rocha Silva, Arquitecto de Soluciones especialista en Mobile y
Panna Shetty, Technical Account Manage Senior

 

Los desastres naturales ocurren a menudo en todo el mundo. Las inundaciones, los incendios y los huracanes son eventos estacionales que amenazan a la población y deben tratarse con cuidado y experiencia. Comprender el estado del problema en tiempo real y poder proteger a la población se vuelve crucial en situaciones como estas.

En caso de incendios forestales, por ejemplo, los miembros de los cuerpos de bomberos siguen políticas y estándares operacionales que describen la rapidez con la que reaccionar en situaciones de emergencia para evitar riesgos innecesarios. La situación en estos casos se vuelve compleja hasta el punto de no poder garantizar la seguridad de todos los miembros del equipo y se requiere un enfoque diferente.

Una de las formas de control consiste en el establecimiento de un área de seguridad designada, o geovalla. Esta área no siempre puede estar predeterminada y puede que tenga que cambiar para responder a las condiciones peligrosas que se desarrollan, por lo que los equipos de emergencia necesitan saber dónde están sus miembros cuando se producen cambios en las normas en tiempo real. Una de las formas de mejorar este proceso es automatizar la actividad de seguimiento y respuesta de los miembros, de modo que los líderes de los equipos de emergencia puedan dar cuenta rápidamente de todos los miembros, y luego concentrarse en las operaciones de recuperación.

Los equipos de emergencia deberían poder hacer un seguimiento de su ubicación actual para que los líderes de equipo que se ocupan de las comunicaciones vitales sobre el terreno puedan determinar si se encuentran en una posición comprometida y establecer rápidamente una geovalla de seguridad. También deberían poder visualizar en tiempo real la situación actual de los miembros sobre el terreno y proporcionar la ubicación de la geovalla. Cada miembro debería poder ver la geovalla actual en su dispositivo para poder desplazarse rápidamente a esa ubicación. Una vez que el miembro esté a salvo, se notificará a los líderes de los equipos de emergencia.

Amazon Location Service proporciona funciones como mapas, ubicaciones, geocodificación, rutas, geovallas, y seguimiento de posiciones. Realiza un seguimiento de los datos de ubicación con Amazon Location y, debido a la simplicidad del servicio, puedes crear aplicaciones sofisticadas habilitadas para la ubicación con datos en tiempo real, y llevarlas a producción rápidamente.

 

Descripción de la solución

En la siguiente arquitectura, tenemos dos tipos de aplicaciones móviles que se conectan de forma segura a un backend con servicios creados por AWS Amplify. En este ejemplo concreto, utilizamos la biblioteca Amplify para iOS.

Los clientes de iOS dependen de  Amazon Cognito para la autenticación y autorización, usando la categoría de autenticación de Amplify. Amplify DataStore se utiliza para conservar los datos localmente en el lado del cliente, proporcionando características que permiten la sincronización automática de datos entre dispositivos y la nube. La categoría Amplify DataStore depende de una capa de API de GraphQL proporcionada por AWS AppSync conectada a Amazon DynamoDB para el almacenamiento de datos.

El SDK de AWS se utiliza para recopilar geovallas creadas por Amazon Location mediante la API proporcionada por la biblioteca. La API de seguimiento se utiliza para recopilar la ubicación actual del miembro del equipo de seguridad e identificar los eventos IN y OUT que se producen en la colección de geovallas asociadas con el rastreador. Tan pronto como se producen estos eventos, se envían a Amazon EventBridge, donde se activa una regla y el evento se envía a una función de AWS Lambda. A continuación, el evento se analiza y se envía a AppSync, mientras que los datos persisten en DynamoDB. La aplicación Brigade Leader detecta el cambio en DynamoDB y actualiza el estado actual del usuario.

 

 

[TEXTO ALT: La aplicación móvil del miembro del equipo se conecta al rastreador de Amazon Location Service a través del SDK, y cuando la latitud y longitud proporcionadas por el rastreador cruzan una geovalla, se envía un evento a EventBridge y se activa una función Lambda.  Esta función actualiza DynamoDB a través de AppSync con información del usuario, marcándolo como seguro o no.  Otra aplicación, utilizada por los líderes de equipo, rastrea a los usuarios y su estado.  Ambas aplicaciones móviles dependen de Cognito para su autenticación y autorización.  La aplicación móvil utiliza AWS Amplify para conectarse a Cognito, a través de Amplify Auth y AppSync, a través de Amplify API y Amplify DataStore.]

 

Privacidad de datos

Con Amazon Location Service, mantienes el control de los datos de tu organización. El servicio anonimiza todas las consultas enviadas a los proveedores de datos eliminando metadatos de los clientes y la información de la cuenta. Además, la información confidencial de localización y ubicación de geovallas, como instalaciones y ubicaciones personales, nunca sale de su cuenta de AWS. Esto ayuda a proteger la información confidencial de terceros, proteger la privacidad de los usuarios y reducir los riesgos de seguridad de su aplicación.

Tutorial

La solución consta de tres partes igualmente importantes: el seguimiento y recopilación de geovallas con Amazon Location Service, las aplicaciones móviles junto con sus backends de soporte y la regla de Amazon EventBridge.

Para implementar la solución, sigue el tutorial de implementación en GitHub.

 

Rastreadores y geovallas con Amazon Location Service

En este ejemplo, utilizamos la API de Geofencing para crear una colección de geovallas, que representa los puntos de encuentro que se recopilan en la aplicación de los miembros de equipo, apuntando a ubicaciones seguras donde se pueden mover; y las API de seguimiento utilizadas por la aplicación para detectar la ubicación actual del dispositivo a medida que se mueve.

A medida que se actualiza la ubicación del dispositivo, el servicio de seguimiento detecta si la ubicación actual se encuentra dentro de una geovalla para generar eventos IN o OUT que se envían a Amazon EventBridge. A continuación, se muestra un ejemplo de un evento ENTRADA (ENTER) generado por el 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

]

}

}

 

Aplicación iOS, AWS Amplify y AWS SDK

Las aplicaciones se basan en iOS (SWIFTUI) y se benefician de las categorías Auth y DataStore de AWS Amplify para autenticar y autorizar a los usuarios con Cognito, así como sincronizar los datos de usuario con la nube mediante AppSync y DynamoDB. Amplify también se utiliza para crear la función de AWS Lambda que EventBridge activa cuando se produce un evento IN o OUT.

 

 

[TEXTO ALT: La imagen muestra una aplicación móvil en la que el usuario está representado como un punto azul central y las geovallas se muestran como polígonos rojos en el mapa.  El usuario se encuentra dentro de una geovalla.]

 

Recopilación de geovallas

La aplicación utiliza la API listGeofences proporcionada por el SDK de AWS para recopilar las áreas asociadas de las geovallas creadas en el servicio de ubicación.

 

@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

}

}

 

La superposición devuelta por la API listGeofences se utiliza para dibujar los puntos de encuentro en la aplicación móvil.

 

Creación del rastreador

Para rastrear la ubicación geográfica del teléfono móvil, utilizamos la API de AWSLocationTracker proporcionada por el SDK de AWS.

 

let locationTracker = AWSLocationTracker(

trackerName: <YOUR-TRACKER-NAME>,

region: AWSRegionType.<YOUR-REGION>,

credentialsProvider: AWSMobileClient.default())

 

Cuando el usuario autoriza a la aplicación móvil para detectar la ubicación del dispositivo, iniciamos el rastreador de ubicación utilizando el identificador de usuario como identificador de dispositivo. También configuramos una suscripción para interceptar la respuesta de Amazon Location Service una vez se ha transmitido la posición.

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")

}

}

 

Cuando el usuario empieza a moverse, podemos interceptar la nueva latitud y longitud:

func locationManager(

manager: CLLocationManager,

didUpdateLocations locations: [CLLocation])

{

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

locationTracker.interceptLocationsRetrieved(locations)

}

 

Uso de Amazon EventBridge para modificar el estado de seguridad del usuario

La última parte de nuestra solución se realiza configurando una regla en Amazon EventBridge para detectar los eventos IN y OUT generados por el dispositivo en función de su ubicación. Esta regla activa una función Lambda que utiliza AppSync para actualizar la tabla de DynamoDB que contiene el estado de seguridad del usuario.

Este es el código de la función 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)

}

[TEXTO ALT: La aplicación del líder de equipo muestra una lista de usuarios, representada en rojo si el usuario no está seguro, y verde si está en un lugar seguro.]

 

Conclusión

Esta arquitectura sin servidor (serverless) que aprovecha Amazon Location Service junto con AWS Amplify, Amazon Cognito, AWS AppSync y otros servicios de AWS, proporciona una solución sencilla y eficaz para administrar y supervisar equipos de seguridad durante una emergencia.

El papel de los líderes de equipo es complejo debido a la naturaleza de su trabajo. Con Amazon Location Service, puedes crear fácilmente aplicaciones sencillas con seguimiento, geovallas y otras funciones. La capacidad de establecer rápidamente un área de seguridad y rastrear el movimiento de los miembros en el terreno en tiempo real es fundamental para la seguridad de los miembros de los equipos de emergencia, nuestros héroes cotidianos.

 

Este artículo fue traducido del Blog da AWS en Inglés.

 


Sobre los autores

Fernando Rocha es arquitecto de soluciones especializado en tecnologías móviles, front-end y geoespaciales en AWS

 

 

 

 

Panna Shetty es una Sr. Technical Account Manager en AWS.