Поделиться через


Начало работы с удостоверением модуля и двойником модуля в Центре Интернета вещей (.NET)

Удостоверение и двойник модуля аналогичны удостоверению и двойнику устройства Центра Интернета вещей Azure, однако они предоставляют более высокую степень детализации. Удостоверение и двойник устройства Центра Интернета вещей позволяют серверному приложению настраивать устройство и отображать состояние устройства, а удостоверение и двойник модуля предоставляют эти возможности для отдельных компонентов устройства. На совместимых устройствах с несколькими компонентами, например устройствах с операционной системой или устройствах со встроенным ПО, удостоверения и двойники модулей позволяют изолировать конфигурацию и условия для каждого компонента.

Примечание

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и стандартных и бесплатных уровнях Центр Интернета вещей см. в статье Выбор подходящего уровня Центр Интернета вещей для решения.

По завершении работы с этой статьей у вас будет два консольных приложения .NET:

  • CreateIdentities: создание удостоверения устройства и модуля, а также соответствующего ключа безопасности для подключения устройства и клиентов модуля.

  • UpdateModuleTwinReportedProperties: отправка обновленных сообщаемых свойств двойника модуля в Центр Интернета вещей.

Примечание

Дополнительные сведения о средствах SDK, доступных для создания приложения устройства и внутреннего приложения, см. в статье Пакеты SDK для Интернета вещей Azure.

Предварительные требования

  • приведенному.

  • Центр Интернета вещей. Создайте его с помощью CLI или портал Azure.

Проверка подлинности модуля

Для проверки подлинности удостоверений модулей можно использовать симметричные ключи или сертификаты X.509. Для проверки подлинности сертификата X.509 сертификат модуля должен иметь общее имя (CN) в формате CN=<deviceid>/<moduleid>. Пример:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

Получение строки подключения центра Интернета вещей

Работая с этой статьей, вы создадите внутреннюю службу, которая сначала добавит устройство в реестр удостоверений, а затем добавит модуль на это устройство. Службе требуется разрешение на запись в реестр. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой registryReadWrite, которая предоставляет это разрешение.

Чтобы получить строку подключения Центра Интернета вещей для политики registryReadWrite, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра выберите Политики общего доступа.

  3. В списке политик выберите политику registryReadWrite.

  4. Скопируйте основную строку подключения и сохраните значение.

    Снимок экрана: получение строки подключения

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Создание удостоверения модуля

В этом разделе объясняется, как создать консольное приложение .NET, создающее удостоверение устройства и удостоверение модуля в реестре удостоверений центра. Устройства и модули не могут подключаться к центру, если в реестре удостоверений для них нет соответствующей записи. Дополнительные сведения см. в статье Общие сведения о реестре удостоверений в Центре Интернета вещей.

