Руководство. Использование пользовательских политик выделения с помощью службы подготовки устройств (DPS)

Пользовательские политики выделения обеспечивают больше контроля над назначением устройств центрам Интернета вещей. С помощью пользовательских политик выделения можно определить собственные политики выделения, если политики, предоставляемые службой подготовки устройств Центр Интернета вещей Azure (DPS), не соответствуют требованиям вашего сценария. Настраиваемая политика выделения реализуется в веб-перехватчике, размещенном в Функции Azure, и настроена для одной или нескольких отдельных регистраций и (или) групп регистрации. Когда устройство регистрируется в DPS с помощью настроенной записи регистрации, DPS вызывает веб-перехватчик, чтобы узнать, в каком центре Интернета вещей должно быть зарегистрировано устройство и, при необходимости, его начальное состояние. Дополнительные сведения см. в статье "Общие сведения о пользовательских политиках выделения".

В этом руководстве демонстрируется настраиваемая политика выделения с помощью функции Azure, написанной на C#. Устройства назначаются одному из двух центров Интернета вещей, представляющих отдел тостеров Contoso и подразделение тепловых насосов Contoso. Устройства, запрашивающие подготовку, должны иметь идентификатор регистрации с одним из следующих суффиксов, чтобы они были приняты для подготовки:

  • -contoso-tstrsd-007 для отдела тостеров Contoso
  • -contoso-hpsd-088 для подразделения тепловых насосов Contoso

Устройства имитируются с помощью примера подготовки, включенного в пакет SDK для Azure IoT C.

В этом руководстве описано следующее:

  • Используйте Azure CLI для создания экземпляра DPS и создания и связывания двух центров Интернета вещей подразделения Contoso (Отдел тостеров Contoso и отдела тепловых насосов Contoso) к нему.
  • Создайте функцию Azure, реализующую настраиваемую политику выделения.
  • Создайте новую группу регистрации, используя функцию Azure для настраиваемой политики выделения.
  • Создайте симметричные ключи устройства для двух имитированных устройств.
  • Настройте среду разработки для пакета SDK для Azure IoT C.
  • Имитируйте устройства и убедитесь, что они подготовлены в соответствии с примером кода в пользовательской политике выделения.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Необходимые компоненты

Приведенные ниже предварительные требования касаются среды разработки Windows. При использовании Linux или macOS ознакомьтесь с соответствующим разделом в статье Подготовка среды разработки из документации к пакету SDK.

Создание службы подготовки и двух центров Интернета вещей

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

  1. Сначала задайте переменные среды в рабочей области, чтобы упростить команды в этом руководстве.

    Имена DPS и Центр Интернета вещей должны быть глобально уникальными. Замените значение заполнителя SUFFIX на собственное.

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

    #!/bin/bash
    export RESOURCE_GROUP="contoso-us-resource-group"
    export LOCATION="westus"
    export DPS="contoso-provisioning-service-SUFFIX"
    export TOASTER_HUB="contoso-toasters-hub-SUFFIX"
    export HEATPUMP_HUB="contoso-heatpumps-hub-SUFFIX"
    
    # PowerShell
    $env:RESOURCE_GROUP = "contoso-us-resource-group"
    $env:LOCATION = "westus"
    $env:DPS = "contoso-provisioning-service-SUFFIX"
    $env:TOASTER_HUB = "contoso-toasters-hub-SUFFIX"
    $env:HEATPUMP_HUB = "contoso-heatpumps-hub-SUFFIX"
    

    Совет

    Команды, используемые в этом руководстве, по умолчанию создают ресурсы в расположении западной части США. Рекомендуем создавать ресурсы в ближайшем для вас регионе, поддерживающем Службу подготовки устройств. Список доступных расположений можно просмотреть, перейдя на страницу состояния Azure и выполнив поиск по запросу "Служба подготовки устройств". В командах расположения можно указать в одном слове или в формате с несколькими словами; например: westus, западная часть США, западная часть США, западная часть США и т. д. Значение не учитывает регистр.

  2. Используйте команду az group create для создания группы ресурсов Azure. Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.

    В следующем примере создается группа ресурсов. Рекомендуется использовать одну группу для всех ресурсов, созданных в этом руководстве. Это поможет упростить очистку после завершения работы.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Используйте команду az iot dps create для создания экземпляра службы подготовки устройств (DPS). Служба подготовки добавляется в contoso-us-resource-group.

    az iot dps create --name $DPS --resource-group $RESOURCE_GROUP --location $LOCATION
    

    Эта команда может занять несколько минут.

  4. Используйте команду az iot hub create, чтобы создать Центр Интернета вещей отдела Тостеров Contoso. Центр Интернета вещей добавляется в группу ресурсов contoso-us..

    az iot hub create --name $TOASTER_HUB --resource-group $RESOURCE_GROUP --location $LOCATION --sku S1
    

    Эта команда может занять несколько минут.

  5. Используйте команду az iot hub create, чтобы создать Центр Интернета вещей подразделения тепловых насосов Contoso. Этот центр Интернета вещей также добавляется в contoso-us-resource-group.

    az iot hub create --name $HEATPUMP_HUB --resource-group $RESOURCE_GROUP --location $LOCATION --sku S1
    

    Эта команда может занять несколько минут.

  6. Выполните следующие две команды, чтобы получить строка подключения для созданных центров.

    az iot hub connection-string show --hub-name $TOASTER_HUB --key primary --query connectionString -o tsv
    az iot hub connection-string show --hub-name $HEATPUMP_HUB --key primary --query connectionString -o tsv
    
  7. Выполните следующие команды, чтобы связать центры с ресурсом DPS. Замените заполнители строка подключения концентратора на предыдущем шаге.

    az iot dps linked-hub create --dps-name $DPS --resource-group $RESOURCE_GROUP --location $LOCATION --connection-string <toaster_hub_connection_string>
    az iot dps linked-hub create --dps-name $DPS --resource-group $RESOURCE_GROUP --location $LOCATION --connection-string <heatpump_hub_connection_string>
    

