

终止支持通知：2026 年 5 月 20 日， AWS 将终止对的支持。 AWS IoT Events 2026 年 5 月 20 日之后，您将无法再访问 AWS IoT Events 控制台或 AWS IoT Events 资源。有关更多信息，请参阅[AWS IoT Events 终止支持](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-end-of-support.html)。

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

# 在中创建探测器模型 AWS IoT Events
<a name="iotevents-detector-model"></a>

在该主题中，您使用*状态*来定义一个*探测器模型*（您的设备或进程的模型）。

对于每种状态，您定义条件（布尔值）逻辑，该逻辑评估传入的输入以检测重要事件。当检测到事件时，它会更改状态并可以启动其他操作。这些事件称为过渡事件。

在您的状态下，您还可以定义在探测器进入或退出该状态或收到输入时可以运行操作的事件（这些事件被称为`OnEnter`、`OnExit` 和 `OnInput` 事件）。仅当事件的条件逻辑计算为 `true` 时，操作才会运行。

**创建探测器模型**

1. 已为您创建了第一个探测器状态。要对其进行修改，请在主编辑空间中选择标有 **State\$11** 标签的圆圈。

1. 在**状态**窗格中，输入**州名称 **OnEnter****，然后选择**添加事件**。

1. 在**添加 OnEnter 事件**页面上，输入**事件名称**和**事件条件**。在此示例中，输入 `true` 以表示当进入状态时，事件始终处于启动状态。

1. 在 **事件操作** 下面，选择 **添加操作**。

1. 在**事件操作**下，执行以下操作：

   1. 选择**设置变量**

   1.  对于**变量运算**，选择**赋值**。

   1. 对于**变量名称**，输入要设置的变量的名称。

   1. 对于**变量值**，输入值 **0**（零）。

1. 选择**保存**。

   可以在探测器模型中的任何事件中设置变量（赋值），例如您定义的变量。只有在探测器达到状态并运行定义或设置变量的操作后，才能引用变量的值（例如，在事件的条件逻辑中）。

1. 在“**状态**” 窗格中，选择“**状态**”旁边的 **X** 以返回到**探测器模型调色板**。

1. 要创建第二个探测器状态，请在**探测器模型调色板**中，选择**状态**并将其拖到主编辑空间中。这将创建一个名为 `untitled_state_1` 的状态。

1. 在第一个状态（**正常**）下暂停。状态的周长上会出现一个箭头。

1. 单击箭头并将其从第一个状态拖动到第二个状态。将出现从第一个状态到第二个状态的定向线（标记为“**无标题**”）。

1. 选择**“无标题”** 行。在**过渡事件**窗格中，输入**事件名称**和**事件触发逻辑**。

1. 在**过渡事件**窗格中，选择**添加操作**。

1. 在**添加过渡事件操作**窗格上，选择**添加操作**。

1.  在**选择操作**中，选择**设置变量**。

   1. 对于**变量运算**，选择**赋值**。

   1. 对于 **变量名称**，输入变量的名称。

   1. 对于 **赋值**，输入值，例如： `$variable.pressureThresholdBreached + 3`。

   1. 选择**保存**。

1. 选择第二个状态 **untitled\$1state\$11**。

1. 在**状态**窗格中，输入**状态名称**，然后在**On Enter**中选择**添加事件**。

1. 在**添加 OnEnter 事件**页面上，输入**事件名称**和**事件条件**。选择**添加操作**。

1. 在**选择操作**中，选择 **发送 SNS 消息**。

   1. 对于 **SNS 主题**，请输入 Amazon SNS 主题的目标 ARN。

   1. 选择**保存**。

1. 继续在示例中添加事件。

   1. 对于 **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
      ```

   1. 对于 **OnInput**，选择**添加事件**，然后输入并保存以下事件信息。

      ```
        Event name: Pressure Okay
        Event condition: $input.PressureInput.sensorData.pressure <= 70
        Event actions:
          Set variable:
            Variable operation: Decrement
            Variable name: pressureThresholdBreached
      ```

   1. 对于 **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
      ```

1. 暂停第二个状态（**危险**``）。该状态的周长上会出现一个箭头

1. 单击箭头并将其从第二个状态拖动到第一个状态。将出现一条标有**无标题**标签的定向线。

1. 选择**无标题**行，然后在**过渡事件**窗格中，使用以下信息输入**事件名称****和事件触发逻辑**。

   ```
   {
     Event name: BackToNormal
     Event trigger logic: $input.PressureInput.sensorData.pressure <= 70 && $variable.pressureThresholdBreached <= 0
   }
   ```

   有关我们为何在触发器逻辑中测试 `$input` 值和 `$variable` 值的更多信息，请参阅 [AWS IoT Events 探测器型号限制和限制](iotevents-restrictions-detector-model.md) 中变量值可用性的条目。

1. 选择**开始**状态。默认情况下，此状态是在您创建探测器模型时创建的）。在 **开始**窗格中，选择**目标状态**（例如，**正常**）。

1. 接下来，配置您的探测器模型以监听输入。选择右上角的**发布**。

1. 在**发布探测器模型**页面，执行以下操作。

   1.  输入**探测器模型名称**、**描述**和**角色**名称。将为您创建此角色。

   1. 选择**为每个唯一键值创建探测器**。要创建和使用自己的**角色**，请按照 [为设置权限 AWS IoT Events](iotevents-permissions.md) 中的步骤操作，并在此处将其作为**角色**输入。

1. 对于**探测器创建密钥**，请选择您之前定义的输入的其中一个属性的名称。您选择作为探测器创建密钥的属性必须存在于每个消息输入中，并且对于每台发送消息的设备都必须是唯一的。此示例使用 **motorid** 属性。

1. 选择**保存并发布**。

**注意**  
为给定探测器模型创建的唯一探测器的数量取决于发送的输入消息。创建探测器模型时，会从输入属性中选择一个密钥。此密钥决定要使用哪个探测器实例。如果以前从未见过密钥（对于此探测器模型），则会创建一个新的探测器实例。如果以前见过密钥，我们使用与该密钥值相对应的现有探测器实例。

您可以制作探测器模型定义的备份副本（采用 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"
        }
    }
}
```