本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
表达式
Amazon IoT Events 提供了多种在创建和更新探测器模型时指定值的方法。您可以使用表达式来指定文字值,也Amazon IoT Events可以在指定特定值之前对表达式求值。
语法
您可以在Amazon IoT Events表达式中使用文字、运算符、函数、引用和替代模板。
文本
-
整数
-
十进制
-
字符串
-
布尔值
运算符
- 一元运算
-
-
非运算(布尔):
!
-
非运算(按位):
~
-
减号(算术):
-
-
- 字符串
-
-
联接:
+
两个操作数都必须是字符串。字符串文本必须括在单引号 (') 内。
例如:
'my' + 'string'
->'mystring'
-
- 算术
-
-
加 (
+
)两个操作数都必须是数字。
-
减 :
-
-
除:
/
除法结果为四舍五入的整数值,除非操作数(除数或被除数)中至少有一个是小数值。
-
乘:
*
-
- 按位(整数)
-
-
或:
|
例如:
13 | 5
->13
-
与:
&
例如:
13 & 5
->5
-
异或:
^
例如:
13 ^ 5
->8
-
非:
~
例如:
~13
->-14
-
- 布尔值
-
-
小于:
<
-
小于或等于:
<=
-
等于:
==
-
不等于:
!=
-
大于或等于:
>=
-
大于:
>
-
与:
&&
-
或:
||
注意
当
||
的子表达式包含未定义的数据时,该子表达式将被视为false
。
-
- 圆括号
-
您可以使用圆括号对表达式中的术语进行分组。
函数
- 内置函数
-
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
)-
计算为转换为指定类型的表达式的值。
类型
值必须为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
")-
类型
值可以是"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)
两个表达式的计算结果都必须为整数值。如果任一表达式的计算结果都不是整数值,则函数的结果未定义。不进行任何转换。
参考
- 输入
-
$input.
input-name
.path-to-data
input-name
是您使用 CreateInput 操作来创建的输入。例如,如果您有一个名为
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]
- Variables
-
$variable.
variable-name
是您使用 createDetectorModel 操作来定义的变量。variable-name
例如,如果您使用定义了一个名为
TechnicianID
的变量(您使用detectorDefinition.states.onInputEvents.actions.setVariable.variableName
定义了该变量),则可以使用以下命令引用最近赋予该变量的(字符串)值。$variable.TechnicianID
只能使用
setVariable
操作来设置变量的值。不能为表达式中的变量赋值。变量不能被取消设置。例如,您不能为其分配值null
。
注意
在使用不遵循(正则表达式)模式[a-zA-Z][a-zA-Z0-9_]*
的标识符的引用中,必须用反引号 (`
) 将这些标识符括起来。例如,对具有名为 _value
的字段的名为 MyInput
的输入的引用必须将该字段指定为 $input.MyInput.`_value`
。
当您在表达式中使用引用时,请检查以下内容:
-
当您将引用值作为一个或多个运算符的操作数时,确保您引用的所有数据类型均兼容。
例如,在以下表达式中,整数
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
)类型
值,则您引用的计算结果必须是String
、Decimal
或Boolean
。
Amazon IoT Events 表达式支持整数、小数值、字符串和布尔数据类型。下表提供了不兼容的类型对的列表。
不兼容的类型对 |
---|
整数、字符串 |
整数、布尔值 |
小数值、字符串 |
小数值、布尔值 |
字符串、布尔值 |
替换模板
-
'${
expression
}'${}
将字符串标识为插值字符串。expression
可以是任何 Amazon IoT Events 表达式。这包括运算符、函数和引用。例如,您使用了 setVariableAction 操作来定义变量。
variableName
是SensorID
,value
是10
。您可以创建以下替换模板。替换模板 结果字符串 '${'Sensor ' + $variable.SensorID}'
"Sensor 10"
'Sensor ' + '${$variable.SensorID + 1}'
"Sensor 11"
'Sensor 10: ${$variable.SensorID == 10}'
"Sensor 10: true"
'{\"sensor\":\"${$variable.SensorID + 1}\"}'
"{\"sensor"\:\"11\"}"
'{\"sensor\":${$variable.SensorID + 1}}'
"{\"sensor\":11}"