Создание пользовательской функции выделения

В этом разделе вы создадите функцию Azure, которая реализует пользовательскую политику выделения. Эта функция определяет, в каком подразделении центра Интернета вещей должно быть зарегистрировано устройство, исходя из того, какую строку содержит идентификатор регистрации этого устройства: -contoso-tstrsd-007 или -contoso-hpsd-088. Она также задает начальное состояние двойника устройства в зависимости от того, является устройство тостером или тепловым насосом.

  1. Войдите на портал Azure.

  2. В поле поиска найдите и выберите приложение-функцию.

  3. Выберите "Создать или создать приложение-функцию".

  4. На странице создания приложения-функции на вкладке "Основные сведения" введите следующие параметры для нового приложения-функции и выберите "Просмотр и создание".

    Параметр Значение
    Подписка Убедитесь, что выбрана подписка, в которой вы создали ресурсы для этого руководства.
    Группа ресурсов Выберите группу ресурсов, созданную при работе с предыдущим разделом. Значение по умолчанию, предоставленное в предыдущем разделе, — contoso-us-resource-group.
    Имя приложения-функции Укажите имя приложения-функции.
    Вы хотите развернуть код или образ контейнера? Код
    Стек времени выполнения .NET
    Версия Выберите любую версию модели в процессе.
    Регион Выберите ближайший регион.

    Примечание.

    По умолчанию служба Application Insights активирована. Приложение Аналитика не требуется для этого руководства, но это может помочь вам понять и изучить проблемы, возникающие при выделении пользовательских данных. При желании Application Insights можно отключить. Для этого на вкладке Мониторинг выберите Нет для параметра Включить Application Insights.

    Снимок экрана: форма создания приложения-функции в портал Azure.

  5. На вкладке "Просмотр и создание" нажмите кнопку "Создать ", чтобы создать приложение-функцию.

  6. Развертывание может занять несколько минут. По завершении выберите Перейдите к ресурсу.

  7. На левой панели страницы обзора приложения-функции выберите "Создать функцию".

    Снимок экрана: выбор параметра для создания функции в портал Azure.

  8. На странице "Создать функцию" выберите шаблон триггераHTTP и нажмите кнопку "Далее".

  9. На вкладке "Сведения о шаблоне" выберите "Анонимный" в качестве уровня авторизации и нажмите кнопку "Создать".

    Снимок экрана: настройка уровня авторизации как анонимного.

    Совет

    Если вы сохраняете уровень авторизации как функцию, необходимо настроить регистрации DPS с помощью ключа API функции. Дополнительные сведения см. в разделе Функции Azure триггера HTTP.

  10. Когда откроется функция HttpTrigger1, выберите "Код и тест" на левой панели. Это позволяет изменять код для функции. Файл кода run.csx должен быть открыт для редактирования.

  11. Укажите необходимые пакеты NuGet. Чтобы создать первоначальный двойник устройства, функция пользовательского выделения использует классы, определенные в двух пакетах NuGet, которые нужно загрузить в среду внешнего размещения. Вы можете указать пакеты NuGet с помощью Функций Azure, используя файл function.proj. На этом шаге вы сохраняете и отправляете файл function.proj для необходимых сборок. Дополнительные сведения см. в разделе об использовании пакетов NuGet с Функциями Azure.

    1. Скопируйте следующие строки в нужный текстовый редактор и сохраните файл на своем компьютере как function.proj.

      <Project Sdk="Microsoft.NET.Sdk">  
          <PropertyGroup>  
              <TargetFramework>netstandard2.0</TargetFramework>  
          </PropertyGroup>  
          <ItemGroup>  
              <PackageReference Include="Microsoft.Azure.Devices.Provisioning.Service" Version="1.18.1" />
              <PackageReference Include="Microsoft.Azure.Devices.Shared" Version="1.30.1" />
          </ItemGroup>  
      </Project>
      
    2. Нажмите кнопку "Отправить", расположенную над редактором кода, чтобы отправить файл function.proj. После отправки выберите файл в редакторе кода с помощью раскрывающегося списка, чтобы проверить содержимое.

    3. Выберите файл function.proj в редакторе кода и проверьте его содержимое. Если файл function.proj пуст, скопируйте строки выше в файл и сохраните его. (Иногда отправка создает файл без отправки содержимого.)

  12. Убедитесь, что в редакторе кода для HttpTrigger1 выбран файл run.csx. Замените код функции HttpTrigger1 приведенным ниже кодом и нажмите Сохранить:

    #r "Newtonsoft.Json"
    
    using System.Net;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Newtonsoft.Json;
    
    using Microsoft.Azure.Devices.Shared;               // For TwinCollection
    using Microsoft.Azure.Devices.Provisioning.Service; // For TwinState
    
    public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        // Get request body
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
    
        log.LogInformation("Request.Body:...");
        log.LogInformation(requestBody);
    
        // Get registration ID of the device
        string regId = data?.deviceRuntimeContext?.registrationId;
    
        string message = "Uncaught error";
        bool fail = false;
        ResponseObj obj = new ResponseObj();
    
        if (regId == null)
        {
            message = "Registration ID not provided for the device.";
            log.LogInformation("Registration ID : NULL");
            fail = true;
        }
        else
        {
            string[] hubs = data?.linkedHubs?.ToObject<string[]>();
    
            // Must have hubs selected on the enrollment
            if (hubs == null)
            {
                message = "No hub group defined for the enrollment.";
                log.LogInformation("linkedHubs : NULL");
                fail = true;
            }
            else
            {
                // This is a Contoso Toaster Model 007
                if (regId.Contains("-contoso-tstrsd-007"))
                {
                    //Find the "-toasters-" IoT hub configured on the enrollment
                    foreach(string hubString in hubs)
                    {
                        if (hubString.Contains("-toasters-"))
                            obj.iotHubHostName = hubString;
                    }
    
                    if (obj.iotHubHostName == null)
                    {
                        message = "No toasters hub found for the enrollment.";
                        log.LogInformation(message);
                        fail = true;
                    }
                    else
                    {
                        // Specify the initial tags for the device.
                        TwinCollection tags = new TwinCollection();
                        tags["deviceType"] = "toaster";
    
                        // Specify the initial desired properties for the device.
                        TwinCollection properties = new TwinCollection();
                        properties["state"] = "ready";
                        properties["darknessSetting"] = "medium";
    
                        // Add the initial twin state to the response.
                        TwinState twinState = new TwinState(tags, properties);
                        obj.initialTwin = twinState;
                    }
                }
                // This is a Contoso Heat pump Model 008
                else if (regId.Contains("-contoso-hpsd-088"))
                {
                    //Find the "-heatpumps-" IoT hub configured on the enrollment
                    foreach(string hubString in hubs)
                    {
                        if (hubString.Contains("-heatpumps-"))
                            obj.iotHubHostName = hubString;
                    }
    
                    if (obj.iotHubHostName == null)
                    {
                        message = "No heat pumps hub found for the enrollment.";
                        log.LogInformation(message);
                        fail = true;
                    }
                    else
                    {
                        // Specify the initial tags for the device.
                        TwinCollection tags = new TwinCollection();
                        tags["deviceType"] = "heatpump";
    
                        // Specify the initial desired properties for the device.
                        TwinCollection properties = new TwinCollection();
                        properties["state"] = "on";
                        properties["temperatureSetting"] = "65";
    
                        // Add the initial twin state to the response.
                        TwinState twinState = new TwinState(tags, properties);
                        obj.initialTwin = twinState;
                    }
                }
                // Unrecognized device.
                else
                {
                    fail = true;
                    message = "Unrecognized device registration.";
                    log.LogInformation("Unknown device registration");
                }
            }
        }
    
        log.LogInformation("\nResponse");
        log.LogInformation((obj.iotHubHostName != null) ? JsonConvert.SerializeObject(obj) : message);
    
        return (fail)
            ? new BadRequestObjectResult(message) 
            : (ActionResult)new OkObjectResult(obj);
    }
    
    public class ResponseObj
    {
        public string iotHubHostName {get; set;}
        public TwinState initialTwin {get; set;}
    }
    

