简单的分步操作示例 - Amazon IoT Events
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

简单的分步操作示例

在此示例中,我们使用Amazon CLI命令来调用 Amazon IoT Events API 以创建检测程序,该检测程序对引擎的两种状态进行建模:正常状态和超压状态。

当引擎中测得的压力超过一定阈值时,模型会过渡至超压状态,并发送 Amazon Simple Notification Service(Amazon SNS)消息,提醒技术人员注意该情况。当压力降至连续三个压力读数的阈值以下时,模型将恢复至正常状态,并发送另一条 Amazon SNS 消息,以确认该状况已消除。我们需要获得低于压力阈值的三个连续读数,以消除在非线性恢复阶段或一次性异常恢复读数的情况下可能出现的过压/正常消息卡顿现象。

下文概述了检测程序创建步骤。

创建输入

要监视您的设备和流程,它们必须具有将遥测数据导入 Amazon IoT Events 的方法。执行此操作的方法是将消息作为输入发送到 Amazon IoT Events。有几种方式可以实现:

  • 使用 BatchPutMessage 操作。这种方法很简单,但要求您的设备或进程能够通过 SDK 或Amazon CLI访问 Amazon IoT EventsAPI。

  • 在Amazon IoT Core中,为将您的消息数据转发到Amazon IoT Events的Amazon IoT Core规则引擎编写一条Amazon IoT Events操作规则。按名称识别输入。如果您的设备或进程可以或已经通过Amazon IoT Core发送消息,请使用此方法。这种方法通常对设备的计算能力要求不高。

  • 在Amazon IoT Analytics,使用 CreateDataset 操作创建带contentDeliveryRules的数据集,指定Amazon IoT Events输入,数据集内容会在此处自动发送。如果您想根据在Amazon IoT Analytics中汇总或分析的数据控制您的设备或进程,请使用此方法。

在您的设备以这种方式发送数据之前,您必须定义一个或多个输入。为此,请为每个输入赋予一个名称,并指定输入要监视传入消息数据中的哪些字段。

创建检测程序模型

使用状态创建一个检测程序模型(您的设备或进程的模型)。对于每种状态,请定义条件(布尔值)逻辑,该逻辑评估传入的输入以检测重要事件。检测到事件后,它可以使用其他 Amazon 服务更改状态或发起自定义或预定义的操作。您可以定义其他事件,这些事件将在进入或退出某个状态以及满足某个条件(可选)时发起操作。

监视多个设备或进程

如果您正在监视多个设备或进程,并且想要单独追踪每个设备或进程,请在每个输入中指定一个字段,可用于识别输入来自的特定设备或进程。请参见CreateDetectorModel中的 key 字段。当识别出新设备时(在key识别的输入字段中看到一个新值),就会创建一个检测程序实例。新的检测程序实例会继续响应来自特定设备的输入,直至检测程序模型更新或被删除。您的唯一检测程序(实例)数量与输入key字段的唯一值相同。

监视单个设备或进程

如果您正在监视单个进程(即使多个设备或子进程正在发送输入),则无需指定唯一的标识 key 字段。在这种情况下,当第一次输入到达时,将创建单个检测程序(实例)。例如,一个房屋的每个房间都安装有温度传感器,但是只有一台暖通空调用于为整个房子供暖和制冷。因此,即使每个房间的占用者都希望他们的投票(输入)占上风,您也只能将其作为单个进程进行控制。

将来自设备或进程的消息作为输入发送至检测程序模型

我们向您介绍了几种方法,将来自设备或进程的消息作为输入发送至输入的Amazon IoT Events检测程序。创建输入并构建检测程序模型后,您就可以开始发送数据。

注意

创建检测程序模型或更新现有检测程序模型后,新的或更新的检测程序模型需要几分钟才能开始接收消息和创建检测程序(实例)。如果检测程序模型已更新,则在此期间您可能会继续看到基于先前版本的行为。

创建输入以采集设备数据

例如,假设您的设备按以下格式发送消息。

{ "motorid": "Fulton-A32", "sensorData": { "pressure": 23, "temperature": 47 } }

您可以使用以下Amazon CLI命令创建输入,以采集pressure数据和motorid(表示特定的消息发送设备)。

