Delen via


Taken plannen en uitzenden (.NET)

Gebruik Azure IoT Hub om taken te plannen en bij te houden die miljoenen apparaten bijwerken. Taken gebruiken om:

  • Gewenste eigenschappen bijwerken

  • Tags bijwerken

  • Directe methoden aanroepen

Een taak verpakt een van deze acties en houdt de uitvoering bij op een set apparaten die is gedefinieerd door een apparaatdubbelquery. Een back-end-app kan bijvoorbeeld een taak gebruiken om een directe methode aan te roepen op 10.000 apparaten waarmee de apparaten opnieuw worden opgestart. U geeft de set apparaten op met een apparaatdubbelquery en plant de taak op een later tijdstip uit te voeren. De taak houdt de voortgang bij terwijl elk van de apparaten de directe methode voor opnieuw opstarten ontvangt en uitvoert.

Zie voor meer informatie over elk van deze mogelijkheden:

Notitie

De functies die in dit artikel worden beschreven, zijn alleen beschikbaar in de standaardlaag van de IoT Hub. Zie De juiste IoT Hub-laag voor uw oplossing kiezen voor meer informatie over de Basic- en Standard-/gratis IoT Hub-lagen.

In dit artikel leest u hoe u twee .NET-console-apps (C#) maakt:

  • Een apparaat-app, SimulateDeviceMethods, die een directe methode met de naam LockDoor implementeert, die kan worden aangeroepen door de back-end-app.

  • Een back-end-app, ScheduleJob, waarmee twee taken worden gemaakt. Een taak roept de directe lockDoor-methode aan en een andere taak verzendt gewenste eigenschapsupdates naar meerdere apparaten.

Notitie

Zie Azure IoT SDK's voor meer informatie over de SDK-hulpprogramma's die beschikbaar zijn voor het bouwen van zowel apparaat- als back-end-apps.

Vereisten

  • Visual Studio.

  • Een IoT-hub in uw Azure-abonnement. Als u nog geen hub hebt, kunt u de stappen volgen in Een IoT-hub maken.

  • Een apparaat dat is geregistreerd in uw IoT-hub. Als u geen apparaat in uw IoT-hub hebt, volgt u de stappen in Een apparaat registreren.

  • Zorg ervoor dat de poort 8883 is geopend in uw firewall. Het apparaatvoorbeeld in dit artikel maakt gebruik van het MQTT-protocol, dat via poort 8883 communiceert. Deze poort is in sommige netwerkomgevingen van bedrijven en onderwijsinstellingen mogelijk geblokkeerd. Zie Verbinding maken met IoT Hub (MQTT) voor meer informatie en manieren om dit probleem te omzeilen.

Een gesimuleerde apparaattoepassing maken

In deze sectie maakt u een .NET-console-app die reageert op een directe methode die wordt aangeroepen door de back-end van de oplossing.

Belangrijk

Dit artikel bevat stappen voor het verbinden van een apparaat met behulp van een Shared Access Signature, ook wel symmetrische sleutelverificatie genoemd. Deze verificatiemethode is handig voor testen en evalueren, maar het verifiëren van een apparaat met X.509-certificaten is een veiligere benadering. Zie Best practices > voor beveiliging voor verbindingsbeveiliging voor meer informatie.

  1. Selecteer in Visual Studio Een nieuw project maken en kies vervolgens de projectsjabloon Console-app (.NET Framework ). Selecteer Volgende om door te gaan.

  2. Geef in Het nieuwe project configureren de naam SimulateDeviceMethods van het project en selecteer vervolgens Volgende.

    Schermopname van de pop-up 'Uw nieuwe project configureren' in Visual Studio.

  3. Accepteer de standaardversie van .NET Framework en selecteer Vervolgens Maken om het project te maken.

  4. Klik in Solution Explorer met de rechtermuisknop op het SimulateDeviceMethods-project en selecteer NuGet-pakketten beheren.

  5. Selecteer in NuGet Pakketbeheer Bladeren en zoeken naar Microsoft.Azure.Devices.Client. Selecteer Installeren.

    Schermopname van de NuGet-Pakketbeheer in Visual Studio.

    Met deze stap downloadt, installeert en voegt u een verwijzing toe naar het NuGet-pakket van de Azure IoT-apparaat-SDK en de bijbehorende afhankelijkheden.

  6. Voeg aan het begin van het bestand Program.cs de volgende using-instructies toe:

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. Voeg de volgende velden toe aan de klasse Program: Vervang de waarde van de tijdelijke aanduiding door het apparaat verbindingsreeks dat u in de vorige sectie hebt genoteerd:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. Voeg de volgende code toe om de directe methode op het apparaat te implementeren:

    static Task<MethodResponse> LockDoor(MethodRequest methodRequest, object userContext)
    {
        Console.WriteLine();
        Console.WriteLine("Locking Door!");
        Console.WriteLine("\nReturning response for method {0}", methodRequest.Name);
    
        string result = "'Door was locked.'";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. Voeg de volgende methode toe om de listener voor apparaatdubbels op het apparaat te implementeren:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. Voeg tot slot de volgende code toe aan de Main-methode om de verbinding met uw IoT-hub te openen en de methodelistener te initialiseren:

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        Client.SetMethodHandlerAsync("LockDoor", LockDoor, null);
        Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null);
    
        Console.WriteLine("Waiting for direct method call and device twin update\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        Client.SetMethodHandlerAsync("LockDoor", null, null);
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  11. Sla uw werk op en bouw uw oplossing.

Notitie

Om het eenvoudig te houden, implementeert dit artikel geen beleid voor opnieuw proberen. In productiecode moet u beleid voor opnieuw proberen (zoals opnieuw proberen van verbinding) implementeren, zoals wordt voorgesteld in de afhandeling van tijdelijke fouten.

De IoT Hub-verbindingsreeks ophalen

In dit artikel maakt u een back-endservice die een taak plant om een directe methode op een apparaat aan te roepen, een taak plant om de apparaatdubbel bij te werken en de voortgang van elke taak bewaakt. Om deze bewerkingen uit te voeren, heeft uw service de lees- en schrijfmachtigingen voor het register nodig. Standaard wordt elke IoT-hub gemaakt met een gedeeld toegangsbeleid met de naam registryReadWrite dat deze machtigingen verleent.

Voer de volgende stappen uit om de IoT Hub-verbindingsreeks voor het registerReadWrite-beleid op te halen:

  1. Selecteer resourcegroepen in de Azure-portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.

  2. Selecteer in het linkerdeelvenster van uw hub beleid voor gedeelde toegang.

  3. Selecteer in de lijst met beleidsregels het registerReadWrite-beleid .

  4. Kopieer de primaire verbindingsreeks en sla de waarde op.

    Schermopname die laat zien hoe u de verbindingsreeks ophaalt

Zie Toegangsbeheer en machtigingen voor meer informatie over beleid en machtigingen voor gedeelde toegang van IoT Hub.

Belangrijk

Dit artikel bevat stappen voor het maken van verbinding met een service met behulp van een handtekening voor gedeelde toegang. Deze verificatiemethode is handig voor testen en evalueren, maar verificatie bij een service met Microsoft Entra ID of beheerde identiteiten is een veiligere benadering. Zie Best practices > voor beveiliging voor cloudbeveiliging voor meer informatie.

Taken plannen voor het aanroepen van een directe methode en het verzenden van apparaatdubbelupdates

In deze sectie maakt u een .NET-console-app (met behulp van C#) die gebruikmaakt van taken om de directe methode LockDoor aan te roepen en gewenste eigenschapsupdates naar meerdere apparaten te verzenden.

  1. Selecteer in Visual Studio Bestand>Nieuw>Project. Kies in Een nieuw project maken console-app (.NET Framework) en selecteer vervolgens Volgende.

  2. Geef in Het nieuwe project configureren de naam van het project ScheduleJob en selecteer Vervolgens Maken.

    Geef een naam en configureer het ScheduleJob-project

    Schermopname van de pop-up 'Uw nieuwe project configureren' in Visual Studio, waar u een naam toevoegt.

  3. Accepteer de standaardversie van .NET Framework en selecteer Vervolgens Maken om het project te maken.

  4. Klik in Solution Explorer met de rechtermuisknop op het ScheduleJob-project en selecteer NuGet-pakketten beheren.

  5. Selecteer In de NuGet-Pakketbeheer bladeren, zoek en kies Microsoft.Azure.Devices en selecteer Vervolgens Installeren.

    Met deze stap downloadt, installeert en voegt u een verwijzing toe naar het NuGet-pakket van de Azure IoT-service-SDK en de bijbehorende afhankelijkheden.

  6. Voeg aan het begin van het bestand Program.cs de volgende using-instructies toe:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. Voeg de volgende using instructie toe als deze nog niet aanwezig is in de standaardinstructies.

    using System.Threading;
    using System.Threading.Tasks;
    
  8. Voeg de volgende velden toe aan de klasse Program: Vervang de tijdelijke aanduidingen door de IoT Hub-verbindingsreeks die u eerder hebt gekopieerd in De IoT-hub ophalen verbindingsreeks en de naam van uw apparaat.

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. Voeg de volgende methode toe aan de klasse Program:

    public static async Task MonitorJob(string jobId)
    {
        JobResponse result;
        do
        {
            result = await jobClient.GetJobAsync(jobId);
            Console.WriteLine("Job Status : " + result.Status.ToString());
            Thread.Sleep(2000);
        } while ((result.Status != JobStatus.Completed) && 
          (result.Status != JobStatus.Failed));
    }
    
  10. Voeg de volgende methode toe aan de klasse Program:

    public static async Task StartMethodJob(string jobId)
    {
        CloudToDeviceMethod directMethod = 
          new CloudToDeviceMethod("LockDoor", TimeSpan.FromSeconds(5), 
          TimeSpan.FromSeconds(5));
    
        JobResponse result = await jobClient.ScheduleDeviceMethodAsync(jobId,
            $"DeviceId IN ['{deviceId}']",
            directMethod,
            DateTime.UtcNow,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Method Job");
    }
    
  11. Voeg een andere methode toe aan de klasse Program :

    public static async Task StartTwinUpdateJob(string jobId)
    {
        Twin twin = new Twin(deviceId);
        twin.Tags = new TwinCollection();
        twin.Tags["Building"] = "43";
        twin.Tags["Floor"] = "3";
        twin.ETag = "*";
    
        twin.Properties.Desired["LocationUpdate"] = DateTime.UtcNow;
    
        JobResponse createJobResponse = jobClient.ScheduleTwinUpdateAsync(
            jobId,
            $"DeviceId IN ['{deviceId}']", 
            twin, 
            DateTime.UtcNow, 
            (long)TimeSpan.FromMinutes(2).TotalSeconds).Result;
    
        Console.WriteLine("Started Twin Update Job");
    }
    

    Notitie

    Zie ioT Hub-querytaal voor meer informatie over querysyntaxis.

  12. Voeg tot slot de volgende regels toe aan de methode Main:

    Console.WriteLine("Press ENTER to start running jobs.");
    Console.ReadLine();
    
    jobClient = JobClient.CreateFromConnectionString(connString);
    
    string methodJobId = Guid.NewGuid().ToString();
    
    StartMethodJob(methodJobId);
    MonitorJob(methodJobId).Wait();
    Console.WriteLine("Press ENTER to run the next job.");
    Console.ReadLine();
    
    string twinUpdateJobId = Guid.NewGuid().ToString();
    
    StartTwinUpdateJob(twinUpdateJobId);
    MonitorJob(twinUpdateJobId).Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  13. Sla uw werk op en bouw uw oplossing.

De apps uitvoeren

U kunt nu de apps uitvoeren.

  1. Klik in Visual Studio Solution Explorer met de rechtermuisknop op uw oplossing en selecteer StartUp Projects instellen.

  2. Selecteer Common Properties>Startup Project en selecteer vervolgens Meerdere opstartprojecten.

  3. Zorg ervoor dat u SimulateDeviceMethods boven aan de lijst staat, gevolgd door ScheduleJob. Stel beide acties in op Starten en selecteer OK.

  4. Voer de projecten uit door op Start te klikken of naar het menu Foutopsporing te gaan en op Foutopsporing starten te klikken.

    U ziet de uitvoer van zowel apparaat- als back-end-apps.

    De apps uitvoeren om taken te plannen

Volgende stappen

In dit artikel hebt u taken gepland om een directe methode uit te voeren en de eigenschappen van de apparaatdubbel bij te werken.

Als u ioT Hub- en apparaatbeheerpatronen wilt blijven verkennen, werkt u een afbeelding bij in de zelfstudie Apparaatupdate voor Azure IoT Hub met behulp van de Raspberry Pi 3 B+ Reference Image.