Jak używać niestandardowych zasad alokacji

Niestandardowe zasady alokacji umożliwiają większą kontrolę nad przypisywaniem urządzeń do centrum IoT Hub. Jest to realizowane przy użyciu kodu niestandardowego w funkcji platformy Azure w celu przypisania urządzeń do centrum IoT. Usługa aprowizacji urządzeń wywołuje kod funkcji platformy Azure, podając wszystkie istotne informacje o urządzeniu i rejestracji. Kod funkcji jest wykonywany i zwraca informacje o centrum IoT używane do aprowizacji urządzenia.

Korzystając z niestandardowych zasad alokacji, definiujesz własne zasady alokacji, gdy zasady udostępniane przez usługę Device Provisioning Service nie spełniają wymagań danego scenariusza.

Na przykład może chcesz sprawdzić certyfikat używany przez urządzenie podczas aprowizacji i przypisać urządzenie do centrum IoT Na podstawie właściwości certyfikatu. A może masz informacje przechowywane w bazie danych dla urządzeń i musisz wysłać zapytanie do bazy danych, aby określić, do którego centrum IoT Należy przypisać urządzenie.

W tym artykule przedstawiono niestandardowe zasady alokacji przy użyciu funkcji platformy Azure napisanej w języku C#. Tworzone są dwa nowe centra IoT reprezentujące dział contoso tostery i dział pomp cieplnych Contoso. Urządzenia żądające aprowizacji muszą mieć identyfikator rejestracji z jednym z następujących sufiksów, które mają zostać zaakceptowane na potrzeby aprowizacji:

  • -contoso-tstrsd-007: Contoso Tosters Division
  • -contoso-hpsd-088: Dział pomp ciepła Firmy Contoso

Urządzenia będą aprowidowane na podstawie jednego z tych wymaganych sufiksów identyfikatora rejestracji. Te urządzenia będą symulowane przy użyciu przykładu aprowizacji dołączonego do zestawu SDK języka C usługi Azure IoT.

W tym artykule wykonasz następujące kroki:

  • Tworzenie dwóch centrów IoT działu Contoso za pomocą interfejsu wiersza polecenia platformy Azure (Contoso Tosters Division i Contoso Heat Pump Division)
  • Tworzenie nowej rejestracji grupy przy użyciu funkcji platformy Azure dla niestandardowych zasad alokacji
  • Utwórz klucze urządzeń dla dwóch symulacji urządzeń.
  • Konfigurowanie środowiska deweloperskiego dla zestawu SDK języka C usługi Azure IoT
  • Zasymuluj urządzenia i sprawdź, czy są one aprowidowane zgodnie z przykładowym kodem w niestandardowych zasadach alokacji

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure .

Wymagania wstępne

Poniższe wymagania wstępne dotyczą środowiska deweloperskiego systemu Windows. W przypadku systemu Linux lub macOS zapoznaj się z odpowiednią sekcją w temacie Przygotowywanie środowiska projektowego w dokumentacji zestawu SDK.

Tworzenie usługi aprowizacji i dwóch działów centrów IoT

W tej sekcji użyjesz usługi Azure Cloud Shell do utworzenia usługi aprowizacji i dwóch centrów IoT reprezentujących dział Contoso Tosters Division i dział Contoso Heat Pump.

Porada

Polecenia używane w tym artykule tworzą usługę aprowizacji i inne zasoby w lokalizacji Zachodnie stany USA. Zalecamy utworzenie zasobów w najbliższym regionie obsługującym usługę Device Provisioning Service. Można wyświetlić listę dostępnych lokalizacji, uruchamiając polecenie az provider show --namespace Microsoft.Devices --query "resourceTypes[?resourceType=='ProvisioningServices'].locations | [0]" --out table lub przechodząc do strony Stan platformy Azure i wyszukując usługę „Device Provisioning”. W poleceniach lokalizacje można określić w jednym słowie lub w formacie wielu wyrazów; na przykład: westus, West US, WEST US itp. W wartości nie jest uwzględniana wielkość liter. Jeśli do określenia lokalizacji używasz formatu wielu słów, ujmij wartość w cudzysłowy, na przykład -- location "West US".

  1. Użyj usługi Azure Cloud Shell, aby utworzyć grupę zasobów za pomocą polecenia az group create. Grupa zasobów platformy Azure to logiczny kontener przeznaczony do wdrażania zasobów platformy Azure i zarządzania nimi.

    Poniższy przykład tworzy grupę zasobów o nazwie contoso-us-resource-group w regionie westus . Zaleca się użycie tej grupy dla wszystkich zasobów utworzonych w tym artykule. Takie podejście ułatwi czyszczenie po zakończeniu pracy.

    az group create --name contoso-us-resource-group --location westus
    
  2. Użyj usługi Azure Cloud Shell, aby utworzyć usługę device provisioning service (DPS) za pomocą polecenia az iot dps create. Usługa aprowizacji zostanie dodana do grupy contoso-us-resource-group.

    Poniższy przykład tworzy usługę aprowizacji o nazwie contoso-provisioning-service-1098 w lokalizacji westus . Musisz użyć unikatowej nazwy usługi. Utwórz własny sufiks w nazwie usługi zamiast 1098.

    az iot dps create --name contoso-provisioning-service-1098 --resource-group contoso-us-resource-group --location westus
    

    Wykonanie tego polecenia może potrwać kilka minut.

  3. Użyj usługi Azure Cloud Shell, aby utworzyć centrum IoT Division Tosters Firmy Contoso za pomocą polecenia az iot hub create. Centrum IoT zostanie dodane do grupy contoso-us-resource-group.

    Poniższy przykład obejmuje tworzenie centrum IoT o nazwie contoso-tosters-hub-1098 w lokalizacji westus . Musisz użyć unikatowej nazwy centrum. Utwórz własny sufiks w nazwie centrum zamiast 1098.

    Przestroga

    Przykładowy kod funkcji platformy Azure dla niestandardowych zasad alokacji wymaga podciągów -toasters- w nazwie centrum. Pamiętaj, aby użyć nazwy zawierającej wymagane tostery podciąg.

    az iot hub create --name contoso-toasters-hub-1098 --resource-group contoso-us-resource-group --location westus --sku S1
    

    Wykonanie tego polecenia może potrwać kilka minut.

  4. Użyj usługi Azure Cloud Shell, aby utworzyć centrum IoT Dział pomp ciepła Contoso za pomocą polecenia az iot hub create. To centrum IoT zostanie również dodane do grupy contoso-us-resource-group.

    Poniższy przykład tworzy centrum IoT o nazwie contoso-heatpumps-hub-1098 w lokalizacji westus . Musisz użyć unikatowej nazwy centrum. Utwórz własny sufiks w nazwie centrum zamiast 1098.

    Przestroga

    Przykładowy kod funkcji platformy Azure dla niestandardowych zasad alokacji wymaga podciągów -heatpumps- w nazwie centrum. Pamiętaj, aby użyć nazwy zawierającej wymagane podciągy heatpumps.

    az iot hub create --name contoso-heatpumps-hub-1098 --resource-group contoso-us-resource-group --location westus --sku S1
    

    Wykonanie tego polecenia może potrwać kilka minut.

  5. Centra IoT muszą być połączone z zasobem usługi DPS.

    Uruchom następujące dwa polecenia, aby pobrać parametry połączenia dla właśnie utworzonych centrów. Zastąp nazwy zasobów centrum nazwami wybranymi w każdym poleceniu:

    hubToastersConnectionString=$(az iot hub connection-string show --hub-name contoso-toasters-hub-1098 --key primary --query connectionString -o tsv)
    hubHeatpumpsConnectionString=$(az iot hub connection-string show --hub-name contoso-heatpumps-hub-1098 --key primary --query connectionString -o tsv)
    

    Uruchom następujące polecenia, aby połączyć koncentratory z zasobem usługi DPS. Zastąp nazwę zasobu usługi DPS nazwą wybraną w każdym poleceniu:

    az iot dps linked-hub create --dps-name contoso-provisioning-service-1098 --resource-group contoso-us-resource-group --connection-string $hubToastersConnectionString --location westus
    az iot dps linked-hub create --dps-name contoso-provisioning-service-1098 --resource-group contoso-us-resource-group --connection-string $hubHeatpumpsConnectionString --location westus
    

Tworzenie niestandardowej funkcji alokacji

W tej sekcji utworzysz funkcję platformy Azure, która implementuje niestandardowe zasady alokacji. Ta funkcja decyduje, które działowe centrum IoT hub ma być zarejestrowane w celu ustalenia, czy jego identyfikator rejestracji zawiera ciąg -contoso-tstrsd-007 lub -contoso-hpsd-088. Ustawia również początkowy stan bliźniaczej reprezentacji urządzenia na podstawie tego, czy urządzenie jest tosterem, czy pompą cieplną.

  1. Zaloguj się w witrynie Azure Portal. Na stronie głównej wybierz pozycję + Utwórz zasób.

  2. W polu wyszukiwania Wyszukaj w witrynie Marketplace wpisz "Aplikacja funkcji". Z listy rozwijanej wybierz pozycję Aplikacja funkcji, a następnie wybierz pozycję Utwórz.

  3. Na stronie Tworzenie aplikacji funkcji na karcie Podstawy wprowadź następujące ustawienia dla nowej aplikacji funkcji i wybierz pozycję Przejrzyj i utwórz:

    Grupa zasobów: wybierz grupę contoso-us-resource-group , aby zachować wszystkie zasoby utworzone w tym artykule.

    Nazwa aplikacji funkcji: wprowadź unikatową nazwę aplikacji funkcji. W tym przykładzie użyto nazwy contoso-function-app-1098.

    Publikuj: sprawdź, czy wybrano pozycję Kod .

    Stos środowiska uruchomieniowego: wybierz pozycję .NET Core z listy rozwijanej.

    Wersja: wybierz pozycję 3.1 z listy rozwijanej.

    Region: wybierz ten sam region co grupa zasobów. W tym przykładzie użyto zachodnich stanów USA.

    Uwaga

    Domyślnie usługa Application Insights jest włączona. Usługa Application Insights nie jest niezbędna w tym artykule, ale może pomóc w zrozumieniu i zbadaniu wszelkich problemów napotkanych z alokacją niestandardową. Jeśli wolisz, możesz wyłączyć usługę Application Insights, wybierając kartę Monitorowanie , a następnie wybierając pozycję Nie w polu Włącz usługę Application Insights.

    Tworzenie aplikacji funkcji platformy Azure do hostowania niestandardowej funkcji alokacji

  4. Na stronie Podsumowanie wybierz pozycję Utwórz , aby utworzyć aplikację funkcji. Wdrożenie może potrwać kilka minut. Po zakończeniu wybierz pozycję Przejdź do zasobu.

  5. W lewym okienku strony Przegląd aplikacji funkcji kliknij pozycję Funkcje , a następnie pozycję + Dodaj , aby dodać nową funkcję.

  6. Na stronie Dodawanie funkcji kliknij pozycję Wyzwalacz HTTP, a następnie kliknij przycisk Dodaj .

  7. Na następnej stronie kliknij pozycję Kod i test. Dzięki temu można edytować kod dla funkcji o nazwie HttpTrigger1. Plik kodu run.csx należy otworzyć do edycji.

  8. Wymagane pakiety NuGet. Aby utworzyć początkową reprezentację urządzenia, funkcja alokacji niestandardowej używa klas zdefiniowanych w dwóch pakietach NuGet, które muszą zostać załadowane do środowiska hostingu. W przypadku Azure Functions pakiety NuGet są przywołyne przy użyciu pliku function.proj. W tym kroku zapiszesz i przekażesz plik function.proj dla wymaganych zestawów. Aby uzyskać więcej informacji, zobacz Using NuGet packages with Azure Functions (Używanie pakietów NuGet z Azure Functions).

    1. Skopiuj następujące wiersze do ulubionego edytora i zapisz plik na komputerze jako function.proj.

      <Project Sdk="Microsoft.NET.Sdk">  
          <PropertyGroup>  
              <TargetFramework>netstandard2.0</TargetFramework>  
          </PropertyGroup>  
          <ItemGroup>  
              <PackageReference Include="Microsoft.Azure.Devices.Provisioning.Service" Version="1.16.3" />
              <PackageReference Include="Microsoft.Azure.Devices.Shared" Version="1.27.0" />
          </ItemGroup>  
      </Project>
      
    2. Kliknij przycisk Przekaż znajdujący się nad edytorem kodu, aby przekazać plik function.proj . Po przekazaniu wybierz plik w edytorze kodu przy użyciu pola listy rozwijanej, aby zweryfikować zawartość.

  9. Upewnij się, że w edytorze kodu wybrano plik run.csx dla elementu HttpTrigger1 . Zastąp kod funkcji HttpTrigger1 następującym kodem i wybierz pozycję Zapisz:

    #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;}
    }
    

Tworzenie rejestracji

W tej sekcji utworzysz nową grupę rejestracji, która używa niestandardowych zasad alokacji. Dla uproszczenia w tym artykule użyto zaświadczania klucza symetrycznego z rejestracją. Aby uzyskać bezpieczniejsze rozwiązanie, rozważ użycie zaświadczania certyfikatów X.509 z łańcuchem zaufania.

  1. Nadal w Azure Portal otwórz usługę aprowizacji.

  2. Wybierz pozycję Zarządzaj rejestracjami w okienku po lewej stronie, a następnie wybierz przycisk Dodaj grupę rejestracji w górnej części strony.

  3. W obszarze Dodaj grupę rejestracji wprowadź następujące informacje, a następnie wybierz przycisk Zapisz .

    Nazwa grupy: wprowadź wartość contoso-custom-allocated-devices.

    Typ zaświadczania: wybierz pozycję Klucz symetryczny.

    Automatyczne generowanie kluczy: to pole wyboru powinno być już zaznaczone.

    Wybierz sposób przypisywania urządzeń do centrów: wybierz pozycję Niestandardowe (Użyj funkcji platformy Azure).

    Subskrypcja: wybierz subskrypcję, w której utworzono funkcję platformy Azure.

    Aplikacja funkcji: wybierz aplikację funkcji według nazwy. w tym przykładzie użyto nazwy contoso-function-app-1098.

    Funkcja: wybierz funkcję HttpTrigger1 .

    Dodawanie niestandardowej grupy rejestracji alokacji na potrzeby zaświadczania klucza symetrycznego

  4. Po zapisaniu rejestracji otwórz go ponownie i zanotuj klucz podstawowy. Najpierw musisz zapisać rejestrację, aby wygenerować klucze. Ten klucz będzie używany do generowania unikatowych kluczy urządzenia dla symulowanych urządzeń później.

Uzyskiwanie unikatowych kluczy urządzeń

W tej sekcji utworzysz dwa unikatowe klucze urządzenia. Jeden klucz będzie używany do symulowanego urządzenia z tosterem. Drugi klucz będzie używany do symulowanego urządzenia pompy cieplnej.

Aby wygenerować klucz urządzenia, użyj zanotowany wcześniej klucza podstawowego , aby obliczyć wartość HMAC-SHA256 identyfikatora rejestracji urządzenia dla każdego urządzenia i przekonwertować wynik na format Base64. Aby uzyskać więcej informacji na temat tworzenia pochodnych kluczy urządzeń z grupami rejestracji, zobacz sekcję rejestracje grup w temacie Zaświadczanie klucza symetrycznego.

Na przykład w tym artykule użyj następujących dwóch identyfikatorów rejestracji urządzeń i oblicz klucz urządzenia dla obu urządzeń. Oba identyfikatory rejestracji mają prawidłowy sufiks do pracy z przykładowym kodem dla niestandardowych zasad alokacji:

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

Jeśli używasz stacji roboczej z systemem Windows, możesz użyć programu PowerShell do wygenerowania pochodnego klucza urządzenia, jak pokazano w poniższym przykładzie.

