Delen via


Automanage-apparaten in Azure Digital Twins met behulp van Device Provisioning Service (DPS)

In dit artikel leert u hoe u Azure Digital Twins integreert met Device Provisioning Service (DPS).

Met de oplossing die in dit artikel wordt beschreven, kunt u het proces voor het inrichten en buiten gebruik stellen van IoT Hub-apparaten in Azure Digital Twins automatiseren met behulp van Device Provisioning Service.

Voor meer informatie over de inrichtings- en buitengebruikstellingsfasen en voor een beter begrip van de set algemene apparaatbeheerfasen die gebruikelijk zijn voor alle IoT-projecten voor ondernemingen, raadpleegt u de sectie Apparaatlevenscyclus van de documentatie over apparaatbeheer van IoT Hub.

Vereisten

Voordat u de inrichting kunt instellen, moet u de volgende resources instellen:

  • Een Azure Digital Twins-exemplaar. Volg de instructies in Een exemplaar en verificatie instellen om een Azure Digital Twins-exemplaar te maken. Verzamel de hostnaam van het exemplaar in Azure Portal (instructies).
  • Een IoT-hub. Zie de sectie 'Een IoT Hub maken' van de quickstart voor IoT Hub voor instructies.
  • Een Azure-functie waarmee gegevens van digitale dubbels worden bijgewerkt op basis van IoT Hub-gegevens. Volg de instructies voor het opnemen van IoT-hubgegevens om deze Azure-functie te maken. Verzamel de naam van de functie om deze in dit artikel te gebruiken.

In dit voorbeeld wordt ook een apparaatsimulator gebruikt die inrichting omvat met behulp van Device Provisioning Service. De apparaatsimulator bevindt zich hier: Azure Digital Twins en IoT Hub Integration Sample. Haal het voorbeeldproject op uw computer op door te navigeren naar de GitHub-opslagplaats voor het voorbeeld, dat u kunt downloaden als een .zip bestand door de knop Code te selecteren en ZIP downloaden te selecteren.

Schermopname van de digital-twins-iothub-integration-opslagplaats op GitHub, waarin de stappen worden gemarkeerd om deze als zip-bestand te downloaden.

Pak de gedownloade map uit.

U hebt Node.js op uw computer geïnstalleerd. De apparaatsimulator is gebaseerd op Node.js versie 10.0.x of hoger.

Architectuur voor de oplossing

Deze oplossing omvat stappen voor het inrichten en buiten gebruik stellen van een apparaat in Azure Digital Twins, met behulp van Device Provisioning Service.

Als u apparaten in de oplossing wilt toewijzen, stromen gegevens tussen een thermostaatapparaat en DPS. De gegevens stromen vervolgens van DPS naar IoT Hub en naar Azure Digital Twins via een Azure-functie.

Als u een apparaat buiten gebruik wilt stellen, stromen gegevens van een handmatig apparaatverwijdering naar Azure Digital Twins via IoT Hub, Event Hubs en een Azure-functie.

In de onderstaande afbeelding ziet u deze architectuur.

Diagram van apparaat en verschillende Azure-services in een end-to-end scenario met de gegevensstroom.

Dit artikel is onderverdeeld in twee secties, elk gericht op een deel van deze volledige architectuur:

Apparaat automatisch inrichten met Device Provisioning Service

In deze sectie koppelt u Device Provisioning Service aan Azure Digital Twins om apparaten automatisch in te richten via het onderstaande pad. Dit diagram is een fragment uit de volledige architectuur die eerder is weergegeven.

Diagram van de inrichtingsstroom: een fragment van het diagram van de oplossingsarchitectuur na gegevens van een thermostaat in Azure Digital Twins.

Hier volgt een beschrijving van de processtroom:

  1. Het apparaat neemt contact op met het DPS-eindpunt en geeft identificatiegegevens door om de identiteit te bewijzen.
  2. DPS valideert de apparaat-id door de registratie-id en sleutel te valideren op basis van de registratielijst en roept een Azure-functie aan om de toewijzing uit te voeren.
  3. De Azure-functie maakt een nieuwe dubbel in Azure Digital Twins voor het apparaat. De tweeling heeft dezelfde naam als de registratie-id van het apparaat.
  4. DPS registreert het apparaat met een IoT-hub en vult de gekozen dubbelstatus van het apparaat in.
  5. De IoT-hub retourneert apparaat-id-gegevens en de verbindingsgegevens van de IoT-hub met het apparaat. Het apparaat kan nu verbinding maken met de IoT-hub.

In de volgende secties worden de stappen beschreven voor het instellen van deze apparaatstroom voor automatisch inrichten.

