常见Amazon IoT Events问题和解决方案 - Amazon IoT Events
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

常见Amazon IoT Events问题和解决方案

请参阅以下部分,对错误进行故障排除,并找到解决Amazon IoT Events问题的可能解决方案。

检测程序模型创建错误

我在尝试创建检测程序模型时出错。

创建检测程序模型时,您必须考虑以下限制。

  • 每个 action 字段中只允许执行一个操作。

  • 对于transitionEventscondition 是必填项。对于OnEnterOnInputOnExit 事件,它是选填项。

  • 如果condition字段为空,则条件表达式的计算结果等同于 true

  • 条件表达式的计算结果应为布尔值。如果结果不是布尔值,则它等同于 false 且不会触发 actions 或转换为事件中指定的nextState

有关更多信息,请参见 检测程序模型限制和局限性

从已删除的检测程序模型获取更新

我几分钟前更新或删除了一个检测程序模型,但我仍能通过 MQTT 消息或 SNS 提醒从旧检测程序模型获取状态更新。

如果您更新、删除或重新创建探测器模型(参见 UpdateDetectorModel),则在删除所有探测器实例并使用新模型之前,会有一段延迟。在此期间,输入可能会继续由先前版本的检测程序模型实例处理。您可能会继续收到由先前检测程序型号定义的提醒。请至少等待 7 分钟,然后再重新检查更新或者报告错误。

操作触发失败(满足条件时)

当满足条件时,检测程序无法触发操作或过渡至新状态。

验证检测程序的条件表达式的计算结果是否为布尔值。如果结果不是布尔值,则它等同于 false 且不会触发 action 或转换为事件中指定的nextState。有关更多信息,请参阅条件表达式语法

操作触发失败(违反阈值时)

当条件表达式中的变量达到指定值时,检测程序不会触发操作或事件转换。

如果您为onInputonEnter、或onExit更新setVariable,则在当前处理周期内评估任何condition时都不会使用新值。相反,原始值会在当前周期完成前一直使用。您可通过按检测程序模型定义设置evaluationMethod参数,以更改此行为。如果将evaluationMethod设置为SERIAL,则按事件的定义顺序更新变量并评估事件条件。如果将evaluationMethod设置为BATCH(默认),则仅在评估所有事件条件后才会更新变量并执行事件。

状态用途不正确

当我尝试通过BatchPutMessage向输入发送消息时,检测程序进入错误的状态。

如果您使用BatchPutMessage向输入发送多条消息,则无法保证消息或输入的处理顺序。为保证顺序,请一次发送一条消息,然后每次等待BatchPutMessage以确认成功。

连接消息

当我尝试调用 API 时收到了('Connection aborted.', error(54, 'Connection reset by peer'))错误。

验证 OpenSSL 是否使用 TLS 1.1 或更高版本建立连接。这应当是大多数 Linux 发行版或 Windows 7 及更高版本下的默认设置。macOS 用户可能需要升级 OpenSSL。

InvalidRequestException 消息

InvalidRequestException 当我尝试调用CreateDetectorModelUpdateDetectorModel API 时我就会明白。

查看以下内容,以帮助解决问题。有关更多信息,请参阅 CreateDetectorModelUpdateDetectorModel

  • 确保不要同时使用secondsdurationExpression作为SetTimerAction的参数。

  • 请确保您的durationExpression字符串表达式有效。字符串表达式可以包含数字、变量 ($variable.<variable-name>) 或输入值 ($input.<input-name>.<path-to-datum>)。

Amazon CloudWatch 日志action.setTimer错误