Создание регистрации

В этом разделе вы создадите новую группу регистрации, которая использует настраиваемую политику выделения. Для простоты в этом руководстве используется аттестация симметричного ключа с регистрацией. В качестве более безопасного решения рекомендуется использовать аттестацию сертификатов X.509 с цепочкой доверия.

  1. Войдите на портал Azure и перейдите к своему экземпляру службы подготовки устройств.

  2. Выберите "Управление регистрацией" в разделе Параметры меню навигации.

  3. Выберите " Добавить группу регистрации".

  4. На вкладке "Регистрация и подготовка" на странице "Добавление группы регистрации" укажите следующие сведения, чтобы настроить сведения о группе регистрации:

    Поле Description
    Аттестации Выберите симметричный ключ в качестве механизма аттестации.
    Параметры симметричного ключа Установите флажок "Создать симметричные ключи" автоматически.
    Имя группы Введите contoso-custom-allocated-devices в качестве имени группы.
    Состояние подготовки Установите флажок "Включить эту регистрацию".
  5. Нажмите кнопку Далее: Центры Интернета вещей.

  6. На вкладке Центров Интернета вещей на странице "Добавление группы регистрации" укажите следующие сведения, чтобы определить, для каких центров Интернета вещей группа регистрации может подготавливать устройства:

    Поле Description
    Целевые центры Интернета вещей Выберите один или несколько связанных центров Интернета вещей или добавьте новую ссылку на Центр Интернета вещей.
    Политика выделения Выберите custom (use Azure Function). Выберите функцию Azure, а затем следуйте инструкциям, чтобы выбрать функцию, созданную для этого руководства.
  7. Выберите Review + create (Просмотреть и создать).

  8. На вкладке "Просмотр и создание " проверьте все значения и нажмите кнопку "Создать".

