Zelfstudie: Aangepast toewijzingsbeleid gebruiken met Device Provisioning Service (DPS)

Met aangepast toewijzingsbeleid hebt u meer controle over hoe apparaten worden toegewezen aan uw IoT-hubs. Met aangepast toewijzingsbeleid kunt u uw eigen toewijzingsbeleid definiëren wanneer het beleid van azure IoT Hub Device Provisioning Service (DPS) niet voldoet aan de vereisten van uw scenario. Een aangepast toewijzingsbeleid wordt geïmplementeerd in een webhook die wordt gehost in Azure Functions en geconfigureerd voor een of meer afzonderlijke inschrijvings- en/of inschrijvingsgroepen. Wanneer een apparaat zich registreert bij DPS met behulp van een geconfigureerde inschrijvingsvermelding, roept DPS de webhook aan om erachter te komen bij welke IoT-hub het apparaat moet worden geregistreerd en, optioneel, de oorspronkelijke status. Zie Aangepast toewijzingsbeleid begrijpen voor meer informatie.

In deze zelfstudie ziet u een aangepast toewijzingsbeleid met behulp van een Azure-functie die is geschreven in C#. Apparaten worden toegewezen aan een van de twee IoT-hubs die een Contoso-broodroosterdivisie en een Contoso-warmtepompendivisie vertegenwoordigen. Apparaten die inrichting aanvragen, moeten een registratie-id hebben met een van de volgende achtervoegsels die moeten worden geaccepteerd voor inrichting:

  • -contoso-tstrsd-007 voor de afdeling Contoso Broodroosters
  • -contoso-hpsd-088 voor de Contoso Heat Pumps Division

Apparaten worden gesimuleerd met behulp van een inrichtingsvoorbeeld dat is opgenomen in de Azure IoT C SDK.

In deze zelfstudie gaat u het volgende doen:

  • Gebruik de Azure CLI om een DPS-exemplaar te maken en om twee IoT-hubs (Contoso Broodroosters Division en Contoso Heat Pumps Division) te maken en te koppelen.
  • Maak een Azure-functie waarmee het aangepaste toewijzingsbeleid wordt geïmplementeerd.
  • Maak een nieuwe inschrijvingsgroep die gebruikmaakt van de Azure-functie voor het aangepaste toewijzingsbeleid.
  • Maak symmetrische apparaatsleutels voor twee gesimuleerde apparaten.
  • Stel de ontwikkelomgeving in voor de Azure IoT C SDK.
  • Simuleer de apparaten en controleer of ze zijn ingericht volgens de voorbeeldcode in het aangepaste toewijzingsbeleid.

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Vereisten

De volgende vereisten gelden voor een ontwikkelomgeving in Windows. Voor Linux of macOS raadpleegt u het desbetreffende gedeelte in Uw ontwikkelomgeving voorbereiden in de SDK-documentatie.

De inrichtingsservice en twee IoT-hubs maken

