Självstudie: Använda anpassade allokeringsprinciper med Device Provisioning Service (DPS)

Anpassade allokeringsprinciper ger dig mer kontroll över hur enheter tilldelas till dina IoT-hubbar. Med anpassade allokeringsprinciper kan du definiera dina egna allokeringsprinciper när principerna som tillhandahålls av Azure IoT Hub Device Provisioning Service (DPS) inte uppfyller kraven i ditt scenario. En anpassad allokeringsprincip implementeras i en webhook som finns i Azure Functions och konfigureras för en eller flera enskilda registreringar och/eller registreringsgrupper. När en enhet registreras med DPS med hjälp av en konfigurerad registreringspost anropar DPS webhooken för att ta reda på vilken IoT-hubb som enheten ska registreras till och eventuellt dess ursprungliga tillstånd. Mer information finns i Förstå anpassade allokeringsprinciper.

Den här självstudien visar en anpassad allokeringsprincip med hjälp av en Azure-funktion som skrivits i C#. Enheter tilldelas till en av två IoT-hubbar som representerar en Contoso Toasters Division och en Contoso Heat Pumps Division. Enheter som begär etablering måste ha ett registrerings-ID med något av följande suffix som ska accepteras för etablering:

  • -contoso-tstrsd-007 för Contoso Toasters Division
  • -contoso-hpsd-088 för Contoso Heat Pumps Division

Enheter simuleras med hjälp av ett etableringsexempel som ingår i Azure IoT C SDK.

I den här självstudien gör du följande:

  • Använd Azure CLI för att skapa en DPS-instans och för att skapa och länka två Contoso-divisionens IoT-hubbar (Contoso Toasters Division och Contoso Heat Pumps Division) till den.
  • Skapa en Azure-funktion som implementerar den anpassade allokeringsprincipen.
  • Skapa en ny registreringsgrupp använder Azure-funktionen för den anpassade allokeringsprincipen.
  • Skapa enhetssymmetriska nycklar för två simulerade enheter.
  • Konfigurera utvecklingsmiljön för Azure IoT C SDK.
  • Simulera enheterna och kontrollera att de har etablerats enligt exempelkoden i den anpassade allokeringsprincipen.

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

Följande krav gäller för en Windows-utvecklingsmiljö. För Linux eller macOS, se lämpligt avsnitt i Förbereda utvecklingsmiljön i SDK-dokumentationen.

Skapa etableringstjänsten och två IoT-hubbar

I det här avsnittet använder du Azure Cloud Shell för att skapa en etableringstjänst och två IoT-hubbar som representerar Contoso Toasters Division och Contoso Heat Pumps-divisionen.

  1. Börja med att ange miljövariabler på arbetsytan för att förenkla kommandona i den här självstudien.

    DPS- och IoT Hub-namnen måste vara globalt unika. SUFFIX Ersätt platshållaren med ditt eget värde.

    Den Azure-funktionskod som du skapar senare i den här självstudien letar också efter IoT-hubbar som har antingen -toasters- eller -heatpumps- i deras namn. Om du ändrar de föreslagna värdena ska du använda namn som innehåller de nödvändiga delsträngarna.

    #!/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"
    

    Dricks

    Kommandona som används i den här självstudien skapar resurser på platsen USA, västra som standard. Vi rekommenderar att du skapar dina resurser i den region närmast dig som stöder Device Provisioning Service. Du kan visa en lista över tillgängliga platser genom att gå till sidan Azure-status och söka efter "Device Provisioning Service". I kommandon kan platser anges antingen i ett ord- eller flerordsformat. till exempel: westus, USA, västra, USA, VÄSTRA osv. Värdet är inte skiftlägeskänsligt.

  2. Använd kommandot az group create för att skapa en Azure-resursgrupp. En Azure-resursgrupp är en logisk container där Azure-resurser distribueras och hanteras.

    I följande exempel skapas en resursgrupp. Vi rekommenderar att du använder en enda grupp för alla resurser som skapats i den här självstudien. Den här metoden gör rensningen enklare när du är klar.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Använd kommandot az iot dps create för att skapa en instans av Device Provisioning Service (DPS). Etableringstjänsten läggs till i contoso-us-resource-group.

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

    Det kan ta några minuter att slutföra det här kommandot.

  4. Använd kommandot az iot hub create för att skapa Contoso Toasters Division IoT Hub. IoT-hubben läggs till i gruppen contoso-us-resource-group.

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

    Det kan ta några minuter att slutföra det här kommandot.

  5. Använd kommandot az iot hub create för att skapa Contoso Heat Pumps Division IoT Hub. Den här IoT-hubben läggs också till i contoso-us-resource-group.

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

    Det kan ta några minuter att slutföra det här kommandot.

  6. Kör följande två kommandon för att hämta anslutningssträng för de hubbar som du skapade.

    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. Kör följande kommandon för att länka hubbarna till DPS-resursen. Ersätt platshållarna med hubbens anslutningssträng från föregående steg.

    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>
    

