教學課程: AWS Lambda 搭配 使用 MQTT - Amazon Location Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程: AWS Lambda 搭配 使用 MQTT

雖然傳送裝置位置資料至 Amazon Location 進行追蹤時 AWS Lambda 不再需要使用 ,但在某些情況下,您可能仍想使用 Lambda。例如,如果您想要在將裝置位置資料傳送至 Amazon Location 之前自行處理。下列主題說明如何使用 Lambda 在傳送訊息至追蹤器之前處理訊息。如需此模式的詳細資訊,請參閱參考架構

必要條件

在開始追蹤之前,您必須先建立追蹤器資源 。若要建立追蹤器資源,您可以使用 Amazon Location 主控台、 AWS CLI或 Amazon Location APIs。

下列範例使用 Amazon Location Service 主控台來建立追蹤器資源:

  1. 在 開啟 Amazon Location Service 主控台https://console.aws.amazon.com/location/

  2. 在左側導覽窗格中,選擇追蹤器

  3. 選擇建立追蹤器

  4. 填寫下列方塊:

    • 名稱 – 輸入一個最多 100 個字元的唯一名稱。有效項目包括英數字元、連字號和底線。例如 MyTracker.

    • 描述 – 輸入選用描述。例如 Tracker for storing AWS IoT Core device positions.

    • 位置篩選 – 選取您要用於位置更新的篩選。例如,準確性型篩選

  5. 選擇建立追蹤器

建立 Lambda 函數

若要在 AWS IoT Core 與 Amazon Location Service 之間建立連線,您需要 AWS Lambda 函數來處理 轉送的訊息 AWS IoT Core。此函數會擷取任何位置資料、將其格式化為 Amazon Location Service,並透過 Amazon Location Tracker 提交API。您可以透過 AWS Lambda 主控台建立此函數,也可以使用 AWS Command Line Interface (AWS CLI) 或 AWS Lambda APIs。

若要建立使用主控台將位置更新發佈至 Amazon Location 的 Lambda 函數:

  1. 在 開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/

  2. 從左側導覽中,選擇函數

  3. 選擇建立函數 ,並確定已選取從頭開始的作者

  4. 填寫下列方塊:

    • 函數名稱 – 輸入函數的唯一名稱。有效項目包括英數字元、連字號和底線,不含空格。例如 MyLambda.

    • 執行期 – 選擇 Python 3.8.

  5. 選擇建立函數

  6. 選擇程式碼索引標籤以開啟編輯器。

  7. 使用lambda_function.py下列項目覆寫 中的預留位置代碼,將指派給 的值取代為您建立為先決條件 的追蹤器TRACKER_NAME名稱。

    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. 選擇部署以儲存更新的函數。

  9. 選擇 Configuration (組態) 索引標籤。

  10. 許可區段中,選擇超連結角色名稱,將 Amazon Location Service 許可授予 Lambda 函數。

  11. 從角色的摘要頁面,選擇新增許可 ,然後從下拉式清單中選擇建立內嵌政策

  12. 選擇 JSON索引標籤,並使用下列文件覆寫政策。這可讓您的 Lambda 函數更新由所有區域的所有追蹤器資源管理的裝置位置。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "WriteDevicePosition", "Effect": "Allow", "Action": "geo:BatchUpdateDevicePosition", "Resource": "arn:aws:geo:*:*:tracker/*" } ] }
  13. 選擇檢閱政策

  14. 輸入政策名稱。例如 AmazonLocationTrackerWriteOnly.

  15. 選擇 建立政策

您可以視需要修改此函數程式碼,以適應您自己的裝置訊息結構描述。

建立 AWS IoT Core 規則

接下來,建立 AWS IoT Core 規則,將裝置的位置遙測轉送至 AWS Lambda 函數以進行轉換,並將發佈至 Amazon Location Service。提供的範例規則假設裝置承載的任何必要轉換都由 Lambda 函數處理。您可以透過主控台、 AWS Command Line Interface (AWS CLI) 或 建立此規則 AWS IoT Core AWS IoT Core APIs。

注意

雖然 AWS IoT 主控台會處理允許 AWS IoT Core 叫用 Lambda 函數所需的許可,但如果您要從 AWS CLI 或 建立規則SDK,則必須設定政策以將許可授予 AWS IoT

AWS IoT Core 使用主控台建立

  1. 在 登入 AWS IoT Core 主控台https://console.aws.amazon.com/iot/

  2. 在左側導覽中,展開動作 ,然後選擇規則

  3. 選擇建立規則以啟動新的規則精靈。

  4. 輸入規則的名稱和說明。

  5. 對於規則查詢陳述式 ,更新FROM屬性以參考至少有一個裝置正在發佈包含位置的遙測的主題。如果您正在測試解決方案,則不需要修改。

    SELECT * FROM 'iot/topic'
  6. 設定一或多個動作 下,選擇新增動作

  7. 選取傳送訊息至 lambda 函數

  8. 選擇 Configure action (設定動作)

  9. 從清單中尋找並選取您的 Lambda 函數。

  10. 選擇新增動作

  11. 選擇建立規則

在主控台中測試您的 AWS IoT Core 規則

如果目前沒有裝置發佈包含位置的遙測,您可以使用 AWS IoT Core 主控台測試您的規則和此解決方案。主控台具有測試用戶端,您可以在其中發佈範例訊息,以驗證解決方案的結果。

  1. 在 登入 AWS IoT Core 主控台https://console.aws.amazon.com/iot/

  2. 在左側導覽中,展開測試 ,然後選擇MQTT測試用戶端

  3. 發佈至主題 下,將主題名稱設定為 iot/topic (或您在 AWS IoT Core 規則中設定的主題名稱,如果不同),並為訊息承載 提供下列項目。取代時間戳記 1604940328 在過去 30 天內具有有效的時間戳記 (任何超過 30 天的時間戳記都會遭到忽略)。

    { "payload": { "deviceid": "thing123", "timestamp": 1604940328, "location": { "lat": 49.2819, "long": -123.1187 }, "accuracy": { "Horizontal": 20.5 }, "positionProperties": { "field1": "value1", "field2": "value2" } } }
  4. 選擇發佈至主題以傳送測試訊息。

  5. 若要驗證 Amazon Location Service 已收到訊息,請使用下列 AWS CLI 命令。如果您在設定期間修改了它們,請將追蹤器名稱和裝置 ID 取代為您使用的名稱和裝置 ID。

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