aws iotevents create-input --cli-input-json file://pressureInput.json

pressureInput.json 文件包含以下内容。

{ "inputName": "PressureInput", "inputDescription": "Pressure readings from a motor", "inputDefinition": { "attributes": [ { "jsonPath": "sensorData.pressure" }, { "jsonPath": "motorid" } ] } }

创建自己的输入时,切记先从您的设备或进程收集 JSON 文件形式的示例消息。您可将此消息用于创建来自控制台或 CLI 的输入。

创建检测程序模型以表示设备状态

创建输入以采集设备数据,您根据电机压力数据报告消息,创建了input。继续举例,有一个响应电机过压事件的检测程序模型。

您可以创建两种状态:“Normal”和“Dangerous”。创建后,每种检测程序(实例)都会进入“Normal”状态。当具有唯一key值的“motorid”输入到达时,可创建实例。

如果检测程序实例收到的压力读数为 70 或以上,它将进入“Dangerous”状态并发送 Amazon SNS 消息作为警告。如果连续三次输入的压力读数恢复正常(小于 70),检测程序将返回“Normal”状态,并发送另一条 Amazon SNS 消息作为警报解除信号。

此示例检测程序模型假设您创建了两个 Amazon SNS 主题,其 Amazon 资源名称(ARN)在定义中显示为"targetArn": "arn:aws:sns:us-east-1:123456789012:underPressureAction""targetArn": "arn:aws:sns:us-east-1:123456789012:pressureClearedAction"

有关更多信息,请参阅《Amazon Simple Notification Service 开发者指南》,具体而言,请参阅《Amazon Simple Notification Service API参考》中的 CreateTopic 操作文档。

此示例还假定您已创建具有相应权限的 Amazon Identity and Access Management (IAM) 角色。该角色的 ARN 在检测程序模型定义中显示为"roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole"。按为设置权限 Amazon IoT Events中的步骤创建此角色,将角色的 ARN 复制到检测程序模型定义的适当位置。

您可以使用以下 Amazon CLI 命令创建检测程序模型。

aws iotevents create-detector-model --cli-input-json file://motorDetectorModel.json

"motorDetectorModel.json" 文件包含以下内容。

{ "detectorModelName": "motorDetectorModel", "detectorModelDefinition": { "states": [ { "stateName": "Normal", "onEnter": { "events": [ { "eventName": "init", "condition": "true", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "0" } } ] } ] }, "onInput": { "transitionEvents": [ { "eventName": "Overpressurized", "condition": "$input.PressureInput.sensorData.pressure > 70", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "$variable.pressureThresholdBreached + 3" } } ], "nextState": "Dangerous" } ] } }, { "stateName": "Dangerous", "onEnter": { "events": [ { "eventName": "Pressure Threshold Breached", "condition": "$variable.pressureThresholdBreached > 1", "actions": [ { "sns": { "targetArn": "arn:aws:sns:us-east-1:123456789012:underPressureAction" } } ] } ] }, "onInput": { "events": [ { "eventName": "Overpressurized", "condition": "$input.PressureInput.sensorData.pressure > 70", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "3" } } ] }, { "eventName": "Pressure Okay", "condition": "$input.PressureInput.sensorData.pressure <= 70", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "$variable.pressureThresholdBreached - 1" } } ] } ], "transitionEvents": [ { "eventName": "BackToNormal", "condition": "$input.PressureInput.sensorData.pressure <= 70 && $variable.pressureThresholdBreached <= 1", "nextState": "Normal" } ] }, "onExit": { "events": [ { "eventName": "Normal Pressure Restored", "condition": "true", "actions": [ { "sns": { "targetArn": "arn:aws:sns:us-east-1:123456789012:pressureClearedAction" } } ] } ] } } ], "initialStateName": "Normal" }, "key" : "motorid", "roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole" }

将消息作为输入发送至检测程序模型

现在您已定义了一个输入,用于识别从设备发送的消息中的重要字段(参见创建输入以采集设备数据)。在上一节中,您创建了一个detector model,它可以响应电机的过压事件(参见创建检测程序模型以表示设备状态)。