Een Device Provisioning Service maken

Wanneer een nieuw apparaat wordt ingericht met Device Provisioning Service, kan een nieuwe dubbel voor dat apparaat worden gemaakt in Azure Digital Twins met dezelfde naam als de registratie-id.

Maak een Device Provisioning Service-exemplaar dat wordt gebruikt voor het inrichten van IoT-apparaten. U kunt de onderstaande Azure CLI-instructies gebruiken of Azure Portal gebruiken door de IoT Hub Device Provisioning Service in te stellen met Azure Portal.

Met de volgende Azure CLI-opdracht maakt u een Device Provisioning Service. U moet een Device Provisioning Service-naam, resourcegroep en regio opgeven. Als u wilt zien welke regio's Device Provisioning Service ondersteunen, gaat u naar Azure-producten die beschikbaar zijn per regio. De opdracht kan worden uitgevoerd in Cloud Shell of lokaal als u de Azure CLI op uw computer hebt geïnstalleerd.

az iot dps create --name <Device-Provisioning-Service-name> --resource-group <resource-group-name> --location <region>

Een functie toevoegen voor gebruik met Device Provisioning Service

In het functie-app-project dat u hebt gemaakt in de sectie Vereisten, maakt u een nieuwe functie die u kunt gebruiken met Device Provisioning Service. Deze functie wordt gebruikt door Device Provisioning Service in een aangepast toewijzingsbeleid om een nieuw apparaat in te richten.

Navigeer naar het functie-app-project op uw computer en volg de onderstaande stappen.

  1. Maak eerst een nieuwe functie van het type HTTP-trigger in het functie-app-project.

  2. Voeg een nieuw NuGet-pakket toe aan het project: Microsoft.Azure.Devices.Provisioning.Service. Mogelijk moet u ook meer pakketten aan uw project toevoegen als de pakketten die in de code worden gebruikt, nog geen deel uitmaken van het project.

  3. Plak in het zojuist gemaakte functiecodebestand de volgende code, geef de functie een naam DpsAdtAllocationFunc.cs en sla het bestand op.

    // Copyright (c) Microsoft. All rights reserved.
    // Licensed under the MIT license. See LICENSE file in the project root for full license information.
    
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Azure;
    using Azure.Core.Pipeline;
    using Azure.DigitalTwins.Core;
    using Azure.Identity;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.Azure.Devices.Shared;
    using Microsoft.Azure.Devices.Provisioning.Service;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    
    namespace Samples.AdtIothub
    {
        public static class DpsAdtAllocationFunc
        {
            private static string adtInstanceUrl = Environment.GetEnvironmentVariable("ADT_SERVICE_URL");
            private static readonly HttpClient singletonHttpClientInstance = new HttpClient();
    
            [FunctionName("DpsAdtAllocationFunc")]
            public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log)
            {
                // Get request body
                string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                log.LogDebug($"Request.Body: {requestBody}");
                dynamic data = JsonConvert.DeserializeObject(requestBody);
    
                // Get registration ID of the device
                string regId = data?.deviceRuntimeContext?.registrationId;
    
                bool fail = false;
                string message = "Uncaught error";
                var response = new ResponseObj();
    
                // Must have unique registration ID on DPS request
                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
                        || hubs.Length < 1)
                    {
                        message = "No hub group defined for the enrollment.";
                        log.LogInformation("linkedHubs: NULL");
                        fail = true;
                    }
                    else
                    {
                        // Find or create twin based on the provided registration ID and model ID
                        dynamic payloadContext = data?.deviceRuntimeContext?.payload;
                        string dtmi = payloadContext.modelId;
                        log.LogDebug($"payload.modelId: {dtmi}");
                        string dtId = await FindOrCreateTwinAsync(dtmi, regId, log);
    
                        // Get first linked hub (TODO: select one of the linked hubs based on policy)
                        response.iotHubHostName = hubs[0];
    
                        // Specify the initial tags for the device.
                        var tags = new TwinCollection();
                        tags["dtmi"] = dtmi;
                        tags["dtId"] = dtId;
    
                        // Specify the initial desired properties for the device.
                        var properties = new TwinCollection();
    
                        // Add the initial twin state to the response.
                        var twinState = new TwinState(tags, properties);
                        response.initialTwin = twinState;
                    }
                }
    
                log.LogDebug("Response: " + ((response.iotHubHostName != null)? JsonConvert.SerializeObject(response) : message));
    
                return fail
                    ? new BadRequestObjectResult(message)
                    : (ActionResult)new OkObjectResult(response);
            }
    
            public static async Task<string> FindOrCreateTwinAsync(string dtmi, string regId, ILogger log)
            {
                // Create Digital Twins client
                var cred = new DefaultAzureCredential();
                var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
    
                // Find existing DigitalTwin with registration ID
                try
                {
                    // Get DigitalTwin with Id 'regId'
                    BasicDigitalTwin existingDt = await client.GetDigitalTwinAsync<BasicDigitalTwin>(regId).ConfigureAwait(false);
    
                    // Check to make sure it is of the correct model type
                    if (StringComparer.OrdinalIgnoreCase.Equals(dtmi, existingDt.Metadata.ModelId))
                    {
                        log.LogInformation($"DigitalTwin {existingDt.Id} already exists");
                        return existingDt.Id;
                    }
    
                    // Found DigitalTwin but it is not of the correct model type
                    log.LogInformation($"Found DigitalTwin {existingDt.Id} but it is not of model {dtmi}");
                }
                catch(RequestFailedException ex) when (ex.Status == (int)HttpStatusCode.NotFound)
                {
                    log.LogDebug($"Did not find DigitalTwin {regId}");
                }
    
                // Either the DigitalTwin was not found, or we found it but it is of a different model type
                // Create or replace it with what it needs to be, meaning if it was not found a brand new DigitalTwin will be created
                // and if it was of a different model, it will replace that existing DigitalTwin
                // If it was intended to only create the DigitalTwin if there is no matching DigitalTwin with the same Id,
                // ETag.All could have been used as the ifNonMatch parameter to the CreateOrReplaceDigitalTwinAsync method call.
                // Read more in the CreateOrReplaceDigitalTwinAsync documentation here:
                // https://docs.microsoft.com/en-us/dotnet/api/azure.digitaltwins.core.digitaltwinsclient.createorreplacedigitaltwinasync?view=azure-dotnet
                BasicDigitalTwin dt = await client.CreateOrReplaceDigitalTwinAsync(
                    regId, 
                    new BasicDigitalTwin
                    {
                        Metadata = { ModelId = dtmi },
                        Contents = 
                        {
                            { "Temperature", 0.0 }
                        }
                    }
                ).ConfigureAwait(false);
    
                log.LogInformation($"Digital Twin {dt.Id} created.");
                return dt.Id;
            }
        }
    
        /// <summary>
        /// Expected function result format
        /// </summary>
        public class ResponseObj
        {
            public string iotHubHostName { get; set; }
            public TwinState initialTwin { get; set; }
        }
    }
    
  4. Publiceer het project met de DpsAdtAllocationFunc.cs-functie naar een functie-app in Azure.

    Zie Azure Functions ontwikkelen met Behulp van Visual Studio voor instructies over het publiceren van de functie met behulp van Visual Studio. Zie Een C#-functie maken in Azure met behulp van Visual Studio Code voor instructies over het publiceren van de functie met behulp van Visual Studio Code. Zie Een C#-functie maken in Azure vanaf de opdrachtregel voor instructies over het publiceren van de functie met behulp van de Azure CLI.