После сохранения регистрации снова откройте его и запишите первичный ключ. Для формирования ключей необходимо сначала сохранить регистрацию. Этот ключ используется для создания уникальных ключей устройств для имитированных устройств в следующем разделе.

Получение производных уникальных ключей

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

Чтобы получить ключ устройства, используйте первичный ключ группы регистрации, который вы указали ранее, для вычисления идентификатора регистрации устройства HMAC-SHA256 для каждого устройства и преобразования результата в формат Base 64. Дополнительные сведения о создании производных ключей устройств с группами регистраций см. в разделе о регистрации групп в статье Аттестация симметричного ключа.

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

  • breakroom499-contoso-tstrsd-007
  • mainbuilding167-contoso-hpsd-088

Расширение Интернета вещей для Azure CLI предоставляет команду iot dps enrollment-group compute-device-key для создания производных ключей устройств. Эту команду можно использовать в системах с ОС Windows или Linux с помощью PowerShell или оболочки Bash.

Замените значение аргумента --key значением первичного ключа из группы регистрации.

az iot dps enrollment-group compute-device-key --key <ENROLLMENT_GROUP_KEY> --registration-id breakroom499-contoso-tstrsd-007
az iot dps compute-device-key --key <ENROLLMENT_GROUP_KEY> --registration-id mainbuilding167-contoso-hpsd-088