Skapa den anpassade allokeringsfunktionen

I det här avsnittet skapar du en Azure-funktion som implementerar din anpassade allokeringsprincip. Den här funktionen bestämmer vilken divisionell IoT-hubb som en enhet ska registreras till baserat på om dess registrerings-ID innehåller strängen -contoso-tstrsd-007 eller -contoso-hpsd-088. Den anger också enhetstvillingens ursprungliga tillstånd baserat på om enheten är en brödrost eller en värmepump.

  1. Logga in på Azure-portalen.

  2. I sökrutan söker du efter och väljer Funktionsapp.

  3. Välj Skapa eller skapa funktionsapp.

  4. På sidan Skapa funktionsapp går du till fliken Grundläggande inställningar och anger följande inställningar för den nya funktionsappen och väljer Granska + skapa:

    Parameter Värde
    Abonnemang Kontrollera att den prenumeration där du skapade resurserna för den här självstudien har valts.
    Resursgrupp Välj den resursgrupp som du skapade i föregående avsnitt. Standardvärdet som anges i föregående avsnitt är contoso-us-resource-group.
    Funktionsappens namn Ange ett namn för funktionsappen.
    Vill du distribuera kod eller containeravbildning? Code
    Körningsstack .NET
    Version: Välj valfri processmodellversion .
    Region Välj en region nära dig.

    Kommentar

    Som standard är Application Insights aktiverat. Application Insights är inte nödvändigt för den här självstudien, men det kan hjälpa dig att förstå och undersöka eventuella problem som uppstår med den anpassade allokeringen. Om du vill kan du inaktivera Application Insights genom att välja fliken Övervakning och sedan välja Nej för Aktivera Application Insights.

    Skärmbild som visar formuläret Skapa funktionsapp i Azure-portalen.

  5. På fliken Granska + skapa väljer du Skapa för att skapa funktionsappen.

  6. Distributionen kan ta flera minuter. När den är klar väljer du Gå till resurs.

  7. I den vänstra rutan på funktionsappens översiktssida väljer du Skapa funktion.

    Skärmbild som visar hur du väljer alternativet för att skapa funktionen i Azure-portalen.

  8. På sidan Skapa funktion väljer du mallen HTTP-utlösare och väljer sedan Nästa.

  9. På fliken Mallinformation väljer du Anonym som auktoriseringsnivå och väljer sedan Skapa.

    Skärmbild som visar hur du ställer in auktoriseringsnivån som anonym.

    Dricks

    Om du behåller auktoriseringsnivån som funktion måste du konfigurera dina DPS-registreringar med funktions-API-nyckeln. Mer information finns i HTTP-utlösare för Azure Functions.

  10. När funktionen HttpTrigger1 öppnas väljer du Kod + Test i den vänstra rutan. På så sätt kan du redigera koden för funktionen. Run.csx-kodfilen bör öppnas för redigering.

  11. Referens till nödvändiga NuGet-paket. För att skapa den första enhetstvillingen använder den anpassade allokeringsfunktionen klasser som definieras i två NuGet-paket som måste läsas in i värdmiljön. Med Azure Functions refereras NuGet-paket med hjälp av en function.proj-fil . I det här steget sparar och laddar du upp en function.proj-fil för de nödvändiga sammansättningarna. Mer information finns i Använda NuGet-paket med Azure Functions.

    1. Kopiera följande rader till din favoritredigerare och spara filen på datorn som 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. Välj knappen Ladda upp ovanför kodredigeraren för att ladda upp filen function.proj. När du har laddat upp väljer du filen i kodredigeraren med hjälp av listrutan för att verifiera innehållet.

    3. Välj filen function.proj i kodredigeraren och verifiera innehållet. Om filen function.proj är tom kopierar du raderna ovan till filen och sparar den. (Ibland skapar uppladdningen filen utan att ladda upp innehållet.)

  12. Kontrollera att run.csx för HttpTrigger1 är markerat i kodredigeraren. Ersätt koden för funktionen HttpTrigger1 med följande kod och välj Spara:

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

Skapa registreringen

I det här avsnittet skapar du en ny registreringsgrupp som använder den anpassade allokeringsprincipen. För enkelhetens skull använder den här självstudien symmetrisk nyckelattestering med registreringen. För en säkrare lösning bör du överväga att använda X.509-certifikatattestering med en förtroendekedja.

  1. Logga in på Azure-portalen och gå till instansen av enhetsetableringstjänsten.

  2. Välj Hantera registreringar i avsnittet Inställningar i navigeringsmenyn.

  3. Välj Lägg till registreringsgrupp.

  4. På fliken Registrering + etableringsidan Lägg till registreringsgrupp anger du följande information för att konfigurera information om registreringsgruppen:

    Fält beskrivning
    Intyg Välj Symmetrisk nyckel som attesteringsmekanism.
    Inställningar för symmetrisk nyckel Markera rutan Generera symmetriska nycklar automatiskt.
    Gruppnamn Ange contoso-custom-allocated-devices som gruppnamn.
    Etableringsstatus Markera kryssrutan Aktivera den här registreringen .
  5. Välj Nästa: IoT-hubbar.

  6. På fliken IoT-hubbarsidan Lägg till registreringsgrupp anger du följande information för att avgöra vilka IoT-hubbar som registreringsgruppen kan etablera enheter till:

    Fält beskrivning
    IoT-målhubbar Välj en eller flera av dina länkade IoT-hubbar eller lägg till en ny länk till en IoT-hubb.
    Allokeringsprincip Välj Anpassad (använd Azure-funktion). Välj Välj Azure-funktion och följ sedan anvisningarna för att välja den funktion som du skapade för den här självstudien.
  7. Välj Granska + skapa.

  8. På fliken Granska + skapa kontrollerar du alla dina värden och väljer sedan Skapa.

När du har sparat registreringen öppnar du den igen och antecknar primärnyckeln. Du måste spara registreringen först för att nycklarna ska genereras. Den här nyckeln används för att generera unika enhetsnycklar för simulerade enheter i nästa avsnitt.

Härled unika enhetsnycklar

Enheter använder inte registreringsgruppens primära symmetriska nyckel direkt. I stället använder du primärnyckeln för att härleda en enhetsnyckel för varje enhet. I det här avsnittet skapar du två unika enhetsnycklar. En nyckel används för en simulerad brödrostenhet. Den andra nyckeln används för en simulerad värmepumpsenhet.

För att härleda enhetsnyckeln använder du registreringsgruppen Primärnyckel som du antecknade tidigare för att beräkna HMAC-SHA256 för enhetsregistrerings-ID:t för varje enhet och konvertera resultatet till Base 64-format. Mer information om hur du skapar härledda enhetsnycklar med registreringsgrupper finns i avsnittet gruppregistreringar i Symmetrisk nyckelattestering.

I exemplet i den här självstudien använder du följande två enhetsregistrerings-ID:n och beräknar en enhetsnyckel för båda enheterna. Båda registrerings-ID:na har ett giltigt suffix som fungerar med exempelkoden för den anpassade allokeringsprincipen:

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

IoT-tillägget för Azure CLI tillhandahåller iot dps enrollment-group compute-device-key kommandot för att generera härledda enhetsnycklar. Det här kommandot kan användas på Windows- eller Linux-system, från PowerShell eller ett Bash-gränssnitt.

Ersätt värdet för --key argumentet med primärnyckeln från din registreringsgrupp.

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

Kommentar

Du kan också ange registreringsgrupp-ID:t i stället för den symmetriska nyckeln till iot dps enrollment-group compute-device-key kommandot. Till exempel:

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

De simulerade enheterna använder de härledda enhetsnycklarna med varje registrerings-ID för att utföra symmetrisk nyckelattestering.

Förbereda en utvecklingsmiljö för Azure IoT C SDK

I det här avsnittet förbereder du utvecklingsmiljön som används för att skapa Azure IoT C SDK. SDK innehåller exempelkoden för den simulerade enheten. Den här simulerade enheten försöker etablera under enhetens startsekvens.

Det här avsnittet är inriktat på en Windows-baserad arbetsstation. Ett Linux-exempel finns i konfigurationen av de virtuella datorerna i Självstudie: Etablera för geo-svarstid.

  1. Ladda ned CMake-byggsystemet.

    Det är viktigt att Visual Studio-kraven (Visual Studio och arbetsbelastningen Skrivbordsutveckling med C++) installeras på datorn innan installationen startas CMake . När förutsättningarna är uppfyllda och nedladdningen har verifierats installerar du CMake-byggesystemet.

  2. Leta reda på taggnamnet för den senaste versionen av SDK:t.

  3. Öppna en kommandotolk eller Git Bash-gränssnittet. Kör följande kommandon för att klona den senaste versionen av Azure IoT Device SDK för C GitHub-lagringsplatsen. Använd taggen som du hittade i föregående steg som värde för parametern -b , till exempel: 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
    

    Den här åtgärden kan förväntas ta flera minuter att slutföra.

  4. Skapa en cmake-underkatalog i rotkatalogen på git-lagringsplatsen och navigera till den mappen. Kör följande kommandon från azure-iot-sdk-c katalogen:

    mkdir cmake
    cd cmake
    
  5. Kör följande kommando som skapar en version av SDK:t som är specifik för plattformen för din utvecklingsklient. En Visual Studio-lösning för den simulerade enheten genereras i cmake-katalogen.

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

    Om cmake du inte hittar C++-kompilatorn kan det uppstå byggfel när du kör kommandot. Om det händer kan du prova att köra kommandot i Visual Studio-kommandotolken.

    När bygget har slutförts ser de sista utdataraderna ut ungefär som följande utdata:

    $ 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
    

Simulera enheterna

I det här avsnittet uppdaterar du ett etableringsexempel med namnet prov_dev_client_sample som finns i Azure IoT C SDK som du konfigurerade tidigare.

Den här exempelkoden simulerar en enhetsstartsekvens som skickar etableringsbegäran till enhetsetableringstjänstens instans. Startsekvensen gör att brödrosten identifieras och tilldelas till IoT-hubben med hjälp av den anpassade allokeringsprincipen.

  1. I Azure-portalen väljer du fliken Översikt för enhetsetableringstjänsten och noterar värdet för ID-omfång .

    Extrahera information om enhetsetableringstjänstens slutpunkt från bladet på portalen

  2. I Visual Studio öppnar du den azure_iot_sdks.sln lösningsfil som genererades genom att köra CMake tidigare. Lösningsfilen ska finnas på följande plats: azure-iot-sdk-c\cmake\azure_iot_sdks.sln.

  3. I Fönstret Solution Explorer i Visual Studio går du till mappen Provision_Samples. Expandera exempelprojektet med namnet prov_dev_client_sample. Expandera Källfiler och öppna prov_dev_client_sample.c.

  4. Hitta konstanten id_scope och ersätt värdet med ditt värde för ID-omfång som du kopierade tidigare.

    static const char* id_scope = "0ne00002193";
    
  5. Hitta definitionen för funktionen main() i samma fil. Kontrollera att variabeln hsm_type är inställd på SECURE_DEVICE_TYPE_SYMMETRIC_KEY enligt nedan:

    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() Leta reda på anropet till Prov_Device_Register_Device()i funktionen . Precis innan anropet lägger du till följande kodrader som används Prov_Device_Set_Provisioning_Payload() för att skicka en anpassad JSON-nyttolast under etableringen. Detta kan användas för att ge mer information till dina anpassade allokeringsfunktioner. Detta kan också användas för att skicka enhetstypen i stället för att undersöka registrerings-ID:t. Mer information om hur du skickar och tar emot anpassade datanyttolaster med DPS finns i Så här överför du nyttolaster mellan enheter och 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. Högerklicka på projektet prov_dev_client_sample och välj Ange som startprojekt.

Simulera Contoso-brödrostenheten

  1. Om du vill simulera popup-enheten letar du reda på anropet till prov_dev_set_symmetric_key_info() i prov_dev_client_sample.c som har kommenterats ut.

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

    Avkommentera funktionsanropet och ersätt platshållarvärdena (inklusive vinkelparenteserna) med registrerings-ID:t för brödrosten och den härledda enhetsnyckeln som du genererade tidigare. Nyckelvärdet JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= som visas nedan ges endast som ett exempel.

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

    Spara filen.

  2. I Visual Studio-menyn väljer du Felsökning>Starta utan felsökning för att köra lösningen. I kommandotolken för att återskapa projektet väljer du Ja, för att återskapa projektet innan du kör det.

    Följande utdata är ett exempel på den simulerade popup-enheten som startar upp och ansluter till etableringstjänstinstansen som ska tilldelas till IoT-hubben för brödrostar av den anpassade allokeringsprincipen:

    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:
    

    Följande utdata är exempelloggningsutdata från den anpassade allokeringsfunktionskoden som körs för popup-enheten. Observera att en hubb har valts för en popup-enhet. Observera även egenskapen payload som innehåller det anpassade JSON-innehållet som du lade till i koden. Det här är tillgängligt för din kod att använda i deviceRuntimeContext.

    Loggningen är tillgänglig genom att klicka på Loggar under funktionskoden i portalen:

    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)
    

Simulera Contosos värmepumpenhet

  1. För att simulera värmepumpenheten uppdaterar du anropet till prov_dev_set_symmetric_key_info() i prov_dev_client_sample.c igen med registrerings-ID:t för värmepumpen och den härledda enhetsnyckeln som du genererade tidigare. Nyckelvärdet 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= som visas nedan ges också endast som exempel.

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

    Spara filen.

  2. I Visual Studio-menyn väljer du Felsökning>Starta utan felsökning för att köra lösningen. I kommandotolken för att återskapa projektet väljer du Ja för att återskapa projektet innan du kör det.

    Följande utdata är ett exempel på den simulerade värmepumpenheten som startar och ansluter till etableringstjänstinstansen som ska tilldelas contosos värmepumps-IoT-hubb av den anpassade allokeringsprincipen:

    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:
    

Felsöka anpassade allokeringsprinciper

I följande tabell visas förväntade scenarier och de resultatfelkoder som du kan få. Använd den här tabellen för att felsöka fel med anpassade allokeringsprinciper med dina Azure Functions.

Scenario Registreringsresultat från etableringstjänsten Etablerings-SDK-resultat
Webhooken returnerar 200 OK med "iotHubHostName" inställt på ett giltigt IoT Hub-värdnamn Resultatstatus: Tilldelad SDK returnerar PROV_DEVICE_RESULT_OK tillsammans med hubbinformation
Webhooken returnerar 200 OK med "iotHubHostName" i svaret, men inställd på en tom sträng eller null Resultatstatus: Det gick inte

Felkod: CustomAllocationIotHubNotSpecified (400208)
SDK returnerar PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED
Webhooken returnerar 401 Obehörig Resultatstatus: Det gick inte

Felkod: CustomAllocationUnauthorizedAccess (400209)
SDK returnerar PROV_DEVICE_RESULT_UNAUTHORIZED
En enskild registrering skapades för att inaktivera enheten Resultatstatus: Inaktiverad SDK returnerar PROV_DEVICE_RESULT_DISABLED
Webhooken returnerar felkoden >= 429 DPS orkestrering försöker igen flera gånger. Återförsöksprincipen är för närvarande:

  – Antal återförsök: 10
  - Inledande intervall: 1 s
  - Inkrement: 9 s
SDK ignorerar felet och skickar ett nytt get-statusmeddelande under den angivna tiden
Webhooken returnerar all annan statuskod Resultatstatus: Det gick inte

Felkod: CustomAllocationFailed (400207)
SDK returnerar PROV_DEVICE_RESULT_DEV_AUTH_ERROR

Rensa resurser

Om du planerar att fortsätta arbeta med de resurser som skapats i den här självstudien kan du lämna dem. Om du inte planerar att fortsätta använda resurserna använder du följande steg för att ta bort alla resurser som skapats i den här självstudien för att undvika onödiga avgifter.

Stegen här förutsätter att du har skapat alla resurser i den här självstudien enligt instruktionerna i samma resursgrupp med namnet contoso-us-resource-group.

Viktigt!

Att ta bort en resursgrupp kan inte ångras. Resursgruppen och alla resurser som ingår i den tas bort permanent. Var noga så att du inte tar bort fel resursgrupp eller resurser av misstag. Om du har skapat IoT Hub:en inuti en befintlig resursgrupp som innehåller resurser som du vill behålla, ta bara bort själva IoT Hub-resursen i stället för att ta bort resursgruppen.

Så här tar du bort resursgruppen efter namn:

  1. Logga in på Azure Portal och välj Resursgrupper.

  2. I textrutan Filtrera efter namn... skriver du namnet på resursgruppen som innehåller dina resurser, contoso-us-resource-group.

  3. Till höger om resursgruppen i resultatlistan väljer du ... och sedan Ta bort resursgrupp.

  4. Du uppmanas att bekräfta borttagningen av resursgruppen. Skriv namnet på resursgruppen igen för att bekräfta och välj sedan Ta bort. Efter en liten stund tas resursgruppen och resurser som finns i den bort.

Nästa steg

Mer information om anpassade allokeringsprinciper finns i