View a markdown version of this page

AWS IoT 命令疑难解答 - AWS IoT Core

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

AWS IoT 命令疑难解答

这是 AWS IoT Device Management 命令的故障排除部分。

命令执行问题

命令执行保持在 CREATED 状态

当命令执行保持CREATED状态且未进入IN_PROGRESS或另一种状态时,请考虑以下几点:

  • 验证设备已连接到 AWS IoT Core 并已订阅命令请求主题。

  • 检查设备政策是否允许iot:Subscribe、命令请求iot:Publish主题和命令响应主题。iot:Receive

  • 如果设备处于离线状态并使用 MQTT 持久会话,则该命令将在 AWS IoT 核心层等待。当设备在持续会话超时和执行超时之前重新连接时,它可以处理命令。如果执行超时到期,则执行将转换为TIMED_OUT。

DataConflict 开机时出错 UpdateCommandExecution

当并行或在短时间内向服务UpdateCommandExecution发出多个请求时(例如,IN_PROGRESS紧接着是SUCCEEDED),就会出现DataConflict错误。

要解决此问题,请执行以下操作:

  • 订阅/accepted和/rejected回复主题以确认每个状态更新都已处理完毕,然后再发送下一次更新。

  • 在收到错误时使用指数退避实现重试逻辑。DataConflict

命令执行意外变为 TIMED_OUT 终端状态

当命令执行过渡到设备可以处理TIMED_OUT之前时:

  • 查看为命令执行配置的超时值。对于您的用例而言,默认超时可能太短。

  • 如果发送命令时设备处于脱机状态,请验证设备是否在超时到期之前重新连接并收到了执行请求。

  • 云端启动的TIMED_OUT不是终端。设备仍然可以将执行更新为终端状态(SUCCEEDEDFAILED、REJECTED、或TIMED_OUT)。

注意

设备启动TIMED_OUT是一种终端状态,无法对该命令执行进行进一步的更新。

如何查看 CloudWatch 日志中的错误?

来自 UpdateCommandExecution MQTT 请求的错误记录在亚马逊 CloudWatch的AWSIoTLogsV2日志组中。要启用日志记录和查看日志,请参阅配置 AWS IoT 日志记录。

UpdateCommandExecution 错误代码

当 UpdateCommandExecution MQTT 请求失败时,该服务会向该/rejected主题发布错误响应。错误响应包含错误代码和消息。下表列出了可以返回的错误代码。

错误代码 可重试 说明
InvalidStateTransition 否 不允许请求的状态转换。例如,从过渡SUCCEEDED到IN_PROGRESS,更新设备启动的执行TIMED_OUT。
TerminalStateReached 否 命令执行已达到终端状态,无法更新。
ResourceNotFound 否 指定的命令执行不存在。
DataConflict 是 命令执行已同时修改。当快速连续发送状态更新时,可能会发生这种情况。订阅/accepted和/rejected回复主题以确认每个状态更新都已处理完毕,然后再发送下一次更新。有关更多详细信息,请参阅DataConflict 错误 UpdateCommandExecution。
InternalError 是 发生内部服务器错误。使用指数退避重试请求。

以下是发布到该/rejected主题的错误响应示例:

{ "clientToken": "client-token-1", "executionId": "2bd65c51-4cfd-49e4-9310-d5cbfdbc8554", "error": "DataConflict", "errorMessage": "The command execution was modified concurrently" }