Примечание.

Вы также можете указать идентификатор группы регистрации, а не симметричный ключ для iot dps enrollment-group compute-device-key команды. Например:

az iot dps enrollment-group compute-device-key -g contoso-us-resource-group --dps-name contoso-provisioning-service-1098 --enrollment-id contoso-custom-allocated-devices --registration-id breakroom499-contoso-tstrsd-007

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

Подготовка среды разработки для пакета SDK Azure IoT для C

В этом разделе описано, как подготовить среду разработки, которая используется для сборки пакета SDK Azure IoT для C. В пакет SDK входит пример кода для имитированного устройства. Для этого имитированного устройства будет выполнена попытка подготовки во время последовательности загрузки.

В этом разделе описывается использование рабочей станции Windows. Пример Linux см. в руководстве по настройке виртуальных машин в руководстве. Подготовка к гео задержке.

  1. Скачайте систему сборки CMake.

    Перед установкой CMake важно установить на компьютер необходимые компоненты Visual Studio (Visual Studio и рабочую нагрузку "Разработка классических приложений на C++"). После установки компонентов и проверки загрузки установите систему сборки CMake.

  2. Найдите имя тега для последнего выпуска пакета SDK.

  3. Откройте командную строку или оболочку Git Bash. Выполните следующие команды, чтобы клонировать последний выпуск пакета SDK для устройств Интернета вещей Azure для репозитория GitHub. Используйте тег, найденный на предыдущем шаге, в качестве значения параметра-b, например: lts_01_2023

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    Выполнение этой операции может занять несколько минут.

  4. Создайте подкаталог cmake в корневом каталоге репозитория Git и перейдите в эту папку. В каталоге azure-iot-sdk-c выполните следующие команды:

    mkdir cmake
    cd cmake
    
  5. Выполните приведенную ниже команду, чтобы создать версию пакета SDK для используемой клиентской платформы разработки. Эта команда также создает решение Visual Studio для имитированного устройства в каталоге cmake.

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    

    Если cmake компилятор C++ не обнаружен, при выполнении команды могут возникнуть ошибки сборки. В этом случае попробуйте, выполнить эту команду в командной строке Visual Studio.

    После успешного создания последние несколько строк выходных данных выглядят следующим образом:

    $ cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    -- Building for: Visual Studio 15 2017
    -- Selecting Windows SDK version 10.0.16299.0 to target Windows 10.0.17134.
    -- The C compiler identification is MSVC 19.12.25835.0
    -- The CXX compiler identification is MSVC 19.12.25835.0
    
    ...
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: E:/IoT Testing/azure-iot-sdk-c/cmake
    

Имитация устройств

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

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

  1. На портале Azure выберите вкладку Обзор службы подготовки устройств и запишите значение области идентификатора.

    Извлеките сведения о конечной точке службы подготовки устройств из колонки на портале

  2. В Visual Studio откройте файл решения azure_iot_sdks.sln, который был создан ранее в результате запуска CMake. Файл решения должен находиться в следующем расположении: azure-iot-sdk-c\cmake\azure_iot_sdks.sln

  3. В окне Обозреватель решений Visual Studio перейдите в папку Provision_Samples. Разверните пример проекта с именем prov_dev_client_sample. Разверните исходные файлы и откройте prov_dev_client_sample.c.

  4. Найдите константу id_scope и замените ее значение ранее скопированным значением области идентификатора.

    static const char* id_scope = "0ne00002193";
    
  5. Найдите определение функции main() в том же файле. Проверьте, чтобы переменной hsm_type было задано значение SECURE_DEVICE_TYPE_SYMMETRIC_KEY, как показано ниже.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  6. В функции main() найдите вызов Prov_Device_Register_Device(). Непосредственно перед этим вызовом добавьте следующие строки кода, которые используются в Prov_Device_Set_Provisioning_Payload() для передачи пользовательских полезных данных JSON во время подготовки. Их можно использовать для предоставления дополнительной информации вашим пользовательским функциям распределения. Их также можно использовать для передачи типа устройства вместо проверки идентификатора регистрации. Дополнительные сведения об отправке и получении полезных данных с помощью DPS см. в статье Передача полезных данных между устройствами и службой DPS.

    // An example custom payload
    const char* custom_json_payload = "{\"MyDeviceFirmwareVersion\":\"12.0.2.5\",\"MyDeviceProvisioningVersion\":\"1.0.0.0\"}";
    
    prov_device_result = Prov_Device_Set_Provisioning_Payload(prov_device_handle, custom_json_payload);
    if (prov_device_result != PROV_DEVICE_RESULT_OK)
    {
        (void)printf("\r\nFailure setting provisioning payload: %s\r\n", MU_ENUM_TO_STRING(PROV_DEVICE_RESULT, prov_device_result));
    }
    
  7. Щелкните правой кнопкой мыши проект prov_dev_client_sample и выберите "Задать в качестве запускаемого проекта".

Имитация устройства toaster Contoso

  1. Чтобы имитировать устройство тостера, найдите вызов prov_dev_set_symmetric_key_info() в prov_dev_client_sample.c , который закомментирован.

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    Раскомментируйте вызов функции и замените значения заполнителей (включая угловые скобки) идентификатором регистрации тостера и производным ключом устройства, который был создан ранее. Значение ключа JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs=, показанное ниже, приведено только в качестве примера.

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("breakroom499-contoso-tstrsd-007", "JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs=");
    

    Сохраните файл.

  2. В меню Visual Studio выберите Отладка>Запуск без отладки, чтобы запустить решение. При появлении запроса перестроить проект щелкните Да, чтобы перестроить его перед запуском.

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

    Provisioning API Version: 1.8.0
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-toasters-hub-1098.azure-devices.net, deviceId: breakroom499-contoso-tstrsd-007
    
    Press enter key to exit:
    

    Ниже приведен пример выходных данных ведения журнала из кода пользовательской функции выделения, работающего для устройства тостера. Обратите внимание, что для тостера успешно выбран центр. Также обратите внимание на payload свойство, содержащее пользовательское содержимое JSON, которое вы добавили в код. Благодаря этому код можно использовать в deviceRuntimeContext.

    Эти данные журнала можно просмотреть, щелкнув Журналы в коде функции на портале.

    2022-08-03T20:34:41.178 [Information] Executing 'Functions.HttpTrigger1' (Reason='This function was programmatically called via the host APIs.', Id=12950752-6d75-4f41-844b-c253a6653d4f)
    2022-08-03T20:34:41.340 [Information] C# HTTP trigger function processed a request.
    2022-08-03T20:34:41.341 [Information] Request.Body:...
    2022-08-03T20:34:41.341 [Information] {"enrollmentGroup":{"enrollmentGroupId":"contoso-custom-allocated-devices","attestation":{"type":"symmetricKey"},"capabilities":{"iotEdge":false},"etag":"\"0000f176-0000-0700-0000-62eaad1e0000\"","provisioningStatus":"enabled","reprovisionPolicy":{"updateHubAssignment":true,"migrateDeviceData":true},"createdDateTimeUtc":"2022-08-03T17:15:10.8464255Z","lastUpdatedDateTimeUtc":"2022-08-03T17:15:10.8464255Z","allocationPolicy":"custom","iotHubs":["contoso-toasters-hub-1098.azure-devices.net","contoso-heatpumps-hub-1098.azure-devices.net"],"customAllocationDefinition":{"webhookUrl":"https://contoso-function-app-1098.azurewebsites.net/api/HttpTrigger1?****","apiVersion":"2021-10-01"}},"deviceRuntimeContext":{"registrationId":"breakroom499-contoso-tstrsd-007","currentIotHubHostName":"contoso-toasters-hub-1098.azure-devices.net","currentDeviceId":"breakroom499-contoso-tstrsd-007","symmetricKey":{},"payload":{"MyDeviceFirmwareVersion":"12.0.2.5","MyDeviceProvisioningVersion":"1.0.0.0"}},"linkedHubs":["contoso-toasters-hub-1098.azure-devices.net","contoso-heatpumps-hub-1098.azure-devices.net"]}
    2022-08-03T20:34:41.382 [Information] Response
    2022-08-03T20:34:41.398 [Information] {"iotHubHostName":"contoso-toasters-hub-1098.azure-devices.net","initialTwin":{"properties":{"desired":{"state":"ready","darknessSetting":"medium"}},"tags":{"deviceType":"toaster"}}}
    2022-08-03T20:34:41.399 [Information] Executed 'Functions.HttpTrigger1' (Succeeded, Id=12950752-6d75-4f41-844b-c253a6653d4f, Duration=227ms)
    

