本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
实现 C2C 连接器接口操作
的托管集成 AWS IoT Device Management 定义了您 AWS Lambda 必须处理的四个操作才有资格成为连接器。您的 C2C 连接器必须实现以下每项操作:
-
AWS.ActivateUser- AWS IoT Device Management 服务托管集成调用此 API 来检索全球唯一的用户标识符。对于 OAuth 2.0,这与提供的 OAuth 2.0 令牌相关联。可以选择使用此操作来执行账户关联过程的任何其他要求。 -
AWS.DiscoverDevices- AWS IoT Device Management 服务托管集成会将此 API 调用到您的连接器以发现用户的设备 -
AWS.SendCommand- AWS IoT Device Management 服务托管集成会将此 API 调用到您的连接器,以便为用户设备发送命令 -
AWS.DeactivateUser- AWS IoT Device Management 服务托管集成会将此 API 调用到您的连接器,以停用用户的访问令牌以在您的授权服务器中取消链接。
调用详情
的托管集成 AWS IoT Device Management 始终通过操作调用带有 JSON 字符串负载的 Lambda 函数。 AWS Lambda invokeFunction请求操作必须在每个请求负载中包含一个operationName字段。
调用设置:
-
超时:每次调用 2 秒
-
重试:失败时重试 5 次
实现示例
您为连接器实现的 Lambda 将解析请求有效负载operationName中的一个,并实现相应的功能以映射到第三方云:
public ConnectorResponse handleRequest(final ConnectorRequest request) throws OperationFailedException { Operation operation; try { operation = Operation.valueOf(request.payload().operationName()); } catch (IllegalArgumentException ex) { throw new ValidationException( "Unknown operation '%s'".formatted(request.payload().operationName()), ex ); } return switch (operation) { case ActivateUser -> activateUserManager.activateUser(request); case DiscoverDevices -> deviceDiscoveryManager.listDevices(request); case SendCommand -> sendCommandManager.sendCommand(request); case DeactivateUser -> deactivateUser.deactivateUser(request); }; }
注意
连接器的开发者必须实现前面示例中列出的activateUserManager.activateUser(request)deviceDiscoveryManager.listDevices(request)sendCommandManager.sendCommand(request)、、和deactivateUser.deactivateUser操作。
请求格式示例
以下示例详细介绍了来自托管集成的通用连接器请求,其中包含每个必需接口的公共字段。从示例中,您可以看到既有请求标头,又有请求负载。请求标头在每个操作接口中都很常见。
OAuth 2.0 示例:
{ "header": { "auth": { "token": "ashriu32yr97feqy7afsaf", "type": "OAuth2.0" } }, "payload":{ "operationName": "AWS.SendCommand", "operationVersion": "1.0", "connectorId": "exampleId", … } }
通用授权示例:
{ "header": { "auth": { "secretsManager": { "arn": "string", "versionId": "string" }, "type": "GeneralAuthorization" } }, "payload":{ "operationName": "AWS.SendCommand", "operationVersion": "1.0", "connectorId": "exampleId", … } }
默认请求标头
默认标题字段因授权类型而异。您的连接器必须同时处理 OAuth 2.0 和通用授权请求标头。
OAuth 2.0 默认标头:
{ "header": { "auth": { "token": string, // End user's Access Token "type": "OAuth2.0" } } }
通用授权默认标头:
{ "header": { "auth": { "secretsManager": { "arn": "string", "versionId": "string" }, "type": "GeneralAuthorization" } } }
| 字段 | Required/Optional | 描述 |
|
|
是 |
C2C 连接器生成器在连接器注册期间提供的授权信息。 |
|
|
有条件 |
由第三方云提供商生成并链接到的用户的授权令牌 |
|
|
有条件 |
AWS Secrets Manager ARN 和包含授权凭证的版本 ID。通用授权是必需的,OAuth 2.0 不存在。 |
|
|
是 |
授权类型: |
注意
对您的连接器的所有请求都将包含授权信息。对于 OAuth 2.0,这包括最终用户的访问令牌。对于一般授权,这包括 AWS Secrets Manager ARN 和版本 ID。您可以假设已经建立了相应的授权。
请求有效负载
除了常用标头外,每个请求都将有一个有效负载。虽然此有效载荷对每种操作类型都有唯一的字段,但每个有效载荷都有一组默认字段,这些字段将始终存在。
请求有效载荷字段:
-
operationName:给定请求的操作,等于以下值之一:AWS.ActivateUser、AWS.SendCommand、AWS.DiscoverDevices、AWS.DeactivateUser。 -
operationVersion:每个操作都经过版本控制,以允许其随着时间的推移而演变,并为第三方连接器提供稳定的接口定义。托管集成在所有请求的有效负载中传递一个版本字段。 -
connectorId:已向其发送请求的连接器的 ID。
默认响应标头
每项ACK操作都将通过 AWS IoT Device Management 的托管集成进行响应,确认您的 C2C 连接器已收到请求并开始处理请求。
例通用响应示例
{ "header":{ "responseCode": 200 }, "payload":{ "responseMessage": “Example response!” } }
例响应标头格式
{ "header": { "responseCode": Integer } }
响应标头字段
| 字段 | Required/Optional | 评论 |
|
|
是 |
表示请求执行状态的值的枚举。 |
在本文档中描述的各种连接器接口和 API 架构中,都有一个responseMessage或Message字段。这是一个可选字段,用于 C2C 连接器 Lambda 使用与请求及其执行有关的任何上下文进行响应。最好是,任何导致状态码之外的错误都200应包含描述错误的消息值。
使用 API 响应 C2C 连接器操作请求 SendConnectorEvent
的托管集成要求 AWS IoT Device Management 您的连接器在每个 and 操作中都以异步方式运行AWS.SendCommand。AWS.DiscoverDevices这意味着对这些操作的初始响应只是 “确认” 您的 C2C 连接器已收到请求。
使用 SendConnectorEvent API,您的连接器应发送以下列表中的事件类型,用于AWS.DiscoverDevices和AWS.SendCommand操作以及主动设备事件(例如手动开启和关闭灯光)。
工作流程示例
如果您的 C2C 连接器收到DiscoverDevices请求,则托管集成 AWS IoT Device Management 预计该请求:
-
使用上面定义的响应格式同步响应
-
使用 DEVICE_DISCOVERY 事件调用
SendConnectorEventAPI
SendConnectorEventAPI 调用可以在您有权访问 C2C 连接器 AWS 账户 Lambda 凭证的任何地方进行。在 AWS IoT Device Management 的托管集成收到此事件之前,设备发现流程才会成功。
注意
或者,如有必要,SendConnectorEventAPI 调用可以在 C2C 连接器 Lambda 调用响应之前进行。但是,这种流程与软件开发的异步模型相矛盾。
SendConnectorEvent API
您的连接器调用此托管集成 AWS IoT Device Management API 来发送设备事件。仅接受 3 种类型的事件:
-
“DEVICE_DISCOVERY”-用于发送第三方云中发现的设备列表以获取特定的访问令牌
-
“DEVICE_COMMAND_RESPONSE”-用于发送作为命令执行结果的特定设备事件
-
“DEVICE_EVENT”-用于源自设备且不是基于用户的命令的直接结果的任何事件。这可以用作常规事件类型,用于主动报告设备状态变化或通知