繁体   English   中英

批量制作 Azure IoT 中心设备标识时出错

[英]Error while making Azure IoT Hub Device Identities in bulk

我正在关注https://learn.microsoft.com/en-us/azure/iot-hub/iot-hub-bulk-identity-mgmt在 Azure IoT 中心批量上传设备标识。 此处给出的所有代码都在 C# 中,因此我将其转换为等效的 JAVA。

使用导入设备示例 - 批量设备配置我得到以下 json-

{"id":"d3d78b0d-6c8c-4ef5-a321-91fbb6a4b7d1","importMode":"create","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"f8/UZcYbhPxnNdbSl2J+0Q==","secondaryKey":"lbq4Y4Z8qWmfUxAQjRsDjw=="}}}
{"id":"70bbe407-8d65-4f57-936f-ef402aa66d07","importMode":"create","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"9e7fDNIFbMu/NmOfxo/vGg==","secondaryKey":"nwFiKR4HV9KYHzkeyu8nLA=="}}}

要从 function 之后的 blob 导入文件,调用 -

CompletableFuture<JobProperties> importJob = registryManager
    .importDevicesAsync(inURI, outURI);

在上面的代码中,我们需要为 URI 提供 SAS 代码,为此获取容器 SAS URI等效代码如下 -

static String GetContainerSasUri(CloudBlobContainer container) {
    SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
    sasConstraints.setSharedAccessExpiryTime(new Date(new Date().getTime() + TimeUnit.DAYS.toMillis(1)));
    sasConstraints.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.WRITE,
            SharedAccessBlobPermissions.LIST, SharedAccessBlobPermissions.DELETE));

    BlobContainerPermissions permissions = new BlobContainerPermissions();
    permissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);
    permissions.getSharedAccessPolicies().put("testpolicy", sasConstraints);
    try {
        container.uploadPermissions(permissions);
    } catch (StorageException e1) {
        e1.printStackTrace();
    }
    String sasContainerToken = null;
    try {
        sasContainerToken = container.generateSharedAccessSignature(sasConstraints, "testpolicy");
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (StorageException e) {
        e.printStackTrace();
    }
    System.out.println("URI " + container.getUri() +"?"+ sasContainerToken);
    return container.getUri() + "?" + sasContainerToken;
}

现在问题来了。 对于 output 容器,我收到以下错误-

java.util.concurrent.ExecutionException: com.microsoft.azure.sdk.iot.service.exceptions.IotHubBadFormatException: Bad message format! ErrorCode:BlobContainerValidationError;Unauthorized to write to output blob container. Tracking ID:2dcb2efbf1e14e33ba60dc8415dc03c3-G:4-TimeStamp:11/08/2017 16:16:10

请帮助我知道为什么我收到Bad Message Format错误? SAS 密钥生成代码是否存在问题,或者我的 blob 容器没有写入权限?

您使用的是服务级还是帐户级SAS? 引发的错误表明该服务未获得授权或具有写入指定Blob容器的委派权限。 在此处查看有关如何设置帐户级别SAS以及如何委派对Blob容器进行读取,写入和删除操作的资源。 https://docs.microsoft.com/zh-cn/rest/api/storageservices/Delegating-Access-with-a-Shared-Access-Signature?redirectedfrom=MSDN “内容摘录:”帐户级SAS,随版本2015-04-05。 帐户SAS委派对一项或多项存储服务中的资源的访问。 通过服务SAS可用的所有操作也可以通过帐户SAS进行。 此外,使用帐户SAS,您可以委派对适用于给定服务的操作的访问权限,例如“获取/设置服务属性”和“获取服务状态”。 您还可以委派对服务SAS不允许的Blob容器,表,队列和文件共享的读取,写入和删除操作的访问权限。 有关帐户SAS的更多信息,请参阅构建帐户SAS。”

我在使用私有存储帐户作为导入/输出容器时遇到了同样的问题。

在我开始使用公共存储帐户后,它工作顺利。 无论如何,即使使用私人存储帐户也应该可以使用。 所以,我提出了一个问题。 有关更多信息,您可以参考此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM