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

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

简单的分步示例

在此示例中,我们将Amazon IoT Events利用 APIAmazon CLI命令创建一个探测器,用于建模发动机的两种状态:正常状态和过压条件。

当发动机中测量的压力超过特定阈值时,模型将转换为超压状态,并发送 Amazon Simple Notification Service (Amazon SNS) 消息,提醒技术人员注意此情况。当压力在连续三次压力读数下降到阈值以下时,模型将返回正常状态,并发送另一个 Amazon SNS 消息,以确认状况已清除。我们需要三次连续读数低于压力阈值,以消除在非线性恢复阶段或一次性异常恢复读数时可能出现的过压/正常信息的卡顿。

以下是创建探测器的步骤概述。

Createinputs

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

  • 使用BatchPutMessageoperation. 此方法很简单,但要求您的设备或进程能够访问Amazon IoT EventsAPI 通过软件开发工具包或Amazon CLI。

  • In Amazon IoT Core 中,写一个Amazon IoT Events操作规则 Amazon IoT Core 规则引擎,该引擎将您的消息数据转发到Amazon IoT Events。这通过名称标识输入。如果您的设备或进程可以或已经通过 Amazon IoT Core 。此方法通常需要较少的设备的计算能力。

  • InAmazon IoT Analytics,请使用CreateDataset操作以创建数据集contentDeliveryRules指定Amazon IoT Events输入,其中自动发送数据集内容。如果您希望根据Amazon IoT Analytics。

必须先定义一个或多个输入,然后才能以这种方式发送数据。为此,请为每个输入指定一个名称,并指定输入监视的传入消息数据中的哪些字段。

创建检测器模型

创建探测器模型(您的设备或进程的模型)使用状态。对于每种状态,定义条件(布尔值)逻辑,该逻辑计算传入的输入以检测重要事件。检测到事件后,它可以使用其他Amazon服务。您可以定义其他事件,这些事件将在进入或退出某个状态以及满足某个条件(可选)时触发动作。

监控多个设备或进程

如果您正在监视多个设备或进程,并且希望分别跟踪每个设备或进程,请在每个输入中指定一个字段,以标识输入来源的特定设备或进程。请参阅key字段中的CreateDetectorModel。当一个新设备被识别时(在输入字段中看到一个新值,由key),则会创建一个检测器实例。新的检测器实例会继续响应来自该特定设备的输入,直到其检测器型号被更新或删除。您有尽可能多的唯一检测器(实例),因为输入中有唯一值key字段。

监控单个设备或进程

如果您正在监视单个进程(即使多个设备或子进程正在发送输入),则不会指定唯一的标识key字段。在这种情况下,当第一个输入到达时,会创建单个检测器(实例)。例如,您可能在房子的每个房间都有温度传感器,但只有一个暖通空调装置来加热或冷却整个房子。因此,您只能将其控制为一个单一的进程,即使每个房间的居民希望他们的投票(输入)占主导地位。

从您的设备或进程发送消息作为检测器型号的输入

我们描述了从设备或进程发送消息的几种方法,作为输入到Amazon IoT Events中的探测器inputs。创建输入并构建检测器模型后,您就可以开始发送数据。

注意

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

创建输入以捕获设备数据

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

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

您可以创建一个输入来捕获pressure数据和motorid(标识发送消息的特定设备)使用以下Amazon CLI命令。

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 创建输入。

创建检测器模型来表示设备状态

In创建输入以捕获设备数据,您创建了input基于报告来自电机的压力数据的消息。为了继续这个示例,下面是一个探测器模型,用于响应电机中的过压事件。

您可以创建两个状态:”Normal“, 和”Dangerous“。每个检测器(实例)都输入”Normal” 状态创建时的状态。实例是在输入时创建的key "motorid“到达。

如果检测器实例接收到 70 或更大的压力读数,则会输入”Dangerous” 状态并发送 Amazon SNS 消息作为警告。如果三个连续输入的压力读数恢复正常(小于 70),检测器将返回到”Normal” 状态并发送另一条 Amazon SNS 消息作为全部清晰的消息。

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

有关更多信息,请参阅 。Amazon Simple Notification Service 开发者指南,更具体地说,CreateTopic中的操作Amazon Simple Notification Service API 参考

此示例还假定您已经创建了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

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

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

您必须将messageId在发送的每条消息中。如果您不更改它,Amazon IoT Events系统将消息重复数据消除。Amazon IoT Events忽略一条消息,如果它具有相同的messageID作为在过去五分钟内发送的另一条消息。

此时,将创建一个检测器(实例)来监控电机的事件"Fulton-A32"。此检测器进入"Normal"状态。但是,因为我们发送了一个高于阈值的压力值,所以它会立即转换为"Dangerous"状态。在这样做的同时,检测器会向 Amazon SNS 终端节点发送一条消息,其 ARN 为arn:aws:sns:us-east-1:123456789012:underPressureAction

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

aws iotevents-data batch-put-message --cli-input-json file://normalPressureMessage.json

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

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

您必须将messageId在文件中每次调用BatchPutMessage命令在五分钟的时间段内。再发送消息两次。消息被发送三次后,检测器(实例)的电机”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操作来获取有关检测器状态的类似信息。