Запущенное консольное приложение создает уникальные идентификаторы и ключи одновременно для устройства и для модуля. Устройство и модуль применяют эти значения для своей идентификации при отправке сообщений с устройства в облако в Центр Интернета вещей. В идентификаторах учитывается регистр символов.

  1. Откройте Visual Studio и выберите элемент Создать проект.

  2. В окне Создание проекта выберите Консольное приложение (.NET Framework) .

  3. Нажмите Далее, чтобы открыть окно Настроить новый проект. Присвойте проекту имя CreateIdentities, а затем нажмите кнопку Далее.

    Снимок экрана: всплывающее окно

  4. Оставьте параметр .NET Framework по умолчанию и нажмите кнопку Создать, чтобы создать проект.

  5. В Visual Studio поочередно выберите элементы Сервис>Диспетчер пакетов NuGet>Управление пакетами NuGet для решения. Выберите вкладку Обзор.

  6. Выполните поиск пакета Microsoft.Azure.Devices. Выберите его, а затем щелкните Установить.

    Установка текущей версии пакета SDK службы .NET для Центра Интернета вещей Azure

  7. Добавьте следующие инструкции using в начало файла Program.cs :

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Common.Exceptions;
    
  8. Добавьте следующие поля в класс Program . Замените значение заполнителя строкой подключения к Центру Интернета вещей, созданному в предыдущем разделе.

    const string connectionString = "<replace_with_iothub_connection_string>";
    const string deviceID = "myFirstDevice";
    const string moduleID = "myFirstModule";
    
  9. Добавьте следующий код в класс Main.

    static void Main(string[] args)
    {
        AddDeviceAsync().Wait();
        AddModuleAsync().Wait();
    }
    
  10. Добавьте следующие методы в класс Program.

    private static async Task AddDeviceAsync()
    {
       RegistryManager registryManager = 
         RegistryManager.CreateFromConnectionString(connectionString);
       Device device;
    
       try
       {
           device = await registryManager.AddDeviceAsync(new Device(deviceID));
       }
       catch (DeviceAlreadyExistsException)
        {
            device = await registryManager.GetDeviceAsync(deviceID);
        }
    
        Console.WriteLine("Generated device key: {0}", 
          device.Authentication.SymmetricKey.PrimaryKey);
    }
    
    private static async Task AddModuleAsync()
    {
        RegistryManager registryManager = 
          RegistryManager.CreateFromConnectionString(connectionString);
        Module module;
    
        try
        {
            module = 
              await registryManager.AddModuleAsync(new Module(deviceID, moduleID));
        }
        catch (ModuleAlreadyExistsException)
        {
            module = await registryManager.GetModuleAsync(deviceID, moduleID);
        }
    
        Console.WriteLine("Generated module key: {0}", module.Authentication.SymmetricKey.PrimaryKey);
    }
    

    Метод AddDeviceAsync создает удостоверение устройства с идентификатором myFirstDevice. Если этот идентификатор устройства уже существует в реестре, этот код просто извлекает сведения о существующем устройстве. Затем приложение отображает первичный ключ для данного удостоверения. Этот ключ используется в приложении виртуального устройства для подключения к центру.

    Метод AddModuleAsync создает удостоверение модуля с идентификатором myFirstModule для устройства myFirstDevice. Если такой идентификатор модуля уже существует в реестре удостоверений, этот код просто извлекает сведения о существующем модуле. Затем приложение отображает первичный ключ для данного удостоверения. Этот ключ используется в приложении виртуального модуля для подключения к центру.

    Важно!

    Идентификатор устройства может отображаться в журналах, собранных для поддержки клиентов и устранения неполадок, поэтому не используйте конфиденциальную информацию, когда присваиваете ему имя.

  11. Запустите это приложение и запишите ключ устройства и ключ модуля.

Примечание

В реестре удостоверений в Центре Интернета вещей хранятся только удостоверения устройств и модулей, необходимые для защиты доступа к центру. Реестр удостоверений хранит идентификаторы устройств и ключи, используемые в качестве учетных данных безопасности. Реестр удостоверений также хранит флаги включения и отключения для каждого устройства. Эти флаги можно использовать для отключения доступа для этого устройства. Если в приложении необходимо хранить другие метаданные для конкретного устройства, следует использовать хранилище конкретного приложения. У вас нет возможности включать и отключать удостоверения модулей. Дополнительные сведения см. в разделе Руководство разработчика для Центра Интернета вещей.

Обновление двойника модуля с помощью пакета SDK для устройства .NET

Давайте теперь попробуем обменяться данными с облаком со своего имитированного устройства. После создания удостоверения модуля двойник модуля будет неявно создан в Центре Интернета вещей. В этом разделе вы создадите консольное приложение .NET на имитированном устройстве, которое обновляет сообщаемые свойства двойника модуля.

Чтобы получить строку подключения модуля, перейдите в Центр Интернета вещей и выберите Устройства. Найдите и выберите myFirstDevice, чтобы открыть его, а затем выберите myFirstModule, чтобы открыть уже его. В разделе Сведения об удостоверении модуля скопируйте строку подключения (первичный ключ) и сохраните ее для консольного приложения.

