使用規則擷取資料 AWS IoT Core - AWS IoT SiteWise

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

使用規則擷取資料 AWS IoT Core

您可以使用中的規則,將資料 AWS IoT SiteWise 從 AWS IoT 物件和其他 AWS 服務傳送至 AWS IoT Core。規則會轉換 MQTT 訊息,並執行動作以與 AWS 服務互動。 AWS IoT SiteWise 規則動作會將訊息資料從 AWS IoT SiteWise API 轉寄至BatchPutAssetPropertyValue作業。如需詳細資訊,請參閱AWS IoT 開發人員指南中的規則AWS IoT SiteWise 動作

您可以遵循教學課程,逐步完成設定規則所需的步驟,以透過裝置陰影從 AWS IoT 物件擷取資料。如需詳細資訊,請參閱 AWS IoT SiteWise 從 AWS IoT 事物中擷取資料

您也可以將資料從其他服務傳送 AWS IoT SiteWise 到其他 AWS 服務。如需詳細資訊,請參閱 與其他 AWS 服務互動

授予所需 AWS IoT 的存取權

您可以使用 IAM 角色來控制每個規則可存取的 AWS 資源。在建立規則之前,您必須建立具有允許規則對所需 AWS 資源執行動作的政策的 IAM 角色。 AWS IoT 執行規則時會擔任此角色。

如果您在 AWS IoT 主控台中建立規則動作,則可以選擇根資產來建立可存取所選資產階層的角色。如需如何手動定義規則角色的詳細資訊,請參閱AWS IoT 開發人員指南中的授與 AWS IoT 必要存取權和傳遞角色權限

對於 AWS IoT SiteWise 規則動作,您必須定義一個角色,以允許iotsitewise:BatchPutAssetPropertyValue存取規則將資料傳送至的資產屬性。若要改善安全Condition性,您可以在屬性中指定 AWS IoT SiteWise 資產階層路徑。

