本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在中创建探测器模型 AWS IoT Events
在该主题中,您使用状态来定义一个探测器模型(您的设备或进程的模型)。
对于每种状态,您定义条件(布尔值)逻辑,该逻辑评估传入的输入以检测重要事件。当检测到事件时,它会更改状态并可以启动其他操作。这些事件称为过渡事件。
在您的状态下,您还可以定义在探测器进入或退出该状态或收到输入时可以运行操作的事件(这些事件被称为OnEnter
、OnExit
和 OnInput
事件)。仅当事件的条件逻辑计算为 true
时,操作才会运行。
创建探测器模型
-
已为您创建了第一个探测器状态。要对其进行修改,请在主编辑空间中选择标有 State_1 标签的圆圈。
-
在状态窗格中,输入州名称 OnEnter,然后选择添加事件。
-
在添加 OnEnter 事件页面上,输入事件名称和事件条件。在此示例中,输入
true
以表示当进入状态时,事件始终处于启动状态。 -
在 事件操作 下面,选择 添加操作。
-
在事件操作下,执行以下操作:
-
选择设置变量
-
对于变量运算,选择赋值。
-
对于变量名称,输入要设置的变量的名称。
-
对于变量值,输入值
0
(零)。
-
-
选择保存。
可以在探测器模型中的任何事件中设置变量(赋值),例如您定义的变量。只有在探测器达到状态并运行定义或设置变量的操作后,才能引用变量的值(例如,在事件的条件逻辑中)。
-
在“状态” 窗格中,选择“状态”旁边的 X 以返回到探测器模型调色板。
-
要创建第二个探测器状态,请在探测器模型调色板中,选择状态并将其拖到主编辑空间中。这将创建一个名为
untitled_state_1
的状态。 -
在第一个状态(正常)下暂停。状态的周长上会出现一个箭头。
-
单击箭头并将其从第一个状态拖动到第二个状态。将出现从第一个状态到第二个状态的定向线(标记为“无标题”)。
-
选择“无标题” 行。在过渡事件窗格中,输入事件名称和事件触发逻辑。
-
在过渡事件窗格中,选择添加操作。
-
在添加过渡事件操作窗格上,选择添加操作。
-
在选择操作中,选择设置变量。
-
对于变量运算,选择赋值。
-
对于 变量名称,输入变量的名称。
-
对于 赋值,输入值,例如:
$variable.pressureThresholdBreached + 3
。 -
选择保存。
-
-
选择第二个状态 untitled_state_1。
-
在状态窗格中,输入状态名称,然后在On Enter中选择添加事件。
-
在添加 OnEnter 事件页面上,输入事件名称和事件条件。选择添加操作。
-
在选择操作中,选择 发送 SNS 消息。
-
对于 SNS 主题,请输入 Amazon SNS 主题的目标 ARN。
-
选择保存。
-
-
继续在示例中添加事件。
-
对于 OnInput,选择添加事件,然后输入并保存以下事件信息。
Event name: Overpressurized Event condition: $input.PressureInput.sensorData.pressure > 70 Event actions: Set variable: Variable operation: Assign value Variable name: pressureThresholdBreached Assign value: 3
-
对于 OnInput,选择添加事件,然后输入并保存以下事件信息。
Event name: Pressure Okay Event condition: $input.PressureInput.sensorData.pressure <= 70 Event actions: Set variable: Variable operation: Decrement Variable name: pressureThresholdBreached
-
对于 OnExit,选择添加事件,然后使用您创建的 Amazon SNS 主题的 ARN 输入并保存以下事件信息。
Event name: Normal Pressure Restored Event condition: true Event actions: Send SNS message: Target arn:
arn:aws:sns:us-east-1:123456789012:pressureClearedAction
-
-
暂停第二个状态(危险
)。该状态的周长上会出现一个箭头
-
单击箭头并将其从第二个状态拖动到第一个状态。将出现一条标有无标题标签的定向线。
-
选择无标题行,然后在过渡事件窗格中,使用以下信息输入事件名称和事件触发逻辑。
{ Event name: BackToNormal Event trigger logic: $input.PressureInput.sensorData.pressure <= 70 && $variable.pressureThresholdBreached <= 0 }
有关我们为何在触发器逻辑中测试
$input
值和$variable
值的更多信息,请参阅 AWS IoT Events 探测器型号限制和限制 中变量值可用性的条目。 -
选择开始状态。默认情况下,此状态是在您创建探测器模型时创建的)。在 开始窗格中,选择目标状态(例如,正常)。
-
接下来,配置您的探测器模型以监听输入。选择右上角的发布。
-
在发布探测器模型页面,执行以下操作。
-
输入探测器模型名称、描述和角色名称。将为您创建此角色。
-
选择为每个唯一键值创建探测器。要创建和使用自己的角色,请按照 为设置权限 AWS IoT Events 中的步骤操作,并在此处将其作为角色输入。
-
-
对于探测器创建密钥,请选择您之前定义的输入的其中一个属性的名称。您选择作为探测器创建密钥的属性必须存在于每个消息输入中,并且对于每台发送消息的设备都必须是唯一的。此示例使用 motorid 属性。
-
选择保存并发布。
注意
为给定探测器模型创建的唯一探测器的数量取决于发送的输入消息。创建探测器模型时,会从输入属性中选择一个密钥。此密钥决定要使用哪个探测器实例。如果以前从未见过密钥(对于此探测器模型),则会创建一个新的探测器实例。如果以前见过密钥,我们使用与该密钥值相对应的现有探测器实例。
您可以制作探测器模型定义的备份副本(采用 JSON 格式),重新创建或更新探测器模型,也可以将其用作模板来创建另一个探测器模型。
您可以从控制台或使用以下 CLI 命令执行此操作。如有必要,请更改探测器模型的名称,使其与您在上一步中发布时使用的名称相匹配。
aws iotevents describe-detector-model --detector-model-name motorDetectorModel > motorDetectorModel.json
这将创建一个文件 (motorDetectorModel.json
),其内容类似于以下内容。
{ "detectorModel": { "detectorModelConfiguration": { "status": "ACTIVE", "lastUpdateTime": 1552072424.212, "roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole", "creationTime": 1552072424.212, "detectorModelArn": "arn:aws:iotevents:us-west-2:123456789012:detectorModel/motorDetectorModel", "key": "motorid", "detectorModelName": "motorDetectorModel", "detectorModelVersion": "1" }, "detectorModelDefinition": { "states": [ { "onInput": { "transitionEvents": [ { "eventName": "Overpressurized", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "$variable.pressureThresholdBreached + 3" } } ], "condition": "$input.PressureInput.sensorData.pressure > 70", "nextState": "Dangerous" } ], "events": [] }, "stateName": "Normal", "onEnter": { "events": [ { "eventName": "init", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "0" } } ], "condition": "true" } ] }, "onExit": { "events": [] } }, { "onInput": { "transitionEvents": [ { "eventName": "Back to Normal", "actions": [], "condition": "$variable.pressureThresholdBreached <= 1 && $input.PressureInput.sensorData.pressure <= 70", "nextState": "Normal" } ], "events": [ { "eventName": "Overpressurized", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "3" } } ], "condition": "$input.PressureInput.sensorData.pressure > 70" }, { "eventName": "Pressure Okay", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "$variable.pressureThresholdBreached - 1" } } ], "condition": "$input.PressureInput.sensorData.pressure <= 70" } ] }, "stateName": "Dangerous", "onEnter": { "events": [ { "eventName": "Pressure Threshold Breached", "actions": [ { "sns": { "targetArn": "arn:aws:sns:us-west-2:123456789012:MyIoTButtonSNSTopic" } } ], "condition": "$variable.pressureThresholdBreached > 1" } ] }, "onExit": { "events": [ { "eventName": "Normal Pressure Restored", "actions": [ { "sns": { "targetArn": "arn:aws:sns:us-west-2:123456789012:IoTVirtualButtonTopic" } } ], "condition": "true" } ] } } ], "initialStateName": "Normal" } } }