Имитация устройства heat pump Contoso

  1. Чтобы имитировать устройство теплового насоса, обновите вызов prov_dev_set_symmetric_key_info()в prov_dev_client_sample.c с помощью идентификатора регистрации теплового насоса и производного ключа устройства, созданного ранее. Значение ключа 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg=, показанное ниже, приведено только в качестве примера.

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("mainbuilding167-contoso-hpsd-088", "6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg=");
    

    Сохраните файл.

  2. В меню Visual Studio выберите Отладка>Запуск без отладки, чтобы запустить решение. При появлении запроса перестроить проект щелкните Да, чтобы перестроить его перед запуском.

    Следующий результат является примером успешной загрузки имитированного устройства heat pump и его подключения к экземпляру службы подготовки для назначения центру Интернета вещей отдела тепловых насосов с помощью пользовательской политики выделения.

    Provisioning API Version: 1.8.0
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-heatpumps-hub-1098.azure-devices.net, deviceId: mainbuilding167-contoso-hpsd-088
    
    Press enter key to exit:
    

Устранение неполадок пользовательских политик выделения

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

Сценарий Результат регистрации из службы подготовки Результаты пакета SDK для подготовки
Веб-перехватчик возвращает ответ "200 ОК" со свойством iotHubHostName, которому присвоено допустимое имя узла Центра Интернета вещей Состояние результата: "Назначено" Пакет SDK возвращает PROV_DEVICE_RESULT_OK, а также сведения о центре
Веб-перехватчик возвращает ответ "200 ОК" со свойством iotHubHostName, но его значение является пустой строкой или NULL Состояние результата: "Сбой"

Код ошибки: CustomAllocationIotHubNotSpecified (400208)
Пакет SDK возвращает PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED
Веб-перехватчик возвращает ответ "401 — недостаточно прав" Состояние результата: "Сбой"

Код ошибки: CustomAllocationUnauthorizedAccess (400209)
Пакет SDK возвращает PROV_DEVICE_RESULT_UNAUTHORIZED
Была создана индивидуальная регистрация для отключения устройства Состояние результата: "Отключено" Пакет SDK возвращает PROV_DEVICE_RESULT_DISABLED
Веб-перехватчик возвращает код >ошибки = 429 Оркестрация DPS повторится несколько раз. Текущее состояние политики повтора:

   счетчик попыток: 10;
  - Начальный интервал: 1 с
  - Приращение: 9 с
Пакет SDK пропустит ошибку и отправит еще одно сообщение для получения состояния в указанное время.
Веб-перехватчик возвращает любой другой код состояния Состояние результата: "Сбой"

Код ошибки: CustomAllocationFailed (400207)
Пакет SDK возвращает PROV_DEVICE_RESULT_DEV_AUTH_ERROR

Очистка ресурсов

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

В этом руководстве предполагается, что вы создали все ресурсы в этом руководстве, как описано в той же группе ресурсов с именем contoso-us-resource-group.

Внимание

Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все содержащиеся в ней ресурсы удаляются без возможности восстановления. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали Центр Интернета вещей в группе ресурсов, содержащей ресурсы, которые нужно сохранить, удалите только ресурс Центра Интернета вещей, не удаляя всю группу ресурсов.

Удаление группы ресурсов по имени.

  1. Войдите в портал Azure и выберитеГруппы ресурсов.

  2. Введите в текстовое поле Фильтровать по имени... имя вашей группы ресурсов: contoso-us-resource-group.

  3. Справа от своей группы ресурсов в списке результатов щелкните ..., а затем выберите Удалить группу ресурсов.

  4. Вам будет предложено подтвердить операцию удаления группы ресурсов. Снова введите имя группы ресурсов, которую необходимо удалить, и щелкните Удалить. Через некоторое время группа ресурсов и все ее ресурсы будут удалены.

Следующие шаги

Дополнительные сведения о пользовательских политиках выделения см. в статье