View a markdown version of this page

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

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

AWS IoT 命令疑难解答

这是 AWS IoT Device Management 命令的疑难解答部分。

命令执行问题

命令执行保持已创建状态

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

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

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

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

DataConflict 错误开启 UpdateCommandExecution

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

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

  • 订阅/accepted/rejected响应主题以确认每个状态更新均已处理,然后再发送下一个更新。

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

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

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

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

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

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

注意

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

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

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

UpdateCommandExecution 错误代码

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

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

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

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