Zastąp wartość KLUCZA zanotowaną wcześniej kluczem podstawowym .

$KEY='oiK77Oy7rBw8YB6IS6ukRChAw+Yq6GC61RMrPLSTiOOtdI+XDu0LmLuNm11p+qv2I+adqGUdZHm46zXAQdZoOA=='

$REG_ID1='breakroom499-contoso-tstrsd-007'
$REG_ID2='mainbuilding167-contoso-hpsd-088'

$hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha256.key = [Convert]::FromBase64String($KEY)
$sig1 = $hmacsha256.ComputeHash([Text.Encoding]::ASCII.GetBytes($REG_ID1))
$sig2 = $hmacsha256.ComputeHash([Text.Encoding]::ASCII.GetBytes($REG_ID2))
$derivedkey1 = [Convert]::ToBase64String($sig1)
$derivedkey2 = [Convert]::ToBase64String($sig2)

echo "`n`n$REG_ID1 : $derivedkey1`n$REG_ID2 : $derivedkey2`n`n"
breakroom499-contoso-tstrsd-007 : JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs=
mainbuilding167-contoso-hpsd-088 : 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg=

Symulowane urządzenia będą używać pochodnych kluczy urządzeń z każdym identyfikatorem rejestracji do przeprowadzania zaświadczania klucza symetrycznego.

Przygotowywanie środowiska deweloperskiego dla zestawu SDK języka C usługi Azure IoT

W tej sekcji przygotujesz środowisko programistyczne używane do utworzenia zestawu SDK języka C usługi Azure IoT. Zestaw SDK zawiera przykładowy kod symulowanego urządzenia. To urządzenie symulowane podejmie próbę aprowizacji podczas sekwencji rozruchu urządzenia.

Ta sekcja jest ukierunkowana na stację roboczą opartą na systemie Windows. Aby zapoznać się z przykładem systemu Linux, zobacz konfigurowanie maszyn wirtualnych w temacie Jak aprowizować obsługę wielodostępności.

  1. Pobierz system kompilacji narzędzia CMake.

    Ważne jest, aby wstępnie wymagane składniki (program Visual Studio oraz pakiet roboczy „Programowanie aplikacji klasycznych w języku C++”) były zainstalowane na tym komputerze przed uruchomieniem CMake instalacji. Gdy wymagania wstępne zostaną spełnione, a pobrane pliki zweryfikowane, zainstaluj system kompilacji CMake.

  2. Znajdź nazwę tagu najnowszej wersji zestawu SDK.

  3. Otwórz wiersz polecenia lub powłokę Git Bash. Uruchom następujące polecenia, aby sklonować najnowszą wersję repozytorium GitHub zestawu SDK języka C usługi Azure IoT . Użyj tagu znalezionego w poprzednim kroku jako wartości parametru -b :

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

    Należy się spodziewać, że ukończenie operacji potrwa kilka minut.

  4. Utwórz podkatalog cmake w katalogu głównym repozytorium Git, a następnie przejdź do tego folderu. Uruchom następujące polecenia z azure-iot-sdk-c katalogu:

    mkdir cmake
    cd cmake
    
  5. Uruchom następujące polecenie, które utworzy wersję zestawu SDK specyficzną dla platformy klienta deweloperskiego. Rozwiązanie programu Visual Studio dla symulowanego urządzenia zostanie wygenerowane w katalogu cmake.

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

    Jeśli cmake nie znajdziesz kompilatora języka C++, podczas uruchamiania polecenia mogą wystąpić błędy kompilacji. Jeśli tak się stanie, spróbuj uruchomić polecenie w wierszu polecenia programu Visual Studio.

    Gdy kompilacja zakończy się powodzeniem, kilka ostatnich wierszy danych wyjściowych będzie wyglądać podobnie do następujących danych wyjściowych:

    $ 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
    

Symulowanie urządzeń

W tej sekcji zaktualizujesz przykład aprowizacji o nazwie prov_dev_client_sample znajdujący się w skonfigurowanym wcześniej zestawie SDK języka C usługi Azure IoT.

