Usando AWS Lambda com MQTT - Amazon Location Service

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

Usando AWS Lambda com MQTT

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.

Pré-requisito

Antes de começar a rastrear, você deve criar um recurso de rastreador. Para criar um recurso de rastreamento, você pode usar o console de localização da Amazon AWS CLI, o ou o Amazon LocationAPIs.

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

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

  3. Selecione Criar rastreador.

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

  5. Selecione Criar rastreador.

Criar uma função do Lambda

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 do Amazon Location API Tracker. 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/.

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

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

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

  5. Selecione Criar função.

  6. Selecione a guia Código para abrir o editor.

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

    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) }
  8. Selecione Implantar para salvar a função atualizada.

  9. Escolha a guia Configuração.

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

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

  12. Escolha a JSONguia e substitua a política pelo documento a seguir. 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/*" } ] }
  13. Escolha Revisar política.

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

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

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

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

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

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

  5. 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'
  6. Em Definir uma ou mais ações, selecione Adicionar ação.

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

  8. Escolha Configurar ação.

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

  10. Selecione Adicionar ação.

  11. Escolha Criar regra.

Teste sua AWS IoT Core regra no console

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

  2. No painel de navegação à esquerda, expanda Teste e escolha cliente MQTT de teste.

  3. Em Publicar em um tópico, defina o nome do tópico como iot/topic (ou o nome do tópico que você configurou em sua AWS IoT Core regra, se diferente) e forneça o seguinte para o payload da Mensagem. Substitua o carimbo de data/hora 1604940328 com um carimbo de data/hora válido nos ú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" } } }
  4. Escolha Publicar no tópico para enviar a mensagem de teste.

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