

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Use AWS Lambda com o MQTT
<a name="tracking-using-mqtt-with-lambda"></a>

Embora o uso não AWS Lambda seja mais necessário ao enviar dados de localização do dispositivo para o Amazon Location para rastreamento, talvez você ainda queira usar o Lambda em alguns casos. Por exemplo, se você mesmo quiser processar os dados de localização do seu dispositivo, antes de enviá-los para o Amazon Location. Os tópicos a seguir descrevem como usar o Lambda para processar as mensagens antes de enviá-las ao rastreador. Para obter mais informações sobre esse padrão, consulte a [arquitetura de referência](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/amazon-location-service-ra.pdf).

**Topics**
+ [Pré-requisito](#mqtt-prerequisite-with-lambda)
+ [Criar uma função do Lambda](#mqtt-with-lambda-create-lambda)
+ [Crie uma AWS IoT Core regra](#mqtt-create-iot-rule-with-lambda)
+ [Teste sua AWS IoT Core regra no console](#mqtt-test-iot-rule-with-lambda)

## Pré-requisito
<a name="mqtt-prerequisite-with-lambda"></a>

Antes de começar a rastrear, você deve [criar um recurso de rastreador](start-tracking.md). Para criar um recurso de rastreamento, você pode usar o console de localização da Amazon AWS CLI, o ou o Amazon Location APIs. 

O exemplo a seguir usa o console do Amazon Location Service para criar o recurso rastreador:

1. Abra o console do Amazon Location Service em [https://console.aws.amazon.com/location/](https://console.aws.amazon.com/location/home).

1. No painel de navegação à esquerda, selecione **Rastreadores**. 

1.  Selecione **Criar rastreador**. 

1. Preencha as seguintes caixas:
   + **Nome**: insira um nome exclusivo com no máximo 100 caracteres. As entradas válidas incluem caracteres alfanuméricos, hífens e sublinhados. Por exemplo, .*MyTracker*
   + **Descrição**: insira uma descrição opcional. Por exemplo, .*Tracker for storing AWS IoT Core device positions*
   + **Filtragem de posição**: selecione a filtragem que você deseja usar para atualizações de posição. Por exemplo, **Filtragem baseada em precisão**.

1. Selecione **Criar rastreador**. 

## Criar uma função do Lambda
<a name="mqtt-with-lambda-create-lambda"></a>

Para criar uma conexão entre AWS IoT Core o Amazon Location Service, você precisa de uma AWS Lambda função para processar mensagens encaminhadas por AWS IoT Core. Essa função extrairá todos os dados posicionais, os formatará para o Amazon Location Service e os enviará por meio da API do rastreador do Amazon Location. Você pode criar essa função por meio do AWS Lambda console ou usar o AWS Command Line Interface (AWS CLI) ou AWS Lambda APIs o. 

Para criar uma função do Lambda que publique atualizações de posição no Amazon Location usando o console:

1. Abra o AWS Lambda console em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/home).

1. No painel de navegação à esquerda, selecione **Funções**. 

1.  Selecione **Criar função** e confirme se **Autor do zero** está selecionado. 

1. Preencha as seguintes caixas:
   + **Nome da função**: insira um nome para a sua função. Entradas válidas incluem caracteres alfanuméricos, hifens, pontos e sublinhados, sem espaços. Por exemplo, .*MyLambda*
   + **Tempo de execução** — Escolha*Python 3.8*.

1. Selecione **Criar função**. 

1. Selecione a guia **Código** para abrir o editor.

1. Substitua o código do espaço reservado em `lambda_function.py` pelo seguinte, substituindo o valor atribuído a `TRACKER_NAME` pelo nome do rastreador que você criou como [pré-requisito](#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. Selecione **Implantar** para salvar a função atualizada.

1. Escolha a guia **Configuração**.

1. Na seção **Permissões**, escolha o nome da Função com hiperlink para conceder permissões do Amazon Location Service à sua função do Lambda.

1. Na página de **Resumo** do seu perfil, escolha **Adicionar permissões** e, na lista suspensa, selecione **Criar política embutida**.

1. Escolha a guia **JSON** e sobrescreva a política com o seguinte documento. Isso permite que sua função do Lambda atualize as posições do dispositivo gerenciadas por todos os recursos do rastreador em todas as Regiões.

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

1. Escolha **Revisar política**.

1. Insira um nome de política. Por exemplo, .*AmazonLocationTrackerWriteOnly*

1. Escolha **Criar política**.

Você pode modificar esse código de função, conforme o necessário, para se adaptar ao esquema de mensagens do seu próprio dispositivo.

## Crie uma AWS IoT Core regra
<a name="mqtt-create-iot-rule-with-lambda"></a>

Em seguida, crie uma AWS IoT Core regra para encaminhar a telemetria posicional de seus dispositivos para a AWS Lambda função para transformação e publicação no Amazon Location Service. O exemplo de regra fornecido pressupõe que qualquer transformação necessária das cargas úteis do dispositivo seja tratada pela sua função do Lambda. Você pode criar essa regra por meio do AWS IoT Core console, do AWS Command Line Interface (AWS CLI) ou do AWS IoT Core APIs.

**nota**  
Embora o AWS IoT console gerencie a permissão necessária AWS IoT Core para permitir a invocação da função Lambda, se você estiver criando sua regra AWS CLI a partir do SDK ou, [deverá configurar uma política para a](https://docs.aws.amazon.com/iot/latest/developerguide/lambda-rule-action.html#lambda-rule-action-requirements) qual conceder permissão. AWS IoT

**Para criar um AWS IoT Core usando o console**

1. Faça login no AWS IoT Core console em [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home).

1. No painel de navegação à esquerda, expanda **Agir** e **Regras**.

1. Escolha **Criar uma regra** para iniciar o novo assistente de regras.

1. Insira um nome e uma descrição para a regra.

1. Para a **Declaração de regra de consulta**, atualize o atributo `FROM` para se referir a um tópico em que pelo menos um dispositivo esteja publicando telemetria que inclua a localização. Se você estiver testando a solução, nenhuma modificação será necessária.

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

1. Em **Definir uma ou mais ações**, selecione **Adicionar ação**.

1. Selecione **Enviar uma mensagem para uma função do Lambda**.

1. Escolha **Configurar ação**.

1. Encontre e selecione sua função do Lambda na lista.

1. Selecione **Adicionar ação**.

1. Escolha **Criar regra**.

## Teste sua AWS IoT Core regra no console
<a name="mqtt-test-iot-rule-with-lambda"></a>

Se nenhum dispositivo estiver publicando telemetria que inclua localização no momento, você poderá testar sua regra e essa solução usando o AWS IoT Core console. O console tem um cliente de teste no qual você pode publicar uma mensagem de amostra para verificar os resultados da solução.

1. Faça login no AWS IoT Core console em [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home).

1. No painel de navegação à esquerda, expanda **Teste** e escolha **Cliente de teste MQTT**.

1. Em **Publicar em um tópico**, defina o **nome do tópico** como *iot/topic* (ou o nome do tópico que você configurou na sua AWS IoT Core regra, se for diferente) e forneça o seguinte para o **payload da mensagem**. Substitua o carimbo de *1604940328* data/hora por um válido dos últimos 30 dias (qualquer carimbo de data/hora anterior a 30 dias é ignorado).

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

1. Escolha **Publicar** no tópico para enviar a mensagem de teste.

1. Para validar se a mensagem foi recebida pelo Amazon Location Service, use o comando AWS CLI a seguir. Se você o modificou durante a configuração, substitua o nome do rastreador e o ID do dispositivo pelos que você usou.

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