Ten przykładowy kod symuluje sekwencję rozruchu urządzenia, która wysyła żądanie aprowizacji do wystąpienia usługi Device Provisioning Service. Sekwencja rozruchowa spowoduje rozpoznawanie i przypisywanie urządzenia tostera do centrum IoT przy użyciu niestandardowych zasad alokacji.

  1. W Azure Portal wybierz kartę Przegląd usługi Device Provisioning Service i zanotuj wartość Zakres identyfikatora.

    Wyodrębnianie informacji o punkcie końcowym usługi Device Provisioning Service z bloku portalu

  2. W programie Visual Studio otwórz plik rozwiązania azure_iot_sdks.sln wygenerowany wcześniej przez uruchomienie narzędzia CMake. Plik rozwiązania powinien znajdować się w następującej lokalizacji:

    azure-iot-sdk-c\cmake\azure_iot_sdks.sln
    
  3. W oknie Eksplorator rozwiązań programu Visual Studio przejdź do folderu Provision_Samples. Rozwiń przykładowy projekt o nazwie prov_dev_client_sample. Rozwiń węzeł Pliki źródłowe i otwórz plik prov_dev_client_sample.c.

  4. Znajdź stałą id_scope i zastąp jej wartość wcześniej skopiowaną wartością Zakres identyfikatorów.

    static const char* id_scope = "0ne00002193";
    
  5. Znajdź definicję funkcji main() w tym samym pliku. Upewnij się, że zmienna hsm_type jest ustawiona na SECURE_DEVICE_TYPE_SYMMETRIC_KEY, jak pokazano poniżej:

    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. Kliknij prawym przyciskiem myszy projekt prov_dev_client_sample i wybierz pozycję Ustaw jako projekt startowy.

Symulowanie urządzenia contoso toster

  1. Aby zasymulować urządzenie tostera, znajdź wywołanie w prov_dev_set_symmetric_key_info()pliku prov_dev_client_sample.c , które zostało skomentowane.

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

    Usuń komentarz wywołania funkcji i zastąp wartości symbolu zastępczego (w tym nawiasy kątowe) identyfikatorem rejestracji tostera i wygenerowaną wcześniej kluczem urządzenia pochodnego. Wartość klucza JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= pokazana poniżej jest podana tylko jako przykład.

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

    Zapisz plik.

  2. W menu programu Visual Studio wybierz pozycję Rozpocznij debugowanie>bez debugowania , aby uruchomić rozwiązanie. W monicie o ponowne skompilowanie projektu wybierz pozycję Tak, aby ponownie skompilować projekt przed uruchomieniem.

    Następujące dane wyjściowe to przykład pomyślnego rozruchu symulowanego urządzenia tostera i nawiązania połączenia z wystąpieniem usługi aprowizacji, które ma zostać przypisane do centrum IoT Hub tostery za pomocą niestandardowych zasad alokacji:

    Provisioning API Version: 1.3.6
    
    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:
    

Symulowanie urządzenia pompy cieplnej Firmy Contoso

  1. Aby zasymulować urządzenie pompy cieplnej, zaktualizuj wywołanie metody prov_dev_set_symmetric_key_info() w pliku prov_dev_client_sample.c ponownie przy użyciu identyfikatora rejestracji pompy cieplnej i wygenerowanego wcześniej klucza urządzenia pochodnego. Wartość klucza 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= pokazana poniżej jest również podana tylko jako przykład.

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

    Zapisz plik.

  2. W menu programu Visual Studio wybierz pozycję Rozpocznij debugowanie>bez debugowania , aby uruchomić rozwiązanie. W monicie o ponowne skompilowanie projektu wybierz pozycję Tak , aby ponownie skompilować projekt przed uruchomieniem.

    Następujące dane wyjściowe to przykład pomyślnego rozruchu symulowanego urządzenia pompy cieplnej i nawiązania połączenia z wystąpieniem usługi aprowizacji, które ma zostać przypisane do centrum IoT Hub pomp ciepła firmy Contoso przez niestandardowe zasady alokacji:

    Provisioning API Version: 1.3.6
    
    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:
    