In deze sectie gebruikt u De Azure Cloud Shell om een inrichtingsservice en twee IoT-hubs te maken die de afdeling Contoso Broodroosters en de afdeling Contoso Heat Pumps vertegenwoordigen.

  1. Stel eerst omgevingsvariabelen in uw werkruimte in om de opdrachten in deze zelfstudie te vereenvoudigen.

    De DPS- en IoT Hub-namen moeten wereldwijd uniek zijn. Vervang de SUFFIX tijdelijke aanduiding door uw eigen waarde.

    De Azure Function-code die u verderop in deze zelfstudie maakt, zoekt ook naar IoT-hubs met een -toasters- of -heatpumps- meer namen. Als u de voorgestelde waarden wijzigt, moet u namen gebruiken die de vereiste subtekenreeksen bevatten.

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

    Tip

    De opdrachten die in deze zelfstudie worden gebruikt, maken standaard resources op de locatie VS - west. U wordt aangeraden uw resources te maken in de regio die het dichtst bij u in de buurt is die Device Provisioning Service ondersteunt. U kunt een lijst met beschikbare locaties weergeven door naar de azure-statuspagina te gaan en te zoeken naar Device Provisioning Service. In opdrachten kunnen locaties worden opgegeven in één woord- of meerdere woordennotatie; bijvoorbeeld: westus, VS - west, VS - west, VS - west, enzovoort. De waarde is niet hoofdlettergevoelig.

  2. Gebruik de opdracht az group create om een Azure-resourcegroep te maken. Een Azure-resourcegroep is een logische container waarin Azure-resources worden geïmplementeerd en beheerd.

    In het volgende voorbeeld wordt een resourcegroep gemaakt. U wordt aangeraden één groep te gebruiken voor alle resources die in deze zelfstudie zijn gemaakt. Met deze methode kunt u gemakkelijker opschonen nadat u klaar bent.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Gebruik de opdracht az iot dps create om een exemplaar van Device Provisioning Service (DPS) te maken. De inrichtingsservice wordt toegevoegd aan contoso-us-resource-group.

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

    Het kan enkele minuten duren voordat deze opdracht is voltooid.

  4. Gebruik de opdracht az iot hub create om de IoT-hub Contoso Broodroosters Division te maken. De IoT-hub wordt toegevoegd aan contoso-us-resource-group.

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

    Het kan enkele minuten duren voordat deze opdracht is voltooid.

  5. Gebruik de opdracht az iot hub create om de IoT-hub Contoso Heat Pumps Division te maken. Deze IoT-hub wordt ook toegevoegd aan contoso-us-resource-group.

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

    Het kan enkele minuten duren voordat deze opdracht is voltooid.

  6. Voer de volgende twee opdrachten uit om de verbindingsreeks s op te halen voor de hubs die u hebt gemaakt.

    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. Voer de volgende opdrachten uit om de hubs te koppelen aan de DPS-resource. Vervang de tijdelijke aanduidingen door de hub-verbindingsreeks s uit de vorige stap.

    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>
    

De functie voor aangepaste toewijzing maken

In deze sectie maakt u een Azure-functie waarmee u uw aangepaste toewijzingsbeleid implementeert. Met deze functie wordt bepaald aan welke ioT-hub een apparaat moet worden verdeeld op basis van of de registratie-id de tekenreeks -contoso-tstrsd-007 of -contoso-hpsd-088 bevat. Het stelt ook de initiële status van de apparaatdubbel in op basis van of het apparaat een broodrooster of een warmtepomp is.

  1. Meld u aan bij het Azure-portaal.

  2. Zoek en selecteer functie-app in het zoekvak.

  3. Selecteer Functie-app maken of maken.

  4. Voer op de pagina Voor het maken van de functie-app op het tabblad Basis de volgende instellingen in voor uw nieuwe functie-app en selecteer Beoordelen en maken:

    Parameter Weergegeven als
    Abonnement Zorg ervoor dat het abonnement waarin u de resources voor deze zelfstudie hebt gemaakt, is geselecteerd.
    Resourcegroep Selecteer de resourcegroep die u in de vorige sectie hebt gemaakt. De standaardwaarde in de vorige sectie is contoso-us-resource-group.
    Naam van de functie-app Geef een naam op voor uw functie-app.
    Wilt u code of containerinstallatiekopieën implementeren? Code
    Runtimestack .NET
    Versie Selecteer een modelversie in proces.
    Regio Selecteer een regio bij u in de buurt.

    Notitie

    Application Insights is standaard ingeschakeld. Application Insights is niet nodig voor deze zelfstudie, maar kan u helpen bij het begrijpen en onderzoeken van eventuele problemen die u ondervindt met de aangepaste toewijzing. Als u wilt, kunt u Application Insights uitschakelen door het tabblad Controle te selecteren en vervolgens Nee voor Application Insights inschakelen.

    Schermopname van het formulier Functie-app maken in Azure Portal.

  5. Selecteer Op het tabblad Beoordelen en maken de optie Maken om de functie-app te maken.

  6. De implementatie kan enkele minuten duren. Wanneer de implementatie is voltooid, selecteert u Ga naar resource.

  7. Selecteer in het linkerdeelvenster van de pagina Overzicht van de functie-app de optie Functie Maken.

    Schermopname van het selecteren van de optie voor het maken van een functie in Azure Portal.

  8. Selecteer op de pagina Functie maken de SJABLOON HTTP-trigger en selecteer vervolgens Volgende.

  9. Selecteer Anoniem op het tabblad Sjabloondetails als autorisatieniveau en selecteer Vervolgens Maken.

    Schermopname van het instellen van het autorisatieniveau als anoniem.

    Tip

    Als u het autorisatieniveau als functie behoudt, moet u uw DPS-inschrijvingen configureren met de functie-API-sleutel. Zie de HTTP-trigger van Azure Functions voor meer informatie.

  10. Wanneer de functie HttpTrigger1 wordt geopend, selecteert u Code + Test in het linkerdeelvenster. Hiermee kunt u de code voor de functie bewerken. Het codebestand run.csx moet worden geopend voor bewerking.

  11. Verwijzing naar vereiste NuGet-pakketten. Voor het maken van de eerste apparaatdubbel gebruikt de aangepaste toewijzingsfunctie klassen die zijn gedefinieerd in twee NuGet-pakketten die moeten worden geladen in de hostingomgeving. Met Azure Functions wordt naar NuGet-pakketten verwezen met behulp van een function.proj-bestand . In deze stap slaat u een function.proj-bestand op en uploadt u dit voor de vereiste assembly's. Zie NuGet-pakketten gebruiken met Azure Functions voor meer informatie.

    1. Kopieer de volgende regels naar uw favoriete editor en sla het bestand op uw computer op als 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. Selecteer de knop Uploaden boven de code-editor om uw function.proj-bestand te uploaden. Nadat u het hebt geüpload, selecteert u het bestand in de code-editor met behulp van de vervolgkeuzelijst om de inhoud te controleren.

    3. Selecteer het bestand function.proj in de code-editor en controleer de inhoud ervan. Als het bestand function.proj leeg is, kopieert u de bovenstaande regels naar het bestand en slaat u het op. (Soms wordt het bestand gemaakt zonder de inhoud te uploaden.)

  12. Zorg ervoor dat run.csx voor HttpTrigger1 is geselecteerd in de code-editor. Vervang de code voor de functie HttpTrigger1 door de volgende code en selecteer Opslaan:

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