您可以设置 Amazon CloudWatch Logs 来监控Amazon IoT Events探测器模型实例。以下是您在使用action.setTimer时由Amazon IoT Events生成的常见错误。

  • 错误:无法将名为<timer-name>的计时器的持续时间表达式求值为数字。

    确保您的durationExpression字符串表达式可以转换为数字。不允许使用其他数据类型,如布尔值。

  • 错误:名为<timer-name>的计时器的持续时间表达式的计算结果大于 31622440。为确保准确性,请确保您的持续时间表达式指介于 60 和 31622400 之间的值。

    确保您的计时器持续时间小于或等于 31622400 秒。持续时间的计算结果向下舍入为最接近的整数。

  • 错误:名为<timer-name>的计时器的持续时间表达式的计算结果小于 60。为确保准确性,请确保您的持续时间表达式指介于 60 和 31622400 之间的值。

    确保计时器的持续时间大于或等于 60 秒。持续时间的计算结果向下舍入为最接近的整数。

  • 错误:名为<timer-name>的计时器的持续时间表达式的结果无法计算。检查变量名称、输入名称和数据路径,以确保引用了现有变量和输入值。

    确保您的字符串表达式引用了现有的变量和输入值。字符串表达式可以包含数字、变量 ($variable.variable-name) 和输入值 ($input.input-name.path-to-datum)。

  • 错误:无法设置名为<timer-name>的计时器。请检查您的持续时间表达式,然后重试。

    请查看SetTimerAction操作以确保您指定了正确的参数,然后再次设置计时器。

有关更多信息,请参阅开发Amazon IoT Events探测器模型时启用 Amazon CloudWatch 日志记录

Amazon CloudWatch 有效负载错误

您可以设置 Amazon CloudWatch Logs 来监控Amazon IoT Events探测器模型实例。以下是您在配置操作有效负载时由Amazon IoT Events生成的常见错误和警告。

  • 错误:我们无法求解您的操作表达式。确保变量名称、输入名称和数据路径引用了现有变量和输入值。此外,请验证有效负载的大小是否小于 1 KB,即有效负载的最大允许大小。

    确保输入正确的变量名称、输入名称和数据路径。如果操作有效负载大于 1 KB,您也可能会收到此错误消息。

  • 错误:我们无法解析<action-type>有效负载的内容表达式。输入语法正确的内容表达式。

    内容表达式可以包含字符串 ('string')、变量 ($variable.variable-name)、输入值 ($input.input-name.path-to-datum)、字符串串联,以及包含 ${}的字符串。

  • 错误:您的有效负载表达式 {expression} 无效。定义的有效负载类型为 JSON,因此您必须指定一个Amazon IoT Events将其求值为字符串的表达式。

    如果指定的有效负载类型为 JSON,则 Amazon IoT Events 首先检查服务是否可以将您的表达式求值为字符串。计算结果不得为布尔值或数字。如果验证失败,您可能会收到此错误消息。

  • 警告:此操作已执行,但我们无法将操作负载的内容表达式求值为有效的 JSON。定义的有效负载类型为 JSON。

    如果您将有效负载类型定义为JSON,请确保Amazon IoT Events可以将按有效负载的内容表达式求值为有效 JSON。即使Amazon IoT Events 无法将内容表达式求值为有效 JSON,Amazon IoT Events仍可运行此操作。

有关更多信息,请参阅开发Amazon IoT Events探测器模型时启用 Amazon CloudWatch 日志记录

数据类型不兼容

消息:在以下表达式中找到了不兼容的<inferred-types>数据类型 [<reference>]:<expression>

收到此错误的原因可能是以下任一原因:

  • 您引用的计算结果与表达式中的其他操作数不兼容。

  • 不支持传递至函数的自变量的类型。

当您在表达式中使用引用时,请检查以下内容:

  • 当您将引用值作为一个或多个运算符的操作数时,确保您引用的所有数据类型均兼容。

    例如,在以下表达式中,整数 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)函数,如果您引用类型值,则您引用的计算结果必须是StringDecimalBoolean

有关更多信息,请参见 参考

向 Amazon IoT Events发送消息失败

消息:无法向物联网事件发送消息

出现此错误的原因如下:

  • 输入消息有效负载不包含 Input attribute Key

  • Input attribute Key与输入定义中指定的 JSON 路径不同。

  • 输入消息与 Amazon IoT Events 输入中定义的架构不匹配。

注意

其他服务的数据摄取也会出现失败。

例如,在Amazon IoT Core中,Amazon IoT规则无法发送以下消息Verify the Input Attribute key.

要解决此问题,请确保输入的有效负载消息架构符合 Amazon IoT Events输入定义且 Input attribute Key 位置匹配。有关更多信息,请参阅 在导航窗格内创建一个输入 以了解如何定义 Amazon IoT Events 输入。