Rozwiązywanie problemów z niestandardowymi zasadami alokacji

W poniższej tabeli przedstawiono oczekiwane scenariusze i kody błędów, które mogą zostać wyświetlone. Ta tabela ułatwia rozwiązywanie problemów z błędami niestandardowych zasad alokacji w Azure Functions.

Scenariusz Wynik rejestracji z usługi Provisioning Service Wyniki aprowizacji zestawu SDK
Element webhook zwraca wartość 200 OK z wartością "iotHubHostName" ustawioną na prawidłową nazwę hosta centrum IoT Stan wyniku: Przypisano Zestaw SDK zwraca PROV_DEVICE_RESULT_OK wraz z informacjami o centrum
Element webhook zwraca wartość 200 OK z elementem "iotHubHostName" obecnym w odpowiedzi, ale ustawiono pusty ciąg lub wartość null Stan wyniku: Niepowodzenie

Kod błędu: CustomAllocationIotHubNotSpecified (400208)
Zestaw SDK zwraca PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED
Element webhook zwraca błąd 401 Brak autoryzacji Stan wyniku: Niepowodzenie

Kod błędu: CustomAllocationUnauthorizedAccess (400209)
Zestaw SDK zwraca PROV_DEVICE_RESULT_UNAUTHORIZED
Utworzono rejestrację indywidualną w celu wyłączenia urządzenia Stan wyniku: Wyłączone Zestaw SDK zwraca PROV_DEVICE_RESULT_DISABLED
Element webhook zwraca kod >błędu = 429 Orkiestracja usługi DPS będzie ponawiana wielokrotnie. Zasady ponawiania prób są obecnie następujące:

  - Liczba ponownych prób: 10
  - Interwał początkowy: 1s
  - Przyrost: 9s
Zestaw SDK zignoruje błąd i prześle kolejny komunikat o stanie get w określonym czasie
Element webhook zwraca dowolny inny kod stanu Stan wyniku: Niepowodzenie

Kod błędu: CustomAllocationFailed (400207)
Zestaw SDK zwraca PROV_DEVICE_RESULT_DEV_AUTH_ERROR

Czyszczenie zasobów

Jeśli planujesz kontynuować pracę z zasobami utworzonymi w tym artykule, możesz je pozostawić. Jeśli nie planujesz nadal korzystać z zasobów, wykonaj następujące kroki, aby usunąć wszystkie zasoby utworzone w tym artykule, aby uniknąć niepotrzebnych opłat.

W poniższych krokach przyjęto założenie, że wszystkie zasoby w tym artykule zostały utworzone zgodnie z instrukcjami w tej samej grupie zasobów o nazwie contoso-us-resource-group.

Ważne

Usunięcie grupy zasobów jest nieodwracalne. Grupa zasobów oraz wszystkie zawarte w niej zasoby zostaną trwale usunięte. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub niewłaściwej grupy zasobów. Jeśli usługa IoT Hub została utworzona wewnątrz istniejącej grupy zasobów zawierającej zasoby, które chcesz zachować, zamiast usuwać całą grupę zasobów, usuń tylko zasób usługi IoT Hub.

Aby usunąć grupę zasobów według nazwy:

  1. Zaloguj się do witryny Azure Portal i wybierz pozycję Grupy zasobów.

  2. W polu tekstowym Filtruj według nazwy... wpisz nazwę grupy zasobów zawierającej zasoby contoso-us-resource-group.

  3. Po prawej stronie grupy zasobów na liście wyników wybierz pozycję ... a następnie pozycję Usuń grupę zasobów.

  4. Zostanie wyświetlony monit o potwierdzenie usunięcia grupy zasobów. Ponownie wpisz nazwę grupy zasobów, aby potwierdzić, a następnie wybierz pozycję Usuń. Po krótkim czasie grupa zasobów i wszystkie zawarte w niej zasoby zostaną usunięte.

Następne kroki