本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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的。设备仍然可以将执行更新为终端状态(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 error on UpdateCommandExecution。 |
InternalError |
是 | 发生内部服务器错误。使用指数退避重试请求。 |
以下是针对该/rejected主题发布的错误响应的示例:
{ "clientToken": "client-token-1", "executionId": "2bd65c51-4cfd-49e4-9310-d5cbfdbc8554", "error": "DataConflict", "errorMessage": "The command execution was modified concurrently" }