De registratie maken

In deze sectie maakt u een nieuwe inschrijvingsgroep die gebruikmaakt van het aangepaste toewijzingsbeleid. Voor het gemak maakt deze zelfstudie gebruik van Attestation voor symmetrische sleutels bij de inschrijving. Voor een veiligere oplossing kunt u gebruikmaken van de verklaring met het X.509-certificaat met een vertrouwensketen.

  1. Meld u aan bij Azure Portal en navigeer naar uw Device Provisioning Service-exemplaar.

  2. Selecteer Inschrijvingen beheren in de sectie Instellingen van het navigatiemenu.

  3. Selecteer Inschrijvingsgroep toevoegen.

  4. Geef op het tabblad Registratie en inrichting van de pagina Inschrijvingsgroep toevoegen de volgende informatie op om de details van de inschrijvingsgroep te configureren:

    Veld Beschrijving
    Attest Selecteer symmetrische sleutel als attestation-mechanisme.
    Instellingen voor symmetrische sleutels Schakel het selectievakje Symmetrische sleutels genereren automatisch in.
    Groepsnaam Voer contoso-custom-allocated-devices in als groepsnaam.
    Inrichtingsstatus Schakel het selectievakje Deze inschrijving inschakelen in.
  5. Selecteer Volgende: IoT-hubs.

  6. Geef op het tabblad IoT Hubs van de pagina Inschrijvingsgroep toevoegen de volgende informatie op om te bepalen aan welke IoT-hubs de inschrijvingsgroep apparaten kan inrichten:

    Veld Beschrijving
    IoT-doelhubs Selecteer een of meer gekoppelde IoT-hubs of voeg een nieuwe koppeling toe aan een IoT-hub.
    Toewijzingsbeleid Selecteer Aangepast (azure-functie gebruiken). Selecteer De Azure-functie selecteren en volg de aanwijzingen om de functie te selecteren die u voor deze zelfstudie hebt gemaakt.
  7. Selecteer Controleren + maken.

  8. Controleer op het tabblad Controleren en maken al uw waarden en selecteer Vervolgens Maken.

Nadat u de inschrijving hebt opgeslagen, opent u deze opnieuw en noteert u de primaire sleutel. U moet de registratie eerst opslaan voordat de sleutels kunnen worden gegenereerd. Deze sleutel wordt gebruikt voor het genereren van unieke apparaatsleutels voor gesimuleerde apparaten in de volgende sectie.

Unieke apparaatsleutels afleiden

Apparaten gebruiken de primaire symmetrische sleutel van de inschrijvingsgroep niet rechtstreeks. In plaats daarvan gebruikt u de primaire sleutel om een apparaatsleutel af te leiden voor elk apparaat. In deze sectie maakt u twee unieke apparaatsleutels. Eén sleutel wordt gebruikt voor een gesimuleerd broodrooster. De andere sleutel wordt gebruikt voor een gesimuleerd warmtepompapparaat.

Als u de apparaatsleutel wilt afleiden, gebruikt u de primaire sleutel van de inschrijvingsgroep die u eerder hebt genoteerd om de HMAC-SHA256 van de apparaatregistratie-id voor elk apparaat te berekenen en het resultaat te converteren naar de Basis 64-indeling. Voor meer informatie over het maken van afgeleide apparaatsleutels bij registratiegroepen, raadpleegt u de sectie over groepsregistraties van Verklaring met symmetrische sleutels.

Voor het voorbeeld in deze zelfstudie gebruikt u de volgende twee apparaatregistratie-id's en berekent u een apparaatsleutel voor beide apparaten. Beide registratie-id's hebben een geldig achtervoegsel om te werken met de voorbeeldcode voor het aangepaste toewijzingsbeleid:

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

De IoT-extensie voor de Azure CLI biedt de opdracht voor het iot dps enrollment-group compute-device-key genereren van afgeleide apparaatsleutels. Deze opdracht kan worden gebruikt op Windows- of Linux-systemen, vanuit PowerShell of een Bash-shell.

Vervang de waarde van --key het argument door de primaire sleutel uit uw inschrijvingsgroep.

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

Notitie

U kunt ook de id van de inschrijvingsgroep opgeven in plaats van de symmetrische sleutel voor de iot dps enrollment-group compute-device-key opdracht. Voorbeeld:

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 gesimuleerde apparaten gebruiken de afgeleide apparaatsleutels met elke registratie-id om attestation van symmetrische sleutels uit te voeren.

Een ontwikkelomgeving voorbereiden voor de Azure IoT C-SDK

In deze sectie bereidt u een ontwikkelomgeving voor die wordt gebruikt om de Azure IoT-SDK voor C te maken. De SDK bevat de voorbeeldcode voor het gesimuleerde apparaat. Dit gesimuleerde apparaat probeert de inrichting uit te voeren tijdens de opstartprocedure van het apparaat.

Deze sectie is gebaseerd op een Windows-werkstation. Zie voor een Linux-voorbeeld de installatie van de VM's in zelfstudie: Inrichten voor geolatentie.

  1. Download het CMake-buildsysteem.

    Het is belangrijk dat de vereisten voor Visual Studio (Visual Studio en de workload Desktopontwikkeling met C++) op uw computer zijn geïnstalleerd voordat u de CMake installatie start. Zodra aan de vereisten is voldaan en de download is geverifieerd, installeert u het CMake-bouwsysteem.

  2. Zoek de tagnaam voor de nieuwste versie van de SDK.

  3. Open een opdrachtprompt of Git Bash-shell. Voer de volgende opdrachten uit om de nieuwste versie van de Azure IoT Device SDK voor C GitHub-opslagplaats te klonen. Gebruik de tag die u in de vorige stap hebt gevonden als de waarde voor de -b parameter, bijvoorbeeld: 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
    

    Deze bewerking kan enkele minuten in beslag nemen.

  4. Maak de submap cmake in de hoofdmap van de Git-opslagplaats en navigeer naar die map. Voer de volgende opdrachten uit vanuit de map azure-iot-sdk-c:

    mkdir cmake
    cd cmake
    
  5. Voer de volgende opdracht uit om een versie van de SDK te bouwen die specifiek is voor uw clientplatform voor ontwikkeling. Er wordt een Visual Studio-oplossing voor het gesimuleerde apparaat gegenereerd in de map cmake.

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

    Als cmake uw C++-compiler niet wordt gevonden, ziet u mogelijk buildfouten tijdens het uitvoeren van de opdracht. Als dit gebeurt, voert u de opdracht uit in de Visual Studio-opdrachtprompt.

    Zodra het bouwen is voltooid, zijn de laatste paar uitvoerregels vergelijkbaar met de volgende uitvoer:

    $ 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
    

De apparaten simuleren

In deze sectie werkt u een inrichtingsvoorbeeld bij met de naam prov_dev_client_sample zich in de Azure IoT C SDK die u eerder hebt ingesteld.

Met deze voorbeeldcode wordt een opstartprocedure van het apparaat gesimuleerd waarbij de inrichtingsaanvraag naar uw Device Provisioning Service-instantie wordt verzonden. De opstartvolgorde zorgt ervoor dat het broodroosterapparaat wordt herkend en toegewezen aan de IoT-hub met behulp van het aangepaste toewijzingsbeleid.

  1. Selecteer in Azure Portal het tabblad Overzicht voor Device Provisioning Service en noteer de waarde van het id-bereik .

    Device Provisioning Service-eindpuntgegevens uit de portalblade extraheren

  2. Open in Visual Studio het oplossingsbestand azure_iot_sdks.sln dat eerder is gegenereerd door CMake uit te voeren. Het oplossingsbestand moet zich op de volgende locatie bevinden: azure-iot-sdk-c\cmake\azure_iot_sdks.sln.

  3. Navigeer in het venster Solution Explorer van Visual Studio naar de map Provision_Samples. Vouw het voorbeeldproject met de naam prov_dev_client_sample uit. Vouw bronbestanden uit en open prov_dev_client_sample.c.

  4. Zoek de constante id_scope op en vervang de waarde door uw Id-bereik-waarde die u eerder hebt gekopieerd.

    static const char* id_scope = "0ne00002193";
    
  5. Zoek de definitie voor de functie main() op in hetzelfde bestand. Zorg ervoor dat de variabele hsm_type is ingesteld op SECURE_DEVICE_TYPE_SYMMETRIC_KEY, zoals hieronder wordt weergegeven:

    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. Zoek in de functie main() de aanroep naar Prov_Device_Register_Device(). Voeg net vóór die aanroep de volgende regels code toe die gebruikmaken van Prov_Device_Set_Provisioning_Payload() voor het doorgeven van een aangepaste JSON-payload tijdens het inrichten. Dit kan worden gebruikt om meer informatie over uw aangepaste toewijzingsfuncties te krijgen. Dit kan ook worden gebruikt om het apparaattype door te geven in plaats van de registratie-id te onderzoeken. Zie Hoe u nettoladingen van aangepaste gegevens verzendt en ontvangt met DPS voor meer informatie over het verzenden en ontvangen van nettoladingen tussen apparaten en 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. Klik met de rechtermuisknop op het prov_dev_client_sample project en selecteer Instellen als opstartproject.

Het Contoso-broodrooster simuleren

  1. Als u het broodrooster wilt simuleren, zoekt u de aanroep naar prov_dev_set_symmetric_key_info() in prov_dev_client_sample.c die als commentaar wordt weergegeven.

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

    Verwijder de opmerkingen bij de functieaanroep en vervang de waarden voor de tijdelijke aanduiding (inclusief de punthaken) door de registratie-id van het broodrooster en de afgeleide apparaatsleutel die u eerder hebt gegenereerd. De sleutelwaarde JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= die hieronder wordt weergegeven, dient alleen als voorbeeld.

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

    Sla het bestand op.

  2. Selecteer in het menu van Visual Studio de optie Debug>Start without debugging om de oplossing uit te voeren. Selecteer Yes in de prompt voor het opnieuw maken van het project om het project opnieuw te maken voordat het wordt uitgevoerd.

    De volgende uitvoer is een voorbeeld van het gesimuleerde broodrooster dat is opgestart en verbinding maakt met het inrichtingsservice-exemplaar dat moet worden toegewezen aan de broodroosters IoT Hub door het aangepaste toewijzingsbeleid:

    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:
    

    De volgende uitvoer is een voorbeeld van logboekuitvoer van de aangepaste toewijzingsfunctiecode die wordt uitgevoerd voor het broodroosterapparaat. U ziet dat er een hub is geselecteerd voor een broodrooster. Let ook op de payload eigenschap die de aangepaste JSON-inhoud bevat die u aan de code hebt toegevoegd. Deze inhoud is beschikbaar voor gebruik in de deviceRuntimeContext.

    U vindt deze logboekregistratie door op Logboeken te klikken onder de functiecode in de portal:

    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)
    

De Contoso-warmtepomp simuleren

  1. Als u het warmtepompapparaat wilt simuleren, werkt u de aanroep in prov_dev_set_symmetric_key_info()prov_dev_client_sample.c opnieuw bij met de registratie-id van de warmtepomp en afgeleide apparaatsleutel die u eerder hebt gegenereerd. De sleutelwaarde 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= die hieronder wordt weergegeven, dient alleen als voorbeeld.

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

    Sla het bestand op.

  2. Selecteer in het menu van Visual Studio de optie Debug>Start without debugging om de oplossing uit te voeren. Klik in de prompt om het project opnieuw te bouwen op Yes om het project opnieuw te bouwen voordat het wordt uitgevoerd.

    De volgende uitvoer is een voorbeeld van het gesimuleerde warmtepompapparaat dat is opgestart en verbinding maakt met het exemplaar van de inrichtingsservice dat moet worden toegewezen aan de IoT-hub voor Contoso-warmtepompen door het aangepaste toewijzingsbeleid:

    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:
    

Problemen met aangepast toewijzingsbeleid oplossen

In de volgende tabel ziet u de verwachte scenario's en de foutcodes die u kunt ontvangen. Gebruik deze tabel om aangepaste toewijzingsbeleidsfouten met uw Azure Functions op te lossen.

Scenario Registratieresultaat van Provisioning Service Resultaten van inrichtings-SDK
De webhook retourneert 200 OK met 'iotHubHostName' ingesteld op een geldige IoT Hub-hostnaam Resultaatstatus: Toegewezen SDK retourneert PROV_DEVICE_RESULT_OK samen met hubgegevens
De webhook retourneert 200 OK met 'iotHubHostName' dat aanwezig is in het antwoord, maar is ingesteld op een lege tekenreeks of null Resultaatstatus: Mislukt

Foutcode: CustomAllocationIotHubNotSpecified (400208)
SDK retourneert PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED
De webhook retourneert 401 Niet geautoriseerd Resultaatstatus: Mislukt

Foutcode: CustomAllocationUnauthorizedAccess (400209)
SDK retourneert PROV_DEVICE_RESULT_UNAUTHORIZED
Er is een afzonderlijke inschrijving gemaakt om het apparaat uit te schakelen Resultaatstatus: Uitgeschakeld SDK retourneert PROV_DEVICE_RESULT_DISABLED
De webhook retourneert foutcode >= 429 De indeling van DPS wordt meerdere keren opnieuw geprobeerd. Het beleid voor opnieuw proberen is momenteel:

  - Aantal nieuwe pogingen: 10
  - Begininterval: 1 s
  - Verhoging: 9 s
SDK negeert de fout en verzendt een ander statusbericht op de opgegeven tijd
De webhook retourneert eventuele andere statuscode Resultaatstatus: Mislukt

Foutcode: CustomAllocationFailed (400207)
SDK retourneert PROV_DEVICE_RESULT_DEV_AUTH_ERROR

Resources opschonen

Als u van plan bent om door te gaan met de resources die in deze zelfstudie zijn gemaakt, kunt u ze verlaten. Als u niet van plan bent om de resources te blijven gebruiken, gebruikt u de volgende stappen om alle resources die in deze zelfstudie zijn gemaakt, te verwijderen om onnodige kosten te voorkomen.

In de stappen hier wordt ervan uitgegaan dat u alle resources in deze zelfstudie hebt gemaakt, zoals aangegeven in dezelfde resourcegroep met de naam contoso-us-resource-group.

Belangrijk

Het verwijderen van een resourcegroep kan niet ongedaan worden gemaakt. De resourcegroep en alle resources daarin worden permanent verwijderd. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of resources verwijdert. Als u de IoT Hub in een bestaande resourcegroep hebt gemaakt met resources die u wilt behouden, moet u alleen de IoT Hub-resource zelf verwijderen in plaats van de resourcegroep te verwijderen.

U verwijdert als volgt de resourcegroep op naam:

  1. Meld u aan bij de Azure-portal en selecteer Resourcegroepen.

  2. Typ in het tekstvak Filteren op naam... de naam van de resourcegroep die uw resources bevat, contoso-us-resource-group.

  3. Selecteer rechts van de resourcegroep in de lijst met resultaten ... en vervolgens Resourcegroep verwijderen.

  4. U wordt gevraagd om het verwijderen van de resourcegroep te bevestigen. Typ ter bevestiging nogmaals de naam van de resourcegroep. Selecteer vervolgens Verwijderen. Na enkele ogenblikken worden de resourcegroep en alle resources in de groep verwijderd.

Volgende stappen

Zie voor meer informatie over aangepast toewijzingsbeleid