

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

# AWS IoT 命令疑难解答
<a name="commands-troubleshooting"></a>

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

## 命令执行问题
<a name="commands-execution-troubleshooting"></a>

**命令执行保持已创建状态**  
当命令执行保持`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`的。设备仍然可以将执行更新为终端状态（`SUCCEEDED``FAILED`、`REJECTED`、或`TIMED_OUT`）。
设备启动`TIMED_OUT`是一种终端状态，无法对该命令执行进行进一步的更新。

**如何查看 CloudWatch 日志中的错误？**  
`UpdateCommandExecution`MQTT 请求中的错误记录在亚马逊 CloudWatch的`AWSIoTLogsV2`日志组中。要启用日志记录并查看日志，请参阅[配置 AWS IoT 日志](configure-logging.md)。

## UpdateCommandExecution 错误代码
<a name="commands-error-codes"></a>

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


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

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

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