Belangrijk

Wanneer u de functie-app voor de eerste keer maakt in de sectie Vereisten, hebt u mogelijk al een toegangsrol voor de functie toegewezen en de toepassingsinstellingen hiervoor geconfigureerd voor toegang tot uw Azure Digital Twins-exemplaar. Deze moeten eenmaal worden uitgevoerd voor de hele functie-app, dus controleer of ze zijn voltooid in uw app voordat u doorgaat. U vindt instructies in de sectie Gepubliceerde app configureren van het artikel App-verificatiecode schrijven.

Apparaatinrichtingsinschrijving maken

Vervolgens moet u een inschrijving maken in Device Provisioning Service met behulp van een aangepaste toewijzingsfunctie. Volg de instructies in de sectie Inschrijving maken van het artikel aangepaste toewijzingsbeleid in de Device Provisioning Service-documentatie om een inschrijving te maken.

Zorg ervoor dat u tijdens het doorlopen van die stroom de volgende opties selecteert om de inschrijving te koppelen aan de functie die u hebt gemaakt.

  • Selecteer hoe u apparaten wilt toewijzen aan hubs: Aangepast (Azure-functie gebruiken).
  • Selecteer de IoT-hubs waaraan deze groep kan worden toegewezen: Kies de naam van uw IoT-hub of selecteer de knop Een nieuwe IoT-hub koppelen en kies uw IoT-hub in de opties.

Kies vervolgens de knop Een nieuwe functie selecteren om uw functie-app te koppelen aan de inschrijvingsgroep. Vul vervolgens de volgende waarden in:

  • Abonnement: Uw Azure-abonnement wordt automatisch ingevuld. Zorg ervoor dat dit het juiste abonnement is.
  • Functie-app: kies de naam van uw functie-app.
  • Functie: Kies DpsAdtAllocationFunc.

Sla uw gegevens op.

Schermopname van het venster Details van de douaneinschrijvingsgroep in Azure Portal.

Nadat u de inschrijving hebt gemaakt, selecteert u deze om de instellingen ervan weer te geven. Kopieer de primaire sleutel voor de inschrijving, die verderop in dit artikel wordt gebruikt om de apparaatsimulator te configureren.

De apparaatsimulator instellen

In dit voorbeeld wordt een apparaatsimulator gebruikt die inrichting omvat met behulp van Device Provisioning Service. De apparaatsimulator bevindt zich in het Azure Digital Twins- en IoT Hub-integratievoorbeeld dat u hebt gedownload in de sectie Vereisten.

Het model uploaden

De apparaatsimulator is een thermostaat-type apparaat dat het model gebruikt met deze id: dtmi:contosocom:DigitalTwins:Thermostat;1. U moet dit model uploaden naar Azure Digital Twins voordat u een dubbel van dit type voor het apparaat kunt maken.

Het model ziet er als volgt uit:

{
    "@id": "dtmi:contosocom:DigitalTwins:Thermostat;1",
    "@type": "Interface",
    "@context": "dtmi:dtdl:context;3",
    "contents": [
      {
        "@type": "Property",
        "name": "Temperature",
        "schema": "double"
      }
    ]
  }

Als u dit model wilt uploaden naar uw twins-exemplaar, voert u de volgende Azure CLI-opdracht uit, waarmee het bovenstaande model als inline-JSON wordt geüpload. U kunt de opdracht uitvoeren in Azure Cloud Shell in uw browser (gebruik de Bash-omgeving) of op uw computer als u de CLI lokaal hebt geïnstalleerd. Er is één tijdelijke aanduiding voor de hostnaam van het exemplaar (u kunt ook de beschrijvende naam van het exemplaar gebruiken met een lichte afname van de prestaties).

az dt model create --dt-name <instance-hostname-or-name> --models '{  "@id": "dtmi:contosocom:DigitalTwins:Thermostat;1",  "@type": "Interface",  "@context": "dtmi:dtdl:context;2",  "contents": [    {      "@type": "Property",      "name": "Temperature",      "schema": "double"    }  ]}' 

Notitie

Als u iets anders gebruikt dan Cloud Shell in de Bash-omgeving, moet u mogelijk bepaalde tekens in de inline-JSON escapen, zodat deze correct wordt geparseerd. Zie Speciale tekens gebruiken in verschillende shells voor meer informatie.

Zie Modellen beheren voor meer informatie over modellen.

De simulator configureren en uitvoeren

Navigeer in een opdrachtvenster op uw lokale computer naar de gedownloade Azure Digital Twins- en IoT Hub-integratie die u eerder hebt uitgepakt en ga vervolgens naar de map apparaatsimulator . Installeer vervolgens de afhankelijkheden voor het project met behulp van de volgende opdracht:

npm install

Kopieer vervolgens in de map van de apparaatsimulator het .env.template-bestand naar een nieuw bestand met de naam .env env en verzamel de volgende waarden om de instellingen in te vullen:

  • PROVISIONING_IDSCOPE: Als u deze waarde wilt ophalen, gaat u naar de apparaatinrichtingsservice in Azure Portal, selecteert u Overzicht in de menuopties en zoekt u naar het veld-id-bereik.

    Schermopname van de azure-portalweergave van de overzichtspagina voor apparaatinrichting waarin de waarde van het id-bereik wordt gemarkeerd.

  • PROVISIONING_REGISTRATION_ID: U kunt een registratie-id voor uw apparaat kiezen.

  • ADT_MODEL_ID: dtmi:contosocom:DigitalTwins:Thermostat;1

  • PROVISIONING_SYMMETRIC_KEY: deze omgevingsvariabele is de primaire sleutel voor de inschrijving die u eerder hebt ingesteld. Als u deze waarde opnieuw wilt ophalen, gaat u naar de apparaatinrichtingsservice in Azure Portal, selecteert u Inschrijvingen beheren en selecteert u vervolgens de inschrijvingsgroep die u eerder hebt gemaakt en kopieert u de primaire sleutel.

    Schermopname van de azure-portalweergave van de pagina Apparaatinrichtingsservice voor het beheren van inschrijvingen, waarin de waarde van de primaire SAS-sleutel wordt gemarkeerd.

Gebruik nu de bovenstaande waarden om de .env-bestandsinstellingen bij te werken.

PROVISIONING_HOST = "global.azure-devices-provisioning.net"
PROVISIONING_IDSCOPE = "<Device-Provisioning-Service-Scope-ID>"
PROVISIONING_REGISTRATION_ID = "<Device-Registration-ID>"
ADT_MODEL_ID = "dtmi:contosocom:DigitalTwins:Thermostat;1"
PROVISIONING_SYMMETRIC_KEY = "<Device-Provisioning-Service-enrollment-primary-SAS-key>"

Sla het bestand op en sluit het bestand.

Start met het uitvoeren van de apparaatsimulator

Start de apparaatsimulator met behulp van de volgende opdracht in de map apparaatsimulator in het opdrachtvenster:

node .\adt_custom_register.js

U ziet dat het apparaat wordt geregistreerd en verbonden met IoT Hub en vervolgens berichten gaat verzenden. Schermopname van het opdrachtvenster met apparaatregistratie en het verzenden van berichten.

Valideren

De stroom die u in dit artikel hebt ingesteld, zorgt ervoor dat het apparaat automatisch wordt geregistreerd in Azure Digital Twins. Gebruik de volgende Azure Digital Twins CLI-opdracht om de dubbel van het apparaat te vinden in het Azure Digital Twins-exemplaar dat u hebt gemaakt. Er is een tijdelijke aanduiding voor de hostnaam van het exemplaar (u kunt ook de beschrijvende naam van het exemplaar gebruiken met een lichte afname van de prestaties) en een tijdelijke aanduiding voor de registratie-id van het apparaat.

az dt twin show --dt-name <instance-hostname-or-name> --twin-id "<device-registration-ID>"

U ziet nu de dubbel van het apparaat dat wordt gevonden in het Azure Digital Twins-exemplaar. Schermopname van het opdrachtvenster met de zojuist gemaakte dubbel.

Autoretire apparaat met behulp van levenscyclus-gebeurtenissen van IoT Hub

In deze sectie koppelt u levenscyclus-gebeurtenissen van IoT Hub aan Azure Digital Twins om apparaten automatisch te koppelen via het onderstaande pad. Dit diagram is een fragment uit de volledige architectuur die eerder is weergegeven.

Diagram van de apparaatstroom buiten gebruik stellen: een fragment van het architectuurdiagram van de oplossing, met de gegevens van een apparaatverwijdering in Azure Digital Twins.

Hier volgt een beschrijving van de processtroom:

  1. Een extern of handmatig proces activeert het verwijderen van een apparaat in IoT Hub.
  2. IoT Hub verwijdert het apparaat en genereert een gebeurtenis voor de levenscyclus van een apparaat die naar een Event Hub wordt gerouteerd.
  3. Met een Azure-functie wordt de dubbel van het apparaat in Azure Digital Twins verwijderd.

In de volgende secties worden de stappen beschreven voor het instellen van deze automatische apparaatstroom.

Een Event Hub maken

Vervolgens maakt u een Azure Event Hub voor het ontvangen van levenscyclus-gebeurtenissen van IoT Hub.

Volg de stappen die worden beschreven in de quickstart Een Event Hub maken. Geef uw Event Hub-levenscyclusvents een naam. U gebruikt deze Event Hub-naam wanneer u ioT Hub-route en een Azure-functie instelt in de volgende secties.

In de onderstaande schermopname ziet u het maken van de Event Hub. Schermopname van het azure-portalvenster waarin wordt getoond hoe u een Event Hub maakt met de naam lifecycleevents.

SAS-beleid maken voor uw Event Hub

Vervolgens moet u een SAS-beleid (Shared Access Signature) maken om de Event Hub te configureren met uw functie-app. Ga als volgende te werk om het SAS-beleid te maken:

  1. Navigeer naar de Event Hub die u hebt gemaakt in Azure Portal en selecteer Beleid voor gedeelde toegang in de menuopties aan de linkerkant.
  2. Selecteer Toevoegen. Voer in het venster SAS-beleid toevoegen dat wordt geopend een beleidsnaam van uw keuze in en schakel het selectievakje Luisteren in.
  3. Selecteer Maken.

Schermopname van Azure Portal waarin wordt getoond hoe u een SAS-beleid voor event hubs toevoegt.

Event Hub configureren met functie-app

Configureer vervolgens de Azure-functie-app die u hebt ingesteld in de sectie Vereisten om te werken met uw nieuwe Event Hub. U configureert de functie door een omgevingsvariabele in de functie-app in te stellen met de verbindingsreeks van de Event Hub.

  1. Open het beleid dat u hebt gemaakt en kopieer de waarde van de verbindingsreeks-primaire sleutel .

    Schermopname van Azure Portal waarin wordt getoond hoe u de verbindingsreeks primaire sleutel kopieert.

  2. Voeg de verbindingsreeks toe als een variabele in de instellingen van de functie-app met de volgende Azure CLI-opdracht. De opdracht kan worden uitgevoerd in Cloud Shell of lokaal als u de Azure CLI op uw computer hebt geïnstalleerd.

    az functionapp config appsettings set --settings "EVENTHUB_CONNECTIONSTRING=<Event-Hubs-SAS-connection-string-Listen>" --resource-group <resource-group> --name <your-function-app-name>
    

Een functie toevoegen om buiten gebruik te stellen met levenscyclus-gebeurtenissen van IoT Hub

In het functie-app-project dat u hebt gemaakt in de sectie Vereisten, maakt u een nieuwe functie om een bestaand apparaat buiten gebruik te stellen met behulp van levenscyclus-gebeurtenissen van IoT Hub.

Zie Niet-telemetriegebeurtenissen van IoT Hub voor meer informatie over levenscyclusgebeurtenissen. Zie De Azure Event Hubs-trigger voor Azure Functions voor meer informatie over het gebruik van Event Hubs met Azure Functions.

Navigeer naar het functie-app-project op uw computer en volg de onderstaande stappen.

  1. Maak eerst een nieuwe functie van het type Event Hub Trigger in het functie-app-project.

  2. Voeg een nieuw NuGet-pakket toe aan het project: Microsoft.Azure.Devices.Provisioning.Service. Mogelijk moet u ook meer pakketten aan uw project toevoegen als de pakketten die in de code worden gebruikt, nog geen deel uitmaken van het project.

  3. Plak in het zojuist gemaakte functiecodebestand de volgende code, geef de functie een naam DeleteDeviceInTwinFunc.cs en sla het bestand op.

    // Copyright (c) Microsoft. All rights reserved.
    // Licensed under the MIT license. See LICENSE file in the project root for full license information.
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Azure;
    using Azure.Core.Pipeline;
    using Azure.DigitalTwins.Core;
    using Azure.Identity;
    using Microsoft.Azure.EventHubs;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Extensions.Logging;
    
    namespace Samples.AdtIothub
    {
        public static class DeleteDeviceInTwinFunc
        {
            private static string adtAppId = "https://digitaltwins.azure.net";
            private static readonly string adtInstanceUrl = Environment.GetEnvironmentVariable("ADT_SERVICE_URL", EnvironmentVariableTarget.Process);
            private static readonly HttpClient singletonHttpClientInstance = new HttpClient();
    
            [FunctionName("DeleteDeviceInTwinFunc")]
            public static async Task Run(
                [EventHubTrigger("lifecycleevents", Connection = "EVENTHUB_CONNECTIONSTRING")] EventData[] events, ILogger log)
            {
                var exceptions = new List<Exception>(events.Length);
    
                // Create Digital Twin client
                var cred = new ManagedIdentityCredential(adtAppId);
                var client = new DigitalTwinsClient(
                    new Uri(adtInstanceUrl),
                    cred,
                    new DigitalTwinsClientOptions
                    {
                        Transport = new HttpClientTransport(singletonHttpClientInstance)
                    });
    
                foreach (EventData eventData in events)
                {
                    try
                    {
                        //log.LogDebug($"EventData: {System.Text.Json.JsonSerializer.Serialize(eventData)}");
    
                        string opType = eventData.Properties["opType"] as string;
                        if (opType == "deleteDeviceIdentity")
                        {
                            string deviceId = eventData.Properties["deviceId"] as string;
    
                            try
                            {
                                // Find twin based on the original Registration ID
                                BasicDigitalTwin digitalTwin = await client.GetDigitalTwinAsync<BasicDigitalTwin>(deviceId);
    
                                // In order to delete the twin, all relationships must first be removed
                                await DeleteAllRelationshipsAsync(client, digitalTwin.Id, log);
    
                                // Delete the twin
                                await client.DeleteDigitalTwinAsync(digitalTwin.Id, digitalTwin.ETag);
                                log.LogInformation($"Twin {digitalTwin.Id} deleted in DT");
                            }
                            catch (RequestFailedException e) when (e.Status == (int)HttpStatusCode.NotFound)
                            {
                                log.LogWarning($"Twin {deviceId} not found in DT");
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        // We need to keep processing the rest of the batch - capture this exception and continue.
                        exceptions.Add(e);
                    }
                }
    
                if (exceptions.Count > 1)
                    throw new AggregateException(exceptions);
    
                if (exceptions.Count == 1)
                    throw exceptions.Single();
            }
    
            /// <summary>
            /// Deletes all outgoing and incoming relationships from a specified digital twin
            /// </summary>
            public static async Task DeleteAllRelationshipsAsync(DigitalTwinsClient client, string dtId, ILogger log)
            {
                AsyncPageable<BasicRelationship> relationships = client.GetRelationshipsAsync<BasicRelationship>(dtId);
                await foreach (BasicRelationship relationship in relationships)
                {
                    await client.DeleteRelationshipAsync(dtId, relationship.Id, relationship.ETag);
                    log.LogInformation($"Twin {dtId} relationship {relationship.Id} deleted in DT");
                }
    
                AsyncPageable<IncomingRelationship> incomingRelationships = client.GetIncomingRelationshipsAsync(dtId);
                await foreach (IncomingRelationship incomingRelationship in incomingRelationships)
                {
                    await client.DeleteRelationshipAsync(incomingRelationship.SourceId, incomingRelationship.RelationshipId);
                    log.LogInformation($"Twin {dtId} incoming relationship {incomingRelationship.RelationshipId} from {incomingRelationship.SourceId} deleted in DT");
                }
            }
        }
    }
    
  4. Publiceer het project met de DeleteDeviceInTwinFunc.cs-functie naar een functie-app in Azure.

    Zie Azure Functions ontwikkelen met Behulp van Visual Studio voor instructies over het publiceren van de functie met behulp van Visual Studio. Zie Een C#-functie maken in Azure met behulp van Visual Studio Code voor instructies over het publiceren van de functie met behulp van Visual Studio Code. Zie Een C#-functie maken in Azure vanaf de opdrachtregel voor instructies over het publiceren van de functie met behulp van de Azure CLI.

Belangrijk

Wanneer u de functie-app voor de eerste keer maakt in de sectie Vereisten, hebt u mogelijk al een toegangsrol voor de functie toegewezen en de toepassingsinstellingen hiervoor geconfigureerd voor toegang tot uw Azure Digital Twins-exemplaar. Deze moeten eenmaal worden uitgevoerd voor de hele functie-app, dus controleer of ze zijn voltooid in uw app voordat u doorgaat. U vindt instructies in de sectie Gepubliceerde app configureren van het artikel App-verificatiecode schrijven.

Een IoT Hub-route maken voor levenscyclus-gebeurtenissen

U gaat nu een IoT Hub-route instellen om levenscyclus-gebeurtenissen van apparaten te routeren. In dit geval luistert u specifiek naar gebeurtenissen voor het verwijderen van apparaten, geïdentificeerd door if (opType == "deleteDeviceIdentity"). Met deze gebeurtenis wordt het verwijderen van het digitale dubbel-item geactiveerd, waarbij het buitengebruikstellingsproces van een apparaat en de bijbehorende digitale dubbel wordt voltooid.

Eerst moet u een Event Hub-eindpunt maken in uw IoT-hub. Vervolgens voegt u een route toe in IoT Hub om levenscyclus-gebeurtenissen naar dit Event Hub-eindpunt te verzenden. Volg deze stappen om een Event Hub-eindpunt te maken:

  1. Navigeer in Azure Portal naar de IoT-hub die u hebt gemaakt in de sectie Vereisten en selecteer Berichtroutering in de menuopties aan de linkerkant.

  2. Selecteer het tabblad Aangepaste eindpunten .

  3. Selecteer + Toevoegen en kies Event Hubs om een Event Hubs-type-eindpunt toe te voegen.

    Schermopname van Azure Portal waarin wordt getoond hoe u een aangepast Event Hubs-eindpunt toevoegt.

  4. Kies in het venster Een Event Hub-eindpunt toevoegen dat wordt geopend de volgende waarden:

    • Eindpuntnaam: kies een eindpuntnaam.
    • Event Hub-naamruimte: Selecteer uw Event Hub-naamruimte in de vervolgkeuzelijst.
    • Event Hub-exemplaar: kies de naam van de Event Hub die u in de vorige stap hebt gemaakt.
  5. Selecteer Maken. Houd dit venster open om een route toe te voegen in de volgende stap.

    Schermopname van Azure Portal waarin wordt getoond hoe u een Event Hub-eindpunt toevoegt.

Vervolgens voegt u een route toe die verbinding maakt met het eindpunt dat u in de bovenstaande stap hebt gemaakt, met een routeringsquery waarmee de verwijderingsevenementen worden verzonden. Volg deze stappen om een route te maken:

  1. Navigeer naar het tabblad Routes en selecteer Toevoegen om een route toe te voegen.

    Schermopname van Azure Portal waarin wordt getoond hoe u een route toevoegt om gebeurtenissen te verzenden.

  2. Kies op de pagina Een route toevoegen die wordt geopend de volgende waarden:

    • Naam: Kies een naam voor uw route.
    • Eindpunt: Kies het Event Hubs-eindpunt dat u eerder hebt gemaakt in de vervolgkeuzelijst.
    • Gegevensbron: kies levenscyclus-gebeurtenissen voor apparaten.
    • Routeringsquery: Voer in opType='deleteDeviceIdentity'. Met deze query worden de levenscyclus-gebeurtenissen van het apparaat beperkt tot het verzenden van de verwijderingsevenementen.
  3. Selecteer Opslaan.

    Schermopname van Azure Portal waarin wordt getoond hoe u een route toevoegt om levenscyclus-gebeurtenissen te verzenden.

Zodra u deze stroom hebt doorlopen, is alles ingesteld op het end-to-end buiten gebruik stellen van apparaten.

Valideren

Als u het buitengebruikstellingsproces wilt activeren, moet u het apparaat handmatig verwijderen uit IoT Hub.

U kunt het apparaat handmatig verwijderen uit IoT Hub met een Azure CLI-opdracht of in Azure Portal. Volg de onderstaande stappen om het apparaat te verwijderen in Azure Portal:

  1. Navigeer naar uw IoT-hub en kies IoT-apparaten in de menuopties aan de linkerkant.
  2. U ziet een apparaat met de apparaatregistratie-id die u in de eerste helft van dit artikel hebt gekozen. U kunt ook elk ander apparaat kiezen dat u wilt verwijderen, zolang het een dubbel in Azure Digital Twins heeft, zodat u kunt controleren of de dubbel automatisch wordt verwijderd nadat het apparaat is verwijderd.
  3. Selecteer het apparaat en kies Verwijderen.

Schermopname van Azure Portal waarin wordt getoond hoe u apparaatdubbel van de IoT-apparaten verwijdert.

Het kan enkele minuten duren voordat de wijzigingen worden weergegeven in Azure Digital Twins.

Gebruik de volgende Azure Digital Twins CLI-opdracht om te controleren of de dubbel van het apparaat in het Azure Digital Twins-exemplaar is verwijderd. Er is een tijdelijke aanduiding voor de hostnaam van het exemplaar (u kunt ook de beschrijvende naam van het exemplaar gebruiken met een lichte afname van de prestaties) en een tijdelijke aanduiding voor de registratie-id van het apparaat.

az dt twin show --dt-name <instance-hostname-or-name> --twin-id "<device-registration-ID>"

U ziet dat de dubbel van het apparaat niet meer kan worden gevonden in het Azure Digital Twins-exemplaar.

Schermopname van het opdrachtvenster waarin wordt weergegeven dat de tweeling niet meer kan worden gevonden.

Resources opschonen

Als u de resources die in dit artikel zijn gemaakt niet meer nodig hebt, volgt u deze stappen om ze te verwijderen.

Met de Azure Cloud Shell of lokale Azure CLI kunt u alle Azure-resources in een resourcegroep verwijderen met de opdracht az group delete . Met deze opdracht wordt de resourcegroep verwijderd. het Azure Digital Twins-exemplaar; de IoT-hub en de hubapparaatregistratie; het Event Grid-onderwerp en de bijbehorende abonnementen; de Event Hubs-naamruimte en beide Azure Functions-apps, inclusief gekoppelde resources zoals opslag.

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.

az group delete --name <your-resource-group>

Verwijder vervolgens de projectvoorbeeldmap die u hebt gedownload van uw lokale computer.

Volgende stappen

De digitale dubbels die voor de apparaten zijn gemaakt, worden opgeslagen als een platte hiërarchie in Azure Digital Twins, maar ze kunnen worden verrijkt met modelinformatie en een hiërarchie met meerdere niveaus voor de organisatie. Lees voor meer informatie over dit concept:

Zie voor meer informatie over het gebruik van HTTP-aanvragen met Azure Functions:

U kunt aangepaste logica schrijven om deze informatie automatisch op te geven met behulp van de model- en grafiekgegevens die al zijn opgeslagen in Azure Digital Twins. Zie de volgende handleidingen voor meer informatie over het beheren, upgraden en ophalen van informatie uit de tweelinggrafiek: