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

简单的分步示例

在本示例中,我们称 AWS IoT Events 使用的API AWS CLI 创建可模拟发动机两种状态的检测器的命令:正常状态和超压条件。

当发动机中的所测量压力超过某一阈值时,模型过渡到过压状态并发送 Amazon Simple Notification Service (人Amazon SNS)消息,提醒技术人员注意条件。当连续三次压力读数的压力低于阈值时,模型将返回到正常状态并发送另一个 Amazon SNS 消息,以确认条件已清除。我们要求连续三次读数低于压力阈值,以消除在非线性恢复阶段或一次性异常恢复读数时过压/正常消息的可能杂乱。

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

创建 输入.

要监控您的设备和流程,它们必须能够获得遥测数据 AWS IoT Events. 这是通过发送消息 输入 至 AWS IoT Events. 有几种方式可以实现:

  • 使用 BatchPut消息 操作。这种方法很简单,但需要您的设备或流程能够访问 AWS IoT Events 通过SDK或的API AWS CLI.

  • 英寸 AWS IoT Core,写下 AWS IoT Events 行动 规则 AWS IoT Core 将消息数据转发至 AWS IoT Events. 这将通过名称识别输入。如果您的设备或进程可以或已经通过以下方式发送消息,请使用此方法 AWS IoT Core. 此方法通常需要来自装置的较少计算功率。

  • 英寸 AWS IoT Analytics,使用 创建数据集 操作创建数据集 contentDeliveryRules 指明 AWS IoT Events 输入,数据集内容将自动发送。如果您想根据中汇总或分析的数据控制您的设备或流程,请使用此方法 AWS IoT Analytics.

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

创建检测器模型

创建 检测器型号 (您的设备或工艺型号) 状态. 对于每个状态,定义条件(布尔)逻辑,以评估传入输入以检测重要事件。当检测到事件时,它可以使用其他 AWS 服务。您可以定义其他事件,这些事件将在进入或退出某个状态以及满足某个条件(可选)时触发动作。

监控多个设备或流程

如果您正在监控多个设备或进程,并且希望单独跟踪每个设备或进程,请在每个输入中指定标识特定设备或进程的域。查看 key 字段 CreateDetectorModel。当标识新设备时(在输入字段中看到新值,所述输入字段由 key),则创建检测器实例。新的检测器实例继续响应来自该特定设备的输入,直到其检测器模型被更新或删除。您拥有的检测器(实例)数量和输入值相同 key 字段。

监控单个设备或流程

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

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

我们描述了将设备或进程发送消息作为 AWS IoT Events 检测器 输入. 创建输入并构建检测器模型后,即可开始发送数据。

注意

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

创建输入以捕获设备数据

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

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

您可以创建输入以捕获 pressuremotorid (识别发送消息的特定设备)使用以下内容 AWS 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创建输入。

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

英寸 创建输入以捕获设备数据,您创建了 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 Reference.

此示例还假设您已创建了一个 AWS Identity and Access Management (人IAM)角色,具有相应的权限。此角色的ARN在检测器模型定义中显示为 "roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole"。按照中的步骤操作 设置 AWS IoT Events 的权限 创建此角色,并将角色的ARN复制到检测器模型定义的相应位置。

您可以使用以下方法创建检测器模型 AWS 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 对电机中的超压事件作出响应(参见 创建表示设备状态的检测器模型)。

要完成此示例,请从设备发送消息(在本例中是一台计算机, AWS CLI 已安装)作为检测器的输入。

注意

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

使用以下 AWS 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 在发送的每个消息中。如果不更改, AWS IoT Events 系统将删除消息。 AWS IoT Events 如果消息相同,则忽略它 messageID 作为最近五分钟内发送的另一条消息。

此时,创建检测器(实例)以监测电机的事件 "Fulton-A32"。此检测器进入 "Normal" 状态。但是,由于我们发送了一个高于阈值的压力值,它立即过渡到 "Dangerous" 状态。这样,检测器就会向 Amazon SNS 其ARN为 arn:aws:sns:us-east-1:123456789012:underPressureAction.

运行以下操作 AWS 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 操作以获得关于检测器的状态的类似信息。