本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
实施 AWS.SendCommand 操作
该AWS.SendCommand操作允许托管集成 AWS IoT Device Management 将最终用户发起的命令通过 AWS 客户发送到您的资源服务器。您的资源服务器可能支持多种类型的设备,其中每种类型都有自己的响应模型。
命令执行是一个异步过程,其中托管集成 AWS IoT Device Management 向发送命令执行请求traceId,您的连接器将包含在 AWS IoT Device Management 通过 API 发送回托管集成的命令响应中SendConnectorEvent。的 Managed Integrations AWS IoT Device Management 期望资源服务器返回一个响应,确认已收到命令,但不一定表示该命令已执行。
设备命令执行工作流程
下图说明了命令执行流程,并举例说明了最终用户尝试打开房屋灯光的示例:
工作流程步骤
-
最终用户发送命令-最终用户使用 AWS 客户的应用程序发送开灯的命令。
-
客户中继命令-客户将命令信息中继到托管集成, AWS IoT Device Management 以获取最终用户的设备信息。
-
托管集成生成 TraceID-托管集成,用于 AWS IoT Device Management 生成 “traceID”,您的连接器将在将命令响应发送回服务时使用该集成。
-
发送到连接器-的托管集成的命令请求使用
AWS.SendCommand操作界面将命令请求 AWS IoT Device Management 发送到您的连接器。-
此接口定义的有效负载包括设备标识符、以 Matter endpoints/clusters /commands 形式制定的设备命令、最终用户的访问令牌以及其他必需的参数。
-
-
连接器存储 traceID-您的连接器存储
traceId要包含在命令响应中的。-
您的连接器将 AWS IoT Device Management 命令请求的托管集成转换为资源服务器的相应格式。
-
-
连接器获取 UserId-您的连接器
UserId从提供的最终用户的访问令牌中获取,并将其与命令相关联。-
要
UserId么使用单独的调用从资源服务器中检索,要么从 JWT 和类似令牌中提取访问令牌。 -
实现取决于您的资源服务器和访问令牌的详细信息。
-
-
连接器调用资源服务器-您的连接器调用资源服务器以 “打开” 最终用户的灯。
-
资源服务器与设备交互-资源服务器与设备交互。
-
连接器中继到托管集成 AWS IoT Device Management ,因为资源服务器已下发命令,并以 ACK 作为初始同步命令响应进行响应。
-
AWS IoT Device Management 然后,的托管集成将其中继回客户应用程序。
-
-
设备执行命令-设备开灯后,您的资源服务器会捕获该设备事件。
-
资源服务器发送设备事件-您的资源服务器将设备事件发送到连接器。
-
连接器转换事件-您的连接器将资源服务器生成的设备事件转换为 DEV AWS IoT Device Management ICE_COMMAND_RESPONSE 事件操作类型的托管集成。
-
连接器调用 SendConnectorEvent-您的连接器调用
SendConnectorEventAPI,操作为 “DEVICE_COMMAND_RESPONSE”。-
它会在初始请求 AWS IoT Device Management 中附上托管集成
traceId提供的内容。
-
-
托管集成通知客户-托管集成 AWS IoT Device Management 通知客户终端用户的设备状态变化。
-
客户通知最终用户-客户通知最终用户设备灯已亮起。
注意
您的资源服务器配置决定了处理失败的设备命令请求和响应消息的逻辑。这包括对命令使用相同的 referenceId 进行消息重试尝试。
执行设备命令的 C2C 连接器要求
以下列表概述了 C2C 连接器的要求,以促进设备命令的成功执行。
-
C2C 连接器 Lambda 可以
AWS.SendCommand处理来自 AWS IoT Device Management 托管集成的操作请求消息。 -
您的 C2C 连接器必须跟踪发送到您的资源服务器的命令,并将其映射到相应的 “TraceID”。
-
您可以使用用于注册 C2C 连接器的 AWS 凭证通过 Sigv4 调用 AWS IoT Device Management 服务 API 的 AWS 账户 托管集成。
命令执行过程
步骤 1:托管集成向连接器发送命令
根据授权类型,发送包含以下负载之一的 POST 请求:
OAuth 2.0 请求:
/Send-Command { "header": { "auth": { "token": "ashriu32yr97feqy7afsaf", "type": "OAuth2.0" } }, "payload": { "operationName": "AWS.SendCommand", "operationVersion": "1.0", "connectorId": "Your-Connector-Id", "connectorDeviceId": "Your_Device_Id", "traceId": "traceId-3241u78123419", "endpoints": [{ "id": "1", "clusters": [{ "id": "0x0202", "commands": [{ "0xff01": { "0x0000": "3” } }] }] }] } }
一般授权请求:
/Send-Command { "header": { "auth": { "secretsManager": { "arn": "string", "versionId": "string" }, "type": "GeneralAuthorization" } }, "payload": { "operationName": "AWS.SendCommand", "operationVersion": "1.0", "connectorId": "Your-Connector-Id", "connectorDeviceId": "Your_Device_Id", "traceId": "traceId-3241u78123419", "endpoints": [{ "id": "1", "clusters": [{ "id": "0x0202", "commands": [{ "0xff01": { "0x0000": "3" } }] }] }] } }
步骤 2:C2C 连接器 ACK 命令
{ "header":{ "responseCode":200 }, "payload":{ "responseMessage": "Successfully received send-command request for connector 'Your-Connector-Id' and connector-device-id 'Your_Device_Id'" } }
步骤 3:连接器发送设备命令响应事件
AWS-API: /SendConnectorEvent URI: POST /connector-event/{Your-Connector-Id} { "UserId": "End-User-Id", "Operation": "DEVICE_COMMAND_RESPONSE", "OperationVersion": "1.0", "StatusCode": 200, "Message": “Example message”, "ConnectorDeviceId": "Your_Device_Id", "TraceId": "traceId-3241u78123419", "MatterEndpoint": { "id": "1", "clusters": [{ "id": "0x0202", "attributes": [ { "0x0000": “3” } ], "commands": [ "0xff01": { "0x0000": "3” } ] }] } }
注意
在通过 API 收到相应的 DEVICE_COMMAND_RESPONSE 事件 AWS IoT Device Management 之前,由于命令执行而导致的设备状态变化不会反映在托管集成中。 SendConnectorEvent 这意味着,无论您的连接器调用响应是否表示成功,在的 Managed Integrations AWS IoT Device Management 收到之前步骤 3 的事件之前,都不会更新设备状态。
重要
除非设备已确认实际应用了状态更改,否则请勿在 DEVICE_COMMAND_RESPONSE 负载中包含属性。不带属性的 DEVICE_COMMAND_RESPONSE 表示该命令已发送给第三方,并会生成 DEVICE_COMMAND 通知。要报告设备上的属性值已更新,请发送包含更新属性的单独的 DEVICE_EVENT。这种区别可以防止在命令看似成功但设备从未收到状态更改的情况下出现误报,例如,当设备最近断开连接时。
解释 AWS.SendCommand 请求中包含的事项 “端点”
托管集成将使用设备发现期间报告的设备功能来确定设备可以接受哪些命令。每个设备功能都是通过 AWS 实现物质数据模型进行建模的;因此,所有传入的命令都将从给定集群中的 “commands” 字段派生。您的连接器负责解析 “端点” 字段,确定相应的 Matter 命令,然后对其进行翻译,以便正确的命令到达设备。通常,这意味着将 Matter 数据模型转换为相关的 API 请求。
执行命令后,您的连接器将确定由物质数据模型的 AWS 实现定义的哪些 “属性” 因此发生了变化。然后,这些更改将通过 API 发送的 API DEVICE_COMMAND_RESPONSE 事件报告给 AWS IoT Device Management 的托管集成。SendConnectorEvent
考虑以下示例负载中包含的 “端点” 字段:AWS.SendCommand
"endpoints": [{ "id": "1", "clusters": [{ "id": "0x0202", "commands": [{ "0xff01": { "0x0000": "3” } }] }] }]
通过此对象,连接器可以确定以下内容:
-
设置终端节点和集群信息:
-
将端点设置
id为 “1”。注意
如果设备定义了多个端点,使单个集群(例如 On/Off)可以控制多种功能(即开灯 on/off 和开启闪光灯 on/off),则使用此 ID 将命令路由到正确的功能。
-
将集群设置
id为 “0x0202”(风扇控制集群)。
-
-
设置命令信息:
-
将命令标识符设置为 “0xff01”(更新状态命令由定义)。 AWS
-
使用请求中提供的值更新包含的属性标识符。
-
-
更新属性:
-
将属性标识符设置为 “0x0000”(风扇控制集FanMode 群的属性)。
-
将属性值设置为 “3”(高风扇速度)。
-
Managed Integrations 定义了两种 “自定义” 命令类型,这些类型不是由物质数据模型的 AWS 实现严格定义的: ReadState 和 UpdateState 命令。要获取和设置 Matter 定义的集群属性,托管集成将向您的连接器发送一个AWS.SendCommand请求,其中包含与 UpdateState (id: 0xff01) 或 ReadState (id: 0xff02) 相关的命令 ID,以及必须更新或读取的相应属性参数。对于设置为可变(可更新)或可检索(可读取)的属性,可以为任何设备类型调用这些命令,这些属性可以从相应的 Matter 数据模型 AWS 实现中调用。