簡體   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