

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Rastreo mediante AWS IoT y MQTT con Amazon Location Service
<a name="tracking-using-mqtt"></a>

[MQTT](http://mqtt.org/) es un protocolo de mensajería ligero y ampliamente adoptado diseñado para dispositivos restringidos. AWS IoT Core admite conexiones de dispositivos que utilizan el protocolo MQTT y el protocolo MQTT over WebSocket Secure (WSS). 

[AWS IoT Core](https://aws.amazon.com/iot-core/) conecta dispositivos a AWS y le permite enviar y recibir mensajes entre ellos. El motor de reglas AWS IoT Core almacena las consultas sobre los temas de los mensajes de sus dispositivos y le permite definir acciones para enviar mensajes a otros servicios de AWS, como Amazon Location Service. A los dispositivos que conocen su ubicación como coordenadas se les puede reenviar su ubicación a Amazon Location a través del motor de reglas.

**nota**  
Los dispositivos pueden conocer su propia posición, por ejemplo, a través del GPS incorporado. AWS IoT también es compatible con el rastreo de la ubicación de dispositivos de terceros. Para obtener más información, consulte [AWS IoT Core Device Location](https://docs.aws.amazon.com/iot/latest/developerguide/device-location.html) en la *Guía para desarrolladores de núcleo de AWS IoT*.

En el siguiente tutorial se describe el rastreo mediante reglas de AWS IoT Core. También puede enviar la información del dispositivo a su propia función de AWS Lambda si necesita procesarla antes de enviarla a Amazon Location. Para obtener más información sobre el uso de Lambda para procesar las ubicaciones de sus dispositivos, consulte [Uso AWS Lambda con MQTT](tracking-using-mqtt-with-lambda.md).

**Topics**
+ [Requisito previo](#mqtt-prerequisite)
+ [Crear una regla de AWS IoT Core](#mqtt-create-iot-rule)
+ [Pruebe su regla de AWS IoT Core en la consola](#mqtt-test-iot-rule)
+ [Uso AWS Lambda con MQTT](tracking-using-mqtt-with-lambda.md)

## Requisito previo
<a name="mqtt-prerequisite"></a>

Antes de comenzar el rastreo, debe completar los siguientes requisitos previos:
+ [Crear un recurso de rastreo](start-create-tracker.md) al que enviar los datos de ubicación del dispositivo.
+ [Crear un rol de IAM](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-role.html) para conceder a AWS IoT Core acceso a su rastreador.

  Cuando siga estos pasos, use la siguiente política para dar acceso a su rastreador:

  ```
  {
    "Version": "2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "WriteDevicePosition",
        "Effect": "Allow",
        "Action": "geo:BatchUpdateDevicePosition",
        "Resource": "arn:aws:geo:*:*:tracker/*"
      }
    ]
  }
  ```

## Crear una regla de AWS IoT Core
<a name="mqtt-create-iot-rule"></a>

A continuación, cree una regla de AWS IoT Core para reenviar la telemetría posicional de sus dispositivos a Amazon Location Service. Para obtener más información sobre la creación de reglas, consulte los siguientes temas en la *Guía para desarrolladores de AWS IoT Core*:
+ [Crear una regla de AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-rule.html) para obtener información sobre cómo crear una nueva regla.
+ [Acción de ubicación](https://docs.aws.amazon.com/iot/latest/developerguide/location-rule-action.html) para obtener información específica sobre la creación de una regla para publicar en Amazon Location 

## Pruebe su regla de AWS IoT Core en la consola
<a name="mqtt-test-iot-rule"></a>

Si actualmente ningún dispositivo publica telemetría que incluya la ubicación, puede probar su regla con la consola de AWS IoT Core. La consola tiene un cliente de prueba en el que puede publicar un mensaje de muestra para comprobar los resultados de la solución.

1. Inicie sesión en la consola de AWS IoT Core en [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home).

1. En el menú de navegación de la izquierda, expanda **Pruebas** y elija **Cliente de pruebas de MQTT**.

1. En **Publicar en un tema**, defina el **Nombre del tema** como *iot/topic* (o el nombre del tema que haya configurado en su regla de AWS IoT Core, si es diferente) y proporcione lo siguiente para la **Carga de mensajes**. Sustituya la marca de tiempo *1604940328* por una marca de tiempo válida de los últimos 30 días (los rastreadores de Amazon Location Service ignoran las marcas de tiempo de más de 30 días).

   ```
   {
     "payload": {
       "deviceid": "thing123",
       "timestamp": 1604940328,
       "location": { "lat": 49.2819, "long": -123.1187 },
       "accuracy": { "Horizontal": 20.5 },
       "positionProperties": { "field1": "value1", "field2": "value2" }
     }
   }
   ```

1. Seleccione **Publicar** en un tema para enviar el mensaje de prueba.

1. Para validar que Amazon Location Service recibió el mensaje, use el siguiente comando AWS CLI. Si lo modificó durante la configuración, sustituya el nombre del rastreador por el que utilizó.

   ```
   aws location batch-get-device-position --tracker-name MyTracker --device-ids thing123
   ```

# Uso AWS Lambda con MQTT
<a name="tracking-using-mqtt-with-lambda"></a>

Si bien su uso ya no AWS Lambda es obligatorio para enviar datos de ubicación del dispositivo a Amazon Location para su seguimiento, es posible que desee utilizar Lambda en algunos casos. Por ejemplo, si desea procesar usted mismo los datos de ubicación de su dispositivo antes de enviarlos a Amazon Location. En los temas siguientes se describe cómo utilizar Lambda para procesar los mensajes antes de enviarlos al rastreador. Para obtener más información sobre este patrón, consulte la [arquitectura de referencia](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/amazon-location-service-ra.pdf).

**Topics**
+ [Requisito previo](#mqtt-prerequisite-with-lambda)
+ [Crear una función de Lambda](#mqtt-with-lambda-create-lambda)
+ [Crea una AWS IoT Core regla](#mqtt-create-iot-rule-with-lambda)
+ [Pon a prueba tu AWS IoT Core regla en la consola](#mqtt-test-iot-rule-with-lambda)

## Requisito previo
<a name="mqtt-prerequisite-with-lambda"></a>

Antes de empezar a realizar el rastreo, debe [crear un recurso de rastreo](start-tracking.md). Para crear un recurso de seguimiento, puedes usar la consola de Amazon Location AWS CLI, la o Amazon Location APIs. 

En el siguiente ejemplo, se utiliza la consola de Amazon Location Service para crear el recurso de rastreo:

1. Abre la consola de Amazon Location Service en [https://console.aws.amazon.com/location/](https://console.aws.amazon.com/location/home).

1. En el panel de navegación izquierdo, elija **Rastreadores**. 

1.  Seleccione **Crear rastreador**. 

1. Complete las casillas siguientes:
   + **Nombre**: introduzca un nombre único que tenga un máximo de 100 caracteres. Entre las entradas válidas se incluyen caracteres alfanuméricos, guiones y guiones bajos. Por ejemplo, *MyTracker*.
   + **Descripción**: escriba una descripción opcional. Por ejemplo, *Tracker for storing AWS IoT Core device positions*.
   + **Filtrado de posición**: seleccione el filtro que desee usar para las actualizaciones de posición. Por ejemplo, **filtrado basado en la precisión**.

1. Seleccione **Crear rastreador**. 

## Crear una función de Lambda
<a name="mqtt-with-lambda-create-lambda"></a>

Para crear una conexión entre Amazon Location Service AWS IoT Core y Amazon, necesitas una AWS Lambda función que procese los mensajes reenviados AWS IoT Core. Esta función extraerá todos los datos posicionales, los formateará para Amazon Location Service y los enviará a través de la API de Amazon Location Tracker. Puede crear esta función a través de la AWS Lambda consola, o puede usar AWS Command Line Interface (AWS CLI) o AWS Lambda APIs. 

Para crear una función de Lambda que publique actualizaciones de posición en Amazon Location mediante la consola:

1. Abra la AWS Lambda consola en [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/home).

1. En el panel de navegación izquierdo, elija **Funciones**. 

1.  Elija **Crear función** y asegúrese de que esté seleccionada la opción **Autor desde cero**. 

1. Complete las casillas siguientes:
   + **Nombre de función**: introduzca un nombre único para su función. Las entradas válidas incluyen caracteres alfanuméricos, guiones y guiones bajos sin espacios. Por ejemplo, *MyLambda*.
   + **Tiempo de ejecución**: elija*Python 3.8*.

1. Seleccione **Creación de función**. 

1. Elija la pestaña **Código** para abrir el editor.

1. Sobrescriba el código del marcador de posición `lambda_function.py` con lo siguiente y sustituya el valor asignado a `TRACKER_NAME` por el nombre del rastreador que creó como [requisito previo](#mqtt-prerequisite-with-lambda).

   ```
   from datetime import datetime
   import json
   import os
   
   import boto3
   
   # Update this to match the name of your Tracker resource
   TRACKER_NAME = "MyTracker"
   
   """
   This Lambda function receives a payload from AWS IoT Core and publishes device updates to 
   Amazon Location Service via the BatchUpdateDevicePosition API.
   
   Parameter 'event' is the payload delivered from AWS IoT Core.
   
   In this sample, we assume that the payload has a single top-level key 'payload' and a nested key
   'location' with keys 'lat' and 'long'. We also assume that the name of the device is nested in
   the payload as 'deviceid'. Finally, the timestamp of the payload is present as 'timestamp'. For
   example:
   
   >>> event
   { 'payload': { 'deviceid': 'thing123', 'timestamp': 1604940328,
     'location': { 'lat': 49.2819, 'long': -123.1187 },
     'accuracy': {'Horizontal': 20.5 },
     'positionProperties': {'field1':'value1','field2':'value2'} }
   }
   
   If your data doesn't match this schema, you can either use the AWS IoT Core rules engine to
   format the data before delivering it to this Lambda function, or you can modify the code below to
   match it.
   """
   def lambda_handler(event, context):
     update = {
         "DeviceId": event["payload"]["deviceid"],
         "SampleTime": datetime.fromtimestamp(event["payload"]["timestamp"]).strftime("%Y-%m-%dT%H:%M:%SZ"),
         "Position": [
           event["payload"]["location"]["long"],
           event["payload"]["location"]["lat"]
           ]
       }
     if "accuracy" in event["payload"]:
         update["Accuracy"] = event["payload"]['accuracy']
     if "positionProperties" in event["payload"]:
         update["PositionProperties"] = event["payload"]['positionProperties']
    
     client = boto3.client("location")
     response = client.batch_update_device_position(TrackerName=TRACKER_NAME, Updates=[update])
   
     return {
       "statusCode": 200,
       "body": json.dumps(response)
     }
   ```

1. Seleccione **Implementar** para almacenar la función actualizada.

1. Elija la pestaña **Configuración**.

1. En la sección **Permisos**, elija el nombre del rol con el hipervínculo para conceder permisos de Amazon Location Service a su función de Lambda.

1. En la página **Resumen** de su rol, seleccione **Agregar permisos** y, a continuación, en la lista desplegable, seleccione **Crear política integrada**.

1. Elija la pestaña **JSON** y sobrescriba la política con el siguiente documento. Esto permite que la función de Lambda actualice las posiciones de los dispositivos gestionadas por todos los recursos de rastreo en todas las regiones.

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "WriteDevicePosition",
         "Effect": "Allow",
         "Action": "geo:BatchUpdateDevicePosition",
         "Resource": "arn:aws:geo:*:*:tracker/*"
       }
     ]
   }
   ```

1. Elija **Revisar política**.

1. Escriba un nombre para la política. Por ejemplo, *AmazonLocationTrackerWriteOnly*.

1. Elija **Crear política**.

Puede modificar el código de esta función, según sea necesario, para adaptarlo al esquema de mensajes de su propio dispositivo.

## Crea una AWS IoT Core regla
<a name="mqtt-create-iot-rule-with-lambda"></a>

A continuación, cree una AWS IoT Core regla para reenviar la telemetría posicional de sus dispositivos a la AWS Lambda función para su transformación y publicación en Amazon Location Service. La regla de ejemplo proporcionada asume que cualquier transformación necesaria de las cargas útiles del dispositivo es gestionada por la función de Lambda. Puede crear esta regla a través de la AWS IoT Core consola, el AWS Command Line Interface ()AWS CLI o el. AWS IoT Core APIs

**nota**  
Si bien la AWS IoT consola gestiona los permisos necesarios para poder AWS IoT Core invocar la función Lambda, si va a crear la regla a partir del SDK o AWS CLI del SDK, [debe configurar una política a la que conceder](https://docs.aws.amazon.com/iot/latest/developerguide/lambda-rule-action.html#lambda-rule-action-requirements) el permiso. AWS IoT

**Para crear y AWS IoT Core usar la consola**

1. Inicie sesión en la AWS IoT Core consola en [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home).

1. En el panel de navegación izquierdo, expanda **Actuar** y, a continuación, elija **Reglas**.

1. Elija **Crear una regla** para iniciar el asistente de nueva regla.

1. Escriba un nombre y la descripción de la regla.

1. Para la **declaración de consulta de la regla**, actualice el atributo `FROM` para que haga referencia a un tema en el que al menos un dispositivo publique telemetría que incluya la ubicación. Si está probando la solución, no es necesario modificarla.

   ```
   SELECT * FROM 'iot/topic'
   ```

1. En **Definir una o varias acciones**, elija **Agregar acción**.

1. Seleccione **Enviar un mensaje a una función de Lambda.**

1. Elija **Configurar acción**.

1. Busque y seleccione su función de Lambda de la lista.

1. Seleccione **Agregar acción**.

1. Elija **Crear regla**.

## Pon a prueba tu AWS IoT Core regla en la consola
<a name="mqtt-test-iot-rule-with-lambda"></a>

Si actualmente ningún dispositivo publica telemetría que incluya la ubicación, puede probar la regla y esta solución mediante la AWS IoT Core consola. La consola tiene un cliente de prueba en el que puede publicar un mensaje de muestra para comprobar los resultados de la solución.

1. Inicie sesión en la AWS IoT Core consola en. [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home)

1. En el menú de navegación de la izquierda, expanda **Pruebas** y elija **Cliente de pruebas de MQTT**.

1. En **Publicar en un tema**, establece el **nombre del tema** en *iot/topic* (o el nombre del tema que hayas configurado en la AWS IoT Core regla, si es diferente) y proporciona lo siguiente para la **carga del mensaje**. Sustituya la marca de tiempo por una marca *1604940328* de tiempo válida de los últimos 30 días (se omiten las marcas de tiempo que tengan más de 30 días).

   ```
   {
     "payload": {
       "deviceid": "thing123",
       "timestamp": 1604940328,
       "location": { "lat": 49.2819, "long": -123.1187 },
       "accuracy": { "Horizontal": 20.5 },
       "positionProperties": { "field1": "value1", "field2": "value2" }
     }
   }
   ```

1. Seleccione **Publicar** en un tema para enviar el mensaje de prueba.

1. Para validar que Amazon Location Service recibió el mensaje, use el siguiente comando AWS CLI . Si los modificó durante la configuración, sustituya el nombre del rastreador y el identificador del dispositivo por los que utilizó.

   ```
   aws location batch-get-device-position --tracker-name MyTracker --device-ids thing123
   ```