

终止支持通知：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)。

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

# 用于筛选、转换和处理事件数据的表达式
<a name="iotevents-expressions"></a>

表达式用于评估传入数据、执行计算以及确定应在何种条件下发生特定操作或状态转换。 AWS IoT Events 提供了几种在创建和更新探测器模型时指定值的方法。您可以使用表达式来指定文字值，也 AWS IoT Events 可以在指定特定值之前对表达式求值。

**Topics**
+ [用于筛选设备数据和定义操作的语法 AWS IoT Events](#expression-syntax)
+ [的表达式示例和用法 AWS IoT Events](expression-usage.md)

## 用于筛选设备数据和定义操作的语法 AWS IoT Events
<a name="expression-syntax"></a>

表达式提供了用于筛选设备数据和定义操作的语法。您可以在 AWS IoT Events 表达式中使用文字、运算符、函数、引用和替代模板。通过组合这些组件，您可以创建强大而灵活的表达式来处理物联网数据、执行计算、操作字符串，并在探测器模型中做出合乎逻辑的决策。

### 文本
<a name="expression-literal"></a>
+ 整数
+ 十进制
+ 字符串
+ 布尔值

### 运算符
<a name="expression-operator"></a>

一元运算  
+ 非运算（布尔）：`!`
+ 非运算（按位）：`~`
+ 减号（算术）：`-`

字符串  
+ 联接：**`+`**

  两个操作数都必须是字符串。字符串文本必须括在单引号 (') 内。

  例如：`'my' + 'string'` -> `'mystring'`

算术  
+ 加 (**`+`**)

  两个操作数都必须是数字。
+ 减 ：**`-`**
+ 除：**`/`**

  除法结果为四舍五入的整数值，除非操作数（除数或被除数）中至少有一个是小数值。
+ 乘：**`*`**

按位（整数）  
+ 或：**`|`**

  例如：`13 | 5` -> `13`
+ 与：**`&`**

  例如：`13 & 5` -> `5`
+ 异或：**`^`**

  例如：`13 ^ 5` -> `8`
+ 非：**`~`**

  例如：`~13` -> `-14`

布尔值  
+ 小于：**`<`**
+ 小于或等于：**`<=`**
+ 等于：**`==`**
+ 不等于：**`!=`**
+ 大于或等于：**`>=`**
+ 大于：**`>`**
+ 与：**`&&`**
+ 或：**`||`**
**注意**  
当 `||` 的子表达式包含未定义的数据时，该子表达式将被视为 `false`。

圆括号  
您可以使用圆括号对表达式中的术语进行分组。

### 要在 AWS IoT Events 表达式中使用的函数
<a name="expression-function"></a>

AWS IoT Events 提供了一组内置函数，用于增强探测器模型表达式的功能。这些函数支持计时器管理、类型转换、空值检查、触发器类型识别、输入验证、字符串操作和按位运算。通过利用这些功能，您可以创建响应式 AWS IoT Events 处理逻辑，从而提高物联网应用程序的整体效率。

内置函数    
`timeout("{{timer-name}}")`  
如果指定的计时器已过，则计算为 `true`。将 “{{*timer-name*}}” 替换为您定义的计时器的名称（用引号表示）。在事件操作中，您可以定义计时器，然后启动计时器、重置计时器或清除先前定义的计时器。参见字段 `detectorModelDefinition.states.onInput|onEnter|onExit.events.actions.setTimer.timerName`。  
在一种状态下设置的计时器可以在另一种状态下被引用。在进入引用计时器的状态之前，必须访问您创建计时器所处的状态。  
例如，探测器模型有两种状态，`TemperatureChecked`和`RecordUpdated`。您创建了一个`TemperatureChecked`处于该状态的计时器。您必须先访问该`TemperatureChecked`州，然后才能在该`RecordUpdated`州使用计时器。  
为了确保准确性，计时器应设为最短时间为 60 秒。  
`timeout()` 仅在计时器实际到期后首次检查时返回 `true`，之后返回 `false`。  
`convert({{type}}, {{expression}})`  
计算为转换为指定类型的表达式的值。该{{type}}值必须为`String``Boolean`、或`Decimal`。使用其中一个关键字或计算为包含该关键字的字符串的表达式。只有以下转换成功并返回有效值：  
+ 布尔值 -> 字符串

  返回字符串 `"true"` 或 `"false"`。
+ 小数值 -> 字符串
+ 字符串-> 布尔值
+ 字符串-> 小数值

  指定的字符串必须是小数值的有效表示形式，否则 `convert()` 将失败。
如果 `convert()` 未返回有效值，则它所属的表达式也无效。此结果等同于 `false` 且不会触发 `actions` 或过渡到作为表达式发生的事件的一部分而指定的 `nextState`。  
`isNull({{expression}})`  
在表达式返回为空时计算 `true`。例如，如果输入 `MyInput` 收到消息 `{ "a": null }`，则以下计算为 `true`，但 `isUndefined($input.MyInput.a)` 计算为 `false`。  

```
isNull($input.MyInput.a)
```  
`isUndefined({{expression}})`  
如果表达式未定义，则计算为`true`。例如，如果输入 `MyInput` 收到消息 `{ "a": null }`，则以下计算为 `false`，但 `isNull($input.MyInput.a)` 计算为 `true`。  

```
isUndefined($input.MyInput.a)
```  
`triggerType("{{type}}")`  
{{type}} 值可能是 `"Message"` 或 `"Timer"`。如果因为计时器已过期而对其出现的事件条件进行评估，则计算为 `true`，如下例所示。  

```
triggerType("Timer")
```
或者收到了输入消息。  

```
triggerType("Message")
```  
`currentInput("{{input}}")`  
如果因为收到了指定的输入消息而对其出现的事件条件进行评估，则计算为 `true`。例如，如果输入 `Command` 收到消息 `{ "value": "Abort" }`，则以下计算为 `true`。  

```
currentInput("Command")
```
使用此函数来验证是否因为已收到特定输入且计时器尚未过期而正在评估条件，如以下表达式所示。  

```
currentInput("Command") && $input.Command.value == "Abort"
```

字符串匹配函数    
`startsWith({{expression1}}, {{expression2}})`  
如果第一个字符串表达式以第二个字符串表达式开头，则计算为 `true`。例如，如果输入 `MyInput` 收到消息 `{ "status": "offline"}`，则以下计算为 `true`。  

```
startsWith($input.MyInput.status, "off")
```
两个表达式的计算结果必须为字符串值。如果任一表达式的计算结果都不是字符串值，则函数的结果未定义。不进行任何转换。  
`endsWith({{expression1}}, {{expression2}})`  
如果第一个字符串表达式以第二个字符串表达式结尾，则计算为 `true`。例如，如果输入 `MyInput` 收到消息 `{ "status": "offline" }`，则以下计算为 `true`。  

```
endsWith($input.MyInput.status, "line")
```
两个表达式的计算结果必须为字符串值。如果任一表达式的计算结果都不是字符串值，则函数的结果未定义。不进行任何转换。  
`contains({{expression1}}, {{expression2}})`  
如果第一个字符串表达式包含第二个字符串表达式，则计算为 `true`。例如，如果输入 `MyInput` 收到消息 `{ "status": "offline" }`，则以下计算为 `true`。  

```
contains($input.MyInput.value, "fli")
```
两个表达式的计算结果必须为字符串值。如果任一表达式的计算结果都不是字符串值，则函数的结果未定义。不进行任何转换。

按位整数操作函数    
`bitor({{expression1}}, {{expression2}})`  
计算整数表达式的按位或（对整数的相应位执行二进制或运算）。例如，如果输入 `MyInput` 收到消息 `{ "value1": 13, "value2": 5 }`，则以下计算为 `13`。  

```
bitor($input.MyInput.value1, $input.MyInput.value2)
```
两个表达式的计算结果都必须为整数值。如果任一表达式的计算结果都不是整数值，则函数的结果未定义。不进行任何转换。  
`bitand({{expression1}}, {{expression2}})`  
计算整数表达式的按位与（对整数的相应位执行二进制与运算）。例如，如果输入 `MyInput` 收到消息 `{ "value1": 13, "value2": 5 }`，则以下计算为 `5`。  

```
bitand($input.MyInput.value1, $input.MyInput.value2)
```
两个表达式的计算结果都必须为整数值。如果任一表达式的计算结果都不是整数值，则函数的结果未定义。不进行任何转换。  
`bitxor({{expression1}}, {{expression2}})`  
计算整数表达式的按位异或（对整数的相应位执行二进制异或运算）。例如，如果输入 `MyInput` 收到消息 `{ "value1": 13, "value2": 5 }`，则以下计算为 `8`。  

```
bitxor($input.MyInput.value1, $input.MyInput.value2)
```
两个表达式的计算结果都必须为整数值。如果任一表达式的计算结果都不是整数值，则函数的结果未定义。不进行任何转换。  
`bitnot({{expression}})`  
计算整数表达式的按位取反（对整数的位执行二进制取反运算）。例如，如果输入 `MyInput` 收到消息 `{ "value": 13 }`，则以下计算为 `-14`。  

```
bitnot($input.MyInput.value)
```
两个表达式的计算结果都必须为整数值。如果任一表达式的计算结果都不是整数值，则函数的结果未定义。不进行任何转换。

### AWS IoT Events 表达式中输入和变量的参考
<a name="expression-reference"></a>

输入  
`$input.{{input-name}}.{{path-to-data}}`  
`input-name`是您使用[CreateInput](https://docs.aws.amazon.com/iotevents/latest/apireference/API_CreateInput.html)操作创建的输入。  
例如，如果您有一个名为 `TemperatureInput` 的输入（您对其定义了 `inputDefinition.attributes.jsonPath` 条目），则这些值可能会出现在以下可用字段中。  

```
{
    "temperature": 78.5,
    "date": "2018-10-03T16:09:09Z"
  }
```
要引用该 `temperature` 字段的值，请使用以下命令。  

```
$input.TemperatureInput.temperature
```
对于值为数组的字段，您可以使用 `[{{n}}]` 来引用数组的成员。例如，给定以下值：  

```
{
    "temperatures": [
      78.4,
      77.9,
      78.8
    ],
    "date": "2018-10-03T16:09:09Z"
  }
```
`78.8`可以使用以下命令引用该值。  

```
$input.TemperatureInput.temperatures[2]
```

变量  
`$variable.{{variable-name}}`  
`{{variable-name}}`是您使用[CreateDetectorModel](https://docs.aws.amazon.com/iotevents/latest/apireference/API_CreateDetectorModel.html)操作定义的变量。  
例如，如果您使用定义了一个名为 `TechnicianID` 的变量（您使用 `detectorDefinition.states.onInputEvents.actions.setVariable.variableName` 定义了该变量），则可以使用以下命令引用最近赋予该变量的（字符串）值。  

```
$variable.TechnicianID
```
只能使用 `setVariable` 操作来设置变量的值。不能为表达式中的变量赋值。变量不能被取消设置。例如，您不能为其分配值 `null`。

**注意**  
在使用不遵循（正则表达式）模式`[a-zA-Z][a-zA-Z0-9_]*`的标识符的引用中，必须用反引号 (```) 将这些标识符括起来。例如，对具有名为 `_value` 的字段的名为 `MyInput` 的输入的引用必须将该字段指定为 `$input.MyInput.`_value``。

当您在表达式中使用引用时，请检查以下内容：<a name="expression-reference-type-compatibility"></a>
+ 当您将引用值作为一个或多个运算符的操作数时，确保您引用的所有数据类型均兼容。

  例如，在以下表达式中，整数 `2` 是 `==` 和 `&&` 运算符的操作数。为确保操作数兼容，`$variable.testVariable + 1` 和 `$variable.testVariable`必须引用整数或小数。

  此外，整数 `1` 是运算符`+`的操作数。因此，`$variable.testVariable` 必须引用整数或小数。

  ```
  ‘$variable.testVariable + 1 == 2 && $variable.testVariable’
  ```
+ 当您使用引用作为传递给函数的自变量时，请确保该函数支持您引用的数据类型。

  例如，以下 `timeout("{{time-name}}")` 函数需要带有双引号的字符串作为自变量。如果使用引用作为{{timer-name}}值，则必须使用双引号引用字符串。

  ```
  timeout("{{timer-name}}")
  ```
**注意**  
对于`convert({{type}}, {{expression}})`函数，如果您使用引用作为{{type}}值，则引用的计算结果必须是`String``Decimal`、或`Boolean`。

AWS IoT Events 表达式支持整数、十进制、字符串和布尔数据类型。下表提供了不兼容的类型对的列表。


|  不兼容的类型对  | 
| --- | 
| 整数、字符串 | 
| 整数、布尔值 | 
| 小数值、字符串 | 
| 小数值、布尔值 | 
| 字符串、布尔值 | 

### AWS IoT Events 表达式的替换模板
<a name="expression-substitution-template"></a>

****  
`'${{{expression}}}'`  
`${}` 将字符串标识为插值字符串。`expression`可以是任何 AWS IoT Events 表达式。这包括运算符、函数和引用。  
例如，您使用[SetVariableAction](https://docs.aws.amazon.com/iotevents/latest/apireference/API_SetVariableAction.html)操作来定义变量。`variableName` 是 `SensorID`，`value` 是 `10`。您可以创建以下替换模板。      
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/iotevents/latest/developerguide/iotevents-expressions.html)