下列範例信任政策可允許存取特定資產及其子系。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*", "Condition": { "StringLike": { "iotsitewise:assetHierarchyPath": [ "/root node asset ID", "/root node asset ID/*" ] } } } ] }

您可以從政策中移除 Condition,以允許存取您的所有資產。下列範例信任原則可讓您存取所有資產。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*" } ] }

設定規 AWS IoT SiteWise 則動作

AWS IoT SiteWise 規則動作會將資料從啟動規則的 MQTT 訊息傳送至中的資產屬性。 AWS IoT SiteWise您可以同時將多個資料項目上傳到不同的資產屬性,這樣就能在一個訊息中傳送裝置的所有感測器更新。您也可以針對每個資料項目一次上傳多個資料點。

注意

當您 AWS IoT SiteWise 使用規則動作將資料傳送至時,您的資料必須符合BatchPutAssetPropertyValue作業的所有需求。例如,您的數據不能早於當前 Unix 紀元時間 7 天的時間戳。如需詳細資訊,請參閱使用 AWS IoT SiteWise API 導入資料

針對規則動作中的每個資料項目,您需要識別資產屬性並指定時間戳記、品質,以及該資產屬性的每個資料點的值。規則動作預期會接受所有參數的字串。

若要識別項目中的資產屬性,請指定下列其中一個項目:

  • 您要傳送資料到其中的資產屬性的 Asset ID (資產 ID) (assetId) 和 Property ID (屬性 ID) (propertyId)。您可以使用尋找資產 ID 和屬性 ID AWS IoT SiteWise 主控台。如果您知道資產 ID,則可以使用呼叫 AWS CLI DescribeAsset來尋找屬性 ID。

  • Property alias (屬性別名) (propertyAlias),這是資料串流別名 (例如 /company/windfarm/3/turbine/7/temperature)。若要使用這個選項,您必須先設定您的資產屬性別名。若要了解如何設定屬性別名,請參閱將工業資料串流對應到資產屬性

對於每個條目中的時間戳記,您可以使用設備報告的時間戳記或提供的時間戳記 AWS IoT Core。時間戳記有兩個參數:

  • 秒為單位的時間timeInSeconds)— Unix 紀元時間,以秒為單位,傳感器或設備報告數據。

  • 偏移量 (以 nanos 為單位offsetInNanos) — (選擇性) 相對於時間的納秒偏移量 (以秒為單位)。

重要

如果您的時間戳記是字串、有小數部分或不是以秒為單位,則 AWS IoT SiteWise 會拒絕要求。您必須將時間戳轉換為秒和納秒偏移量。使用 AWS IoT 規則引擎的功能轉換時間戳記。如需詳細資訊,請參閱下列內容:

您可以針對動作中的數個參數使用替代範本,以執行計算、叫用函數,以及從訊息承載中提取值。如需詳細資訊,請參閱AWS IoT 開發人員指南中的替代範本

注意

因為替代範本中的運算式與 SELECT 陳述式是分開計算的,所以您不能使用替代範本來參考使用 AS 子句所建立的別名。除了支援的函數與運算子以外,您可以僅參照原始承載中出現的資訊。

獲取未報告準確時間的設備的時間戳

如果您的傳感器或設備沒有報告準確的時間數據,則可以使用 timestamp()從 AWS IoT 規則引擎獲取當前的 Unix 紀元時間。此函數以毫秒為單位輸出時間,因此您必須將值轉換為以秒為單位的時間,並以納秒為單位的偏移量。為此,請使用以下轉換:

  • 針對 Time in seconds (以秒為單位的時間) (timeInSeconds),使用 ${floor(timestamp() / 1E3)} 將時間從毫秒轉換為秒。

  • 針對 Offset in nanos (以奈米為單位的位移) (offsetInNanos),使用 ${(timestamp() % 1E3) * 1E6} 計算時間戳記的奈米秒位移。

轉換字符串格式的時間戳

如果您的傳感器或設備以字符串格式報告時間數據(例如,2020-03-03T14:57:14.699Z),則可以使用 time_to_epoch(字符串,字符串)。該函數輸入時間戳和格式模式作為參數,並以毫秒為單位輸出時間。然後,您必須將時間轉換為以秒為單位的時間,並以納秒為單位的偏移量。為此,請使用以下轉換:

  • 對於以秒為單位的時間 (timeInSeconds),用${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)}於將時間戳記字串轉換為毫秒,然後轉換為秒。

  • 對於 nanos (offsetInNanos) 中的偏移量,用於計算${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6}時間戳記字符串的納秒偏移量。

注意

time_to_epoch函數支援高達毫秒精確度的時間戳記字串。要轉換具有微秒或納秒精度的字符串,您可以配置規則調用的 AWS Lambda 函數以將時間戳轉換為數值。如需詳細資訊,請參閱 轉換納秒精度時間戳字符串

轉換納秒精度時間戳字符串

如果您的裝置以納秒精確度的字串格式傳送時間戳記資訊 (例如,2020-03-03T14:57:14.699728491Z),請使用下列程序來設定規則動作。您可以創建一個 AWS Lambda 函數,將時間戳從字符串轉換為以秒為單位的時間timeInSeconds)和偏移量 nanosoffsetInNanos)。然後,您可以在規則動作參數中使用 aws_lambda(函數參數,inputJson)來調用該 Lambda 函數並在規則中使用輸出。

注意

本節包含進階說明,會假設您已熟悉如何建立以下資源:

若要建立剖析時間戳記字串的 AWS IoT SiteWise 規則動作
  1. 建立具有下列屬性的 Lambda 函數:

    • 函數名稱 — 使用描述性函數名稱 (例如ConvertNanosecondTimestampFromString)。

    • 執行階段 — 使用 Python 3 執行階段,例如 Python 3.11 (python3.11)。

    • 權限 — 建立具有基本 Lambda 權限的角色 (AWSLambdaBasicExecutionRole)。

    • — 新增要使用的 Lambda 函數的 AWSSDKPAND-311 圖層。numpy

    • 函數代碼 — 使用下列函數程式碼,它會使用名為的字串引數,timestamptimeInSeconds並輸出該時間戳記的offsetInNanos值。

      import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }

      這個 Lambda 函數輸入使用日期時間 64 從 ISO 8601 格式的時間戳字符串。 NumPy

      注意

      如果您的時間戳記字串不是 ISO 8601 格式,您可以實作定義時間戳記格式pandas的解決方案。如需詳細資訊,請參閱熊貓

  2. 當您設定規則的 AWS IoT SiteWise 動作時,請使用下列替代範本,以秒為單位 (timeInSeconds) 和位移 (以 nanos 為單位offsetInNanos)。這些替代範本會假設您的訊息承載包含 timestamp 中的時間戳記字串。aws_lambda 函數會針對其秒數參數取用 JSON 結構,因此您可視需要修改以下替代範本。

    • 針對 Time in seconds (以秒為單位的時間) (timeInSeconds),使用以下替代範本。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).timeInSeconds}
    • 針對 Offset in nanos (以奈米為單位的位移) (offsetInNanos),使用以下替代範本。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).offsetInNanos}

    對於每個參數,請將區域帳戶 ID 替換為您的地區和 AWS 帳戶 ID。如果您為 Lambda 函數使用了不同的名稱,請同時進行變更。

  3. 授予 AWS IoT 權限以使用lambda:InvokeFunction權限調用您的函數。如需詳細資訊,請參閱 aws_lambda(functionArn, inputJson)

  4. 測試您的規則 (例如,使用 AWS IoT MQTT 測試用戶端),並確認是否 AWS IoT SiteWise 接收您傳送的資料。

    如果規則無法正常運作,請參閱 疑難排解 AWS IoT SiteWise 規則動作

注意

此解決方案會針對每個時間戳記字串叫用 Lambda 函數兩次。如果您的規則處理每個承載中具有相同時間戳記的多個資料點,則可以建立另一個規則來減少 Lambda 函數叫用的次數。

若要這麼做,請使用重新發佈動作建立規則,該動作會叫用 Lambda,並發佈原始承載,並將時間戳記字串轉換為timeInSeconds和。offsetInNanos然後,建立具有規則動作的 AWS IoT SiteWise 規則,以使用轉換的承載。使用這種方法,您可以減少規則呼叫 Lambda 的次數,但會增加 AWS IoT 規則動作的執行次數。如果您要將此解決方案套用到您的使用案例,請考慮定價。

規則組態範例

本節包含範例規則組態,可用來建立具有 AWS IoT SiteWise 動作的規則。

範例 使用屬性別名做為訊息主題的範例規則動作

下列範例會建立具有使用主題 (透過 topic ()) 做為屬性別名的 AWS IoT SiteWise 動作的規則,以識別資產性質。您可以使用此範例定義將雙重類型資料擷取至所有風力發電場中的所有風力發電機的規則。此範例要求您在所有渦輪資產的性質上定義性質別名。您需要定義第二個類似的規則來擷取整數類型資料。

aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json 中的範例裝載包含以下內容。

{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

透過此規則動作,您可以將下列訊息傳送到風力渦輪機屬性別名 (例如 /company/windfarm/3/turbine/7/temperature),做為擷取資料的主題。

{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
範例 使用 timestamp() 定義時間的範例規則動作

下列範例會建立具有動作的規則,該 AWS IoT SiteWise 動作會依 ID 識別資產屬性,並使用 timestamp () 判斷目前時間。

aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json 中的範例裝載包含以下內容。

{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

透過此規則動作,您可以將下列訊息傳送到 my/asset/property/topic 以擷取資料。

{ "type": "double", "value": "38.3" }

使用基本導入降低成本

AWS IoT Core 提供稱為 Basic Ingest 的功能,您可以使用該功能來傳送資料, AWS IoT Core 而不會產生AWS IoT 訊息費用。基本擷取可從擷取路徑移除發佈/訂閱訊息代理程式,以最佳化大量資料擷取工作負載的資料流程。如果您知道應將訊息路由到哪些規則,您可以使用基本擷取。

若要使用基本擷取,請使用 $aws/rules/rule-name 特殊主題,將訊息直接傳送到特定規則。例如,若要將訊息傳送到名為 SiteWiseWindFarmRule 的規則,請將訊息傳送到 $aws/rules/SiteWiseWindFarmRule 主題。

如果規則動作使用包含 topic(Decimal) 的替代範本,您可以在基本擷取特殊主題的結尾處 (例如 $aws/rules/rule-name/original-topic) 傳遞原始主題。例如,若要使用基本擷取搭配上一節中的風力發電廠屬性別名範例,您可以傳送訊息到下列主題。

$aws/rules/SiteWiseWindFarmRule//company/windfarm/3/turbine/7/temperature
注意

上述範例包含第二個斜線 (//),因為 AWS IoT 會從規則動作可見的主題中移除 Basic Ingest 前置詞 ($aws/rules/rule-name/)。在此範例中,規則會收到 /company/windfarm/3/turbine/7/temperature 主題。

如需詳細資訊,請參閱AWS IoT 開發人員指南中的基本內嵌降低傳訊成本。

疑難排解 AWS IoT SiteWise 規則動作

若要疑難排解中的 AWS IoT SiteWise 規則動作 AWS IoT Core,您可以設定 CloudWatch 記錄檔,或為規則設定重新發佈錯誤動作。如需更多詳細資訊,請參閱 疑難排解 AWS IoT SiteWise 規則動作