自定义物联网端点

Custom IoT Endpoint

由于防火墙限制和需要使用静态 Ips,我们需要使用自定义 IoT 端点。 We followed this AWS doc to get our endpoint with static Ips.. From here we are attempting to call the CreateKeysAndCertificate 通过 Java。现在,当我们使用自定义域名 iot.custom.domain.name.com 和常规 Java SDK 调用 IoT 时,它工作正常。但是,每当我们尝试使用 Android SDK 并使用我们的自定义域调用 setEndpoint 时,我们都会收到以下错误

com.amazonaws.services.iot.model.ResourceNotFoundException: Not Found (Service: AWSIot; Status Code: 404; Error Code: ResourceNotFoundException

如有任何帮助或指导,我们将不胜感激。

使用Android SDK建立物联网连接时,CreateKeysAndCertificateRequest API可通过AWSIotClient class获得。如果您使用 AWSIotClient 创建新的 certs/keys,SDK 会将此请求放在通用 iot.<region>.amazonaws.com 端点上。 setEndpoint 方法只允许您更改区域。这是因为请求转到控制平面,而您创建的端点很可能在数据平面上。无法使用自定义端点上的 AWSIotClient 创建新的 certs/keys。

您可以使用另一个选项。您在 IOT 端点上放置的几乎所有“请求”都是发布到 "reserved topics". If you open up the Java SDK's PublishCreateKeysAndCertificate API 的消息,您会看到它最终是通过保留主题发布消息。您也可以使用 Android SDK 在 Android 上做类似的事情。

首先,您必须建立经过身份验证的连接。我们无法使用 CognitoCredentialsProvider,因为该身份验证请求会发送到控制平面。相反,您可以使用供应证书进行首次身份验证。这是通过 provision certificates 为供应队列生成的。您可以创建供应队列并在设备的密钥库(或 PKCS12 证书文件)中使用这些证书。使用它,您可以创建一个新的 awsIotMqttManager 对象并在用于创建新的 certs/keys 的保留主题上发布消息。您还可以订阅用于接收此请求的“接受”/“拒绝”响应的保留主题。

TL;DR

  • 使用提供证书
  • 创建awsIotMqttManager
  • 订阅主题以侦听 accepted/rejected 响应 CreateKeysAndCertificates 请求
  • 在为 CreateKeysAndCertificates
  • 保留的主题上发布消息
  • 使用响应中收到的 ownershipToken 注册事物
  • 存储新证书并将它们用于所有未来的连接(确保附加到证书的策略具有必要的权限)