本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 日志中的错误?
-
来自
UpdateCommandExecutionMQTT 请求的错误记录在亚马逊 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" }