Снимок экрана: страница

  1. В Visual Studio добавьте в решение новый проект, поочередно выбрав элементы Файл>Создать>Проект. В окне Создать проект выберите элемент Консольное приложение (.NET Framework) и нажмите кнопку Далее.

  2. В окне настройки нового проекта присвойте проекту имя UpdateModuleTwinReportedProperties, а затем нажмите кнопку Далее.

    Снимок экрана: всплывающее окно

  3. Оставьте параметр .NET Framework по умолчанию и нажмите кнопку Создать, чтобы создать проект.

  4. В Visual Studio поочередно выберите элементы Сервис>Диспетчер пакетов NuGet>Управление пакетами NuGet для решения. Выберите вкладку Обзор.

  5. Найдите и выберите элемент Microsoft.Azure.Devices.Client. Затем нажмите кнопку Установить.

    Снимок экрана: выбран элемент Microsoft.Azure.Devices.Client и выделена кнопка

  6. Добавьте следующие инструкции using в начало файла Program.cs :

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    
  7. Добавьте следующие поля в класс Program . Замените значение заполнителя строкой подключения модуля.

    private const string ModuleConnectionString = "<Your module connection string>";
    private static ModuleClient Client = null;
    static void ConnectionStatusChangeHandler(ConnectionStatus status, 
      ConnectionStatusChangeReason reason)
    {
        Console.WriteLine("Connection Status Changed to {0}; the reason is {1}", 
          status, reason);
    }
    
  8. Добавьте метод OnDesiredPropertyChanged в класс Program:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
        {
            Console.WriteLine("desired property change:");
            Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
            Console.WriteLine("Sending current time as reported property");
            TwinCollection reportedProperties = new TwinCollection
            {
                ["DateTimeLastDesiredPropertyChangeReceived"] = DateTime.Now
            };
    
            await Client.UpdateReportedPropertiesAsync(reportedProperties).ConfigureAwait(false);
        }
    
  9. Добавьте следующие строки в метод Main:

    static void Main(string[] args)
    {
        Microsoft.Azure.Devices.Client.TransportType transport = 
          Microsoft.Azure.Devices.Client.TransportType.Amqp;
    
        try
        {
            Client = 
              ModuleClient.CreateFromConnectionString(ModuleConnectionString, transport);
            Client.SetConnectionStatusChangesHandler(ConnectionStatusChangeHandler);
            Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).Wait();
    
            Console.WriteLine("Retrieving twin");
            var twinTask = Client.GetTwinAsync();
            twinTask.Wait();
            var twin = twinTask.Result;
            Console.WriteLine(JsonConvert.SerializeObject(twin.Properties)); 
    
            Console.WriteLine("Sending app start time as reported property");
            TwinCollection reportedProperties = new TwinCollection();
            reportedProperties["DateTimeLastAppLaunch"] = DateTime.Now;
    
            Client.UpdateReportedPropertiesAsync(reportedProperties);
        }
        catch (AggregateException ex)
        {
            Console.WriteLine("Error in sample: {0}", ex);
        }
    
        Console.WriteLine("Waiting for Events.  Press enter to exit...");
        Console.ReadLine();
        Client.CloseAsync().Wait();
    }
    

    Теперь вы знаете, как извлечь двойник модуля и обновить сообщаемые свойства с помощью протокола AMQP.

  10. При желании вы можете добавить эти инструкции в метод Main, чтобы отправлять из модуля событие в центр Интернета вещей. Разместите эти строки под блоком try catch.

    Byte[] bytes = new Byte[2];
    bytes[0] = 0;
    bytes[1] = 1;
    var sendEventsTask = Client.SendEventAsync(new Message(bytes));
    sendEventsTask.Wait();
    Console.WriteLine("Event sent to IoT Hub.");
    

Запуск приложений

Теперь можно запустить приложения.

  1. В Обозревателе решений Visual Studio щелкните правой кнопкой мыши решение и выберите пункт Назначить запускаемые проекты...

  2. В разделе Общие свойства выберите элемент Запускаемый проект.

  3. Выберите элемент Несколько запускаемых проектов. Затем выберите для приложений действие Запуск и нажмите кнопку ОК, чтобы подтвердить изменения.

  4. Нажмите клавишу F5 для запуска приложения.

Дальнейшие действия

Чтобы продолжить знакомство с Центром Интернета вещей и изучить другие сценарии Интернета вещей, см. следующие ресурсы: