Массовый импорт регистрационного устройства на Azure iot Hub с помощью C # не работает? - PullRequest
0 голосов
/ 05 января 2019

Я взял код массового импорта из github msdn link но используя тот же код в консоли и в веб-приложении, он не может зарегистрировать новые устройства в iot hub.

это создание списка устройств в BLOB-файле, но почему он не может успешно выполнить задание импорта? я тоже не получаю никаких исключений.

class Program
    {
        static RegistryManager registryManager;

        static string connectionString = "iothub-connectionstring";

        static void Main(string[] args)
        {

            BulkImport();

        }

        static string GetContainerSasUri(CloudBlobContainer container)
        {
            // Set the expiry time and permissions for the container.
            // In this case no start time is specified, so the
            // shared access signature becomes valid immediately.
            var sasConstraints = new SharedAccessBlobPolicy();
            sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
            sasConstraints.Permissions =
              SharedAccessBlobPermissions.Write |
              SharedAccessBlobPermissions.Read |
              SharedAccessBlobPermissions.Delete;

            // Generate the shared access signature on the container,
            // setting the constraints directly on the signature.
            string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

            // Return the URI string for the container,
            // including the SAS token.
            return container.Uri + sasContainerToken;
        }

        private static async Task BulkImport()
        {
            try
            {
                registryManager = RegistryManager.CreateFromConnectionString(connectionString);

                StorageCredentials storageCredentials = new StorageCredentials("storeage-name", "storage-key");
                CloudStorageAccount storageAccount = new CloudStorageAccount(storageCredentials, useHttps: true);
                // Create a blob client.
                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

                CloudBlobContainer container = blobClient.GetContainerReference("bulkiothubimport");
                CloudBlockBlob blob = container.GetBlockBlobReference("devices.txt");

                var containerSasUri = GetContainerSasUri(container);

                // Provision 1,000 more devices
                var serializedDevices = new List<string>();

                for (var i = 0; i < 5; i++)
                {
                    // Create a new ExportImportDevice
                    // CryptoKeyGenerator is in the Microsoft.Azure.Devices.Common namespace
                    var deviceToAdd = new ExportImportDevice()
                    {
                        Id = i+"mydevicenew",
                        Status = DeviceStatus.Enabled,
                        Authentication = new AuthenticationMechanism()
                        {
                            SymmetricKey = new SymmetricKey()
                            {
                                PrimaryKey = CryptoKeyGenerator.GenerateKey(32),
                                SecondaryKey = CryptoKeyGenerator.GenerateKey(32)
                            }
                        },
                        ImportMode = ImportMode.Create
                    };

                    // Add device to the list
                    serializedDevices.Add(JsonConvert.SerializeObject(deviceToAdd));
                }

                // Write the list to the blob
                var sb = new StringBuilder();
                serializedDevices.ForEach(serializedDevice => sb.AppendLine(serializedDevice));
                //await blob.DeleteIfExistsAsync();

                using (CloudBlobStream stream = await blob.OpenWriteAsync())
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString());
                    for (var i = 0; i < bytes.Length; i += 500)
                    {
                        int length = Math.Min(bytes.Length - i, 500);
                        await stream.WriteAsync(bytes, i, length);
                    }
                }

                // Call import using the blob to add new devices
                // Log information related to the job is written to the same container
                // This normally takes 1 minute per 100 devices
                JobProperties importJob =
                   await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);

                // Wait until job is finished
                while (true)
                {
                    importJob = await registryManager.GetJobAsync(importJob.JobId);
                    if (importJob.Status == JobStatus.Completed ||
                        importJob.Status == JobStatus.Failed ||
                        importJob.Status == JobStatus.Cancelled)
                    {
                        // Job has finished executing
                        break;
                    }

                    await Task.Delay(TimeSpan.FromSeconds(5));
                }


            }
            catch (Exception ex)
            {
                throw ex;
            }           

        }



    }

Ответы [ 2 ]

0 голосов
/ 06 января 2019

В основе метода устройств массового импорта - вызовы API REST к конечной точке, ориентированной на службу Azure IoT Hub. С помощью метода registryManager.ImportDevicesAsync можно создать фоновое задание в пространстве имен концентратора IoT Azure. Когда задание принято, для его статуса обработки опроса возвращается идентификатор задания.

По сути, нам нужны два REST API, такие как POST и GET. Более подробную информацию можно найти в doc Service - Создать задание импорта-экспорта и Service - Получить задание импорта-экспорта .

Следующие шаги показывают, как протестировать это задание массового импорта устройств с помощью API REST:

  1. Используйте самую последнюю версию Microsoft Azure Storage Explorer для создания двух контейнеров, таких как один для ввода и другой для вывода сообщений журнала. Кроме того, этот инструмент позволяет генерировать полный адрес URI с токеном SAS для этих контейнеров.

  2. Создайте текстовый файл с именем devices.txt и содержит следующее (пример для подготовки двух устройств):

    {"id":"Device1",  "importMode":"Create", "status":"enabled", "properties":{"desired":{"abcd":12345 } } }
    {"id":"Device2",  "importMode":"Create", "status":"enabled", "properties":{"desired":{"abcd":12345 } } }
    
  3. Загрузить файл devices.txt в контейнер input .

  4. POST задание для концентратора IoT Azure

    POST https://{yourIoTHub}.azure-devices.net/jobs/create?api-version=2018-06-30
    Authorization:{yourIoTHubSasToken}
    body: 
    {
      "inputBlobContainerUri": "{inputContainerUriWithSasToken}",
      "outputBlobContainerUri": "{outputContainerUriWithSasToken}",
      "inputBlobName": "devices.txt",
      "type": "import"
    }
    

    ответ должен быть:

    {
         "jobId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
         "startTimeUtc": "2019-01-06T16:19:54.9535051Z",
         "type": "import",
         "status": "enqueued",
         "progress": 0,
         "inputBlobContainerUri":  "xxxxxx",
         "outputBlobContainerUri": "xxxxxx",
         "excludeKeysInExport": false,
         "useSecondaryStorageAsSource": false
     }
    
  5. Опрос статуса задания до тех пор, пока задание не будет завершено или не выполнено или отменено

    GET https://{yourIoTHub}.azure-devices.net/jobs/xxxxx-xxxx-xxxx-xxxxxxxxxxxx?api-version=2018-06-30
    Authorization:{yourIoTHubSasToken}
    

    ответ:

    {
      "jobId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "startTimeUtc": "2019-01-06T16:19:54.9535051Z",
      "endTimeUtc": "2019-01-06T16:20:11.4043137Z",
      "type": "import",
      "status": "completed",
      "progress": 100,
      "outputBlobContainerUri": "",
      "excludeKeysInExport": false,
      "useSecondaryStorageAsSource": false
    }
    

Обратите внимание, что вышеуказанные шаги 4. и 5. могут быть реализованы с использованием функций Azure, чтобы скрыть все детали, связанные с хранилищем и iot-концентратором.

0 голосов
/ 06 января 2019

Я думаю, что вы наблюдаете это поведение, потому что ваш BulkImport не ожидается, то есть, когда код впервые достигает await внутри метода, код возвращается к методу Main и завершает приложение.

Попробуйте изменить значение возврата Main на Task (см. Async main ) вместо void, а затем await вызов на BulkImport:

static async Task Main(string[] args)
{
    await BulkImport();
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...