要完成此示例,请将来自设备(此例中为已安装Amazon CLI的计算机)的消息作为输入发送至检测程序。

注意

创建检测程序模型或更新现有检测程序模型时,新的或更新的检测程序模型需要几分钟才能开始接收消息和创建检测程序(实例)。如果您更新检测程序模型,则在此期间,您可能会继续看到基于先前版本的行为。

使用以下 Amazon CLI 命令发送包含超出阈值数据的消息。

aws iotevents-data batch-put-message --cli-input-json file://highPressureMessage.json --cli-binary-format raw-in-base64-out

文件“highPressureMessage.json”包含以下内容。

{ "messages": [ { "messageId": "00001", "inputName": "PressureInput", "payload": "{\"motorid\": \"Fulton-A32\", \"sensorData\": {\"pressure\": 80, \"temperature\": 39} }" } ] }

您必须更改每条已发送消息中的 messageId。如果您未更改,Amazon IoT Events系统会对消息进行重复数据删除。如果一条消息与最近五分钟内发送的另一条消息有相同的messageID,则Amazon IoT Events会忽略该消息。

此时,将创建一个检测程序(实例)以监视电机事件"Fulton-A32"。该检测程序在创建时进入 "Normal" 状态。但是,由于我们发送的压力值高于阈值,因此它会立即转换为 "Dangerous" 状态。在此过程中,检测程序会向 ARN 为arn:aws:sns:us-east-1:123456789012:underPressureAction的 Amazon SNS 端点发送消息。

运行以下 Amazon CLI 命令以发送包含低于压力阈值数据的消息。

aws iotevents-data batch-put-message --cli-input-json file://normalPressureMessage.json --cli-binary-format raw-in-base64-out

normalPressureMessage.json 文件包含以下内容。

{ "messages": [ { "messageId": "00002", "inputName": "PressureInput", "payload": "{\"motorid\": \"Fulton-A32\", \"sensorData\": {\"pressure\": 60, \"temperature\": 29} }" } ] }

每次当您在五分钟内调用BatchPutMessage命令时,都必须更改文件中的messageId。再发送该信息两次。消息发送三次后,电机“Fulton-A32”的检测程序(实例)会向 Amazon SNS 端点"arn:aws:sns:us-east-1:123456789012:pressureClearedAction"发送一条消息并重新进入"Normal"状态。

注意

您可以使用BatchPutMessage同时发送多条消息。但是,不保证处理这些消息的顺序。为确保按顺序处理消息(输入),请每次发送一条消息,然后等待每次调用 API 时成功响应。

以下是本节所述的由检测程序模型示例创建的 SNS 消息有效载荷示例。

事件“违反压力阈值”

IoT> { "eventTime":1558129816420, "payload":{ "actionExecutionId":"5d7444df-a655-3587-a609-dbd7a0f55267", "detector":{ "detectorModelName":"motorDetectorModel", "keyValue":"Fulton-A32", "detectorModelVersion":"1" }, "eventTriggerDetails":{ "inputName":"PressureInput", "messageId":"00001", "triggerType":"Message" }, "state":{ "stateName":"Dangerous", "variables":{ "pressureThresholdBreached":3 }, "timers":{} } }, "eventName":"Pressure Threshold Breached" }

事件“恢复正常压力”

IoT> { "eventTime":1558129925568, "payload":{ "actionExecutionId":"7e25fd38-2533-303d-899f-c979792a12cb", "detector":{ "detectorModelName":"motorDetectorModel", "keyValue":"Fulton-A32", "detectorModelVersion":"1" }, "eventTriggerDetails":{ "inputName":"PressureInput", "messageId":"00004", "triggerType":"Message" }, "state":{ "stateName":"Dangerous", "variables":{ "pressureThresholdBreached":0 }, "timers":{} } }, "eventName":"Normal Pressure Restored" }

如果您定义了任何计时器,则其当前状态也会在 SNS 消息有效载荷中显示。

消息有效载荷包含消息发送时(也就是运行 SNS 操作时)的检测程序(实例)状态信息。您可以使用 https://docs.amazonaws.cn/iotevents/latest/apireference/API_iotevents-data_DescribeDetector.html 操作获取有关检测程序状态的类似信息。