Dela via


Schemalägga och sända jobb (.NET)

Använd Azure IoT Hub för att schemalägga och spåra jobb som uppdaterar miljontals enheter. Använd jobb för att:

  • Uppdatera önskade egenskaper

  • Uppdatera taggar

  • Anropa direktmetoder

Ett jobb omsluter en av dessa åtgärder och spårar körningen mot en uppsättning enheter som definieras av en enhetstvillingfråga. En serverdelsapp kan till exempel använda ett jobb för att anropa en direktmetod på 10 000 enheter som startar om enheterna. Du anger uppsättningen enheter med en enhetstvillingfråga och schemalägger jobbet så att det körs vid en framtida tidpunkt. Jobbet spårar förloppet när var och en av enheterna tar emot och kör direktmetoden för omstart.

Mer information om var och en av dessa funktioner finns i:

Kommentar

De funktioner som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om de grundläggande och standard-/kostnadsfria IoT Hub-nivåerna finns i Välj rätt IoT Hub-nivå för din lösning.

Den här artikeln visar hur du skapar två .NET-konsolappar (C#):

  • En enhetsapp, SimulateDeviceMethods, som implementerar en direktmetod som heter LockDoor, som kan anropas av serverdelsappen.

  • En serverdelsapp, ScheduleJob, som skapar två jobb. Ett jobb anropar lockDoor-direktmetoden och ett annat jobb skickar önskade egenskapsuppdateringar till flera enheter.

Förutsättningar

  • Visual Studio.

  • En IoT-hubb i din Azure-prenumeration. Om du inte har någon hubb ännu kan du följa stegen i Skapa en IoT-hubb.

  • En enhet som är registrerad i din IoT-hubb. Om du inte har en enhet i din IoT-hubb följer du stegen i Registrera en enhet.

  • Kontrollera att port 8883 är öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar via port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Ansluta till IoT Hub (MQTT).

Skapa en simulerad enhetsapp

I det här avsnittet skapar du en .NET-konsolapp som svarar på en direktmetod som anropas av lösningens serverdel.

Viktigt!

Den här artikeln innehåller steg för att ansluta en enhet med en signatur för delad åtkomst, även kallad symmetrisk nyckelautentisering. Den här autentiseringsmetoden är praktisk för testning och utvärdering, men att autentisera en enhet med X.509-certifikat är en säkrare metod. Mer information finns i Metodtips > för säkerhet Anslutningssäkerhet.

  1. I Visual Studio väljer du Skapa ett nytt projekt och väljer sedan projektmallen Konsolapp (.NET Framework). Klicka på Nästa när du vill fortsätta.

  2. I Konfigurera det nya projektet namnger du projektet SimulateDeviceMethods och väljer sedan Nästa.

    Skärmbild av popup-fönstret Konfigurera ditt nya projekt i Visual Studio.

  3. Acceptera standardversionen av .NET Framework och välj sedan Skapa för att skapa projektet.

  4. Högerklicka på projektet SimulateDeviceMethods i Solution Explorer och välj sedan Hantera NuGet-paket.

  5. I NuGet Package Manager väljer du Bläddra och sök efter och väljer Microsoft.Azure.Devices.Client. Välj Installera.

    Skärmbild av NuGet Package Manager i Visual Studio.

    Det här steget laddar ned, installerar och lägger till en referens till Azure IoT-enhetens SDK NuGet-paket och dess beroenden.

  6. Lägg till följande using-uttryck överst i Program.cs-filen:

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. Lägg till följande fält i klassen Program. Ersätt platshållarvärdet med enheten anslutningssträng som du antecknade i föregående avsnitt:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. Lägg till följande kod för att implementera direktmetoden på enheten:

    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. Lägg till följande metod för att implementera lyssnaren för enhetstvillingar på enheten:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. Lägg slutligen till följande kod i main-metoden för att öppna anslutningen till din IoT-hubb och initiera metodlyssnaren:

    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. Spara ditt arbete och skapa din lösning.

Kommentar

För att hålla det enkelt implementerar den här artikeln inte några återförsöksprinciper. I produktionskod bör du implementera återförsöksprinciper (till exempel återförsök av anslutningen), enligt förslaget i Tillfälliga felhantering.

Hämta IoT Hub-anslutningssträng

I den här artikeln skapar du en serverdelstjänst som schemalägger ett jobb för att anropa en direktmetod på en enhet, schemalägger ett jobb för att uppdatera enhetstvillingen och övervakar förloppet för varje jobb. För att utföra dessa åtgärder behöver tjänsten behörigheterna för registerläsning och registerskrivning . Som standard skapas varje IoT-hubb med en princip för delad åtkomst med namnet registryReadWrite som ger dessa behörigheter.

Följ dessa steg för att hämta IoT Hub-anslutningssträng för registryReadWrite-principen:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan din hubb i listan över resurser.

  2. I den vänstra rutan i hubben väljer du Principer för delad åtkomst.

  3. I listan över principer väljer du registerReadWrite-principen .

  4. Kopiera den primära anslutningssträng och spara värdet.

    Skärmbild som visar hur du hämtar anslutningssträng

Mer information om principer och behörigheter för delad åtkomst i IoT Hub finns i Åtkomstkontroll och behörigheter.

Viktigt!

Den här artikeln innehåller steg för att ansluta till en tjänst med hjälp av en signatur för delad åtkomst. Den här autentiseringsmetoden är praktisk för testning och utvärdering, men autentisering till en tjänst med Microsoft Entra-ID eller hanterade identiteter är en säkrare metod. Mer information finns i Metodtips för > säkerhet Molnsäkerhet.

Schemalägga jobb för att anropa en direktmetod och skicka uppdateringar av enhetstvillingar

I det här avsnittet skapar du en .NET-konsolapp (med C#) som använder jobb för att anropa LockDoor-direktmetoden och skicka önskade egenskapsuppdateringar till flera enheter.

  1. Välj Arkiv>Nytt>Projekt i Visual Studio. I Skapa ett nytt projekt väljer du Konsolapp (.NET Framework) och sedan Nästa.

  2. I Konfigurera det nya projektet ger du projektet namnet ScheduleJob och väljer sedan Skapa.

    Namnge och konfigurera schedulejob-projektet

    Skärmbild av popup-fönstret

  3. Acceptera standardversionen av .NET Framework och välj sedan Skapa för att skapa projektet.

  4. Högerklicka på projektet ScheduleJob i Solution Explorer och välj sedan Hantera NuGet-paket.

  5. I NuGet Package Manager väljer du Bläddra, söker efter och väljer Microsoft.Azure.Devices och sedan Installera.

    Det här steget laddar ned, installerar och lägger till en referens till Azure IoT Service SDK NuGet-paketet och dess beroenden.

  6. Lägg till följande using-uttryck överst i Program.cs-filen:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. Lägg till följande using -instruktion om den inte redan finns i standardinstruktionerna.

    using System.Threading;
    using System.Threading.Tasks;
    
  8. Lägg till följande fält i klassen Program. Ersätt platshållarna med IoT Hub-anslutningssträng som du kopierade tidigare i Hämta IoT Hub-anslutningssträng och namnet på enheten.

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. Lägg till följande metod i klassen 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. Lägg till följande metod i klassen 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. Lägg till en annan metod i klassen 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");
    }
    

    Kommentar

    Mer information om frågesyntax finns i frågespråket IoT Hub.

  12. Slutligen lägger du till följande rader till Main-metoden:

    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. Spara ditt arbete och skapa din lösning.

Köra apparna

Nu är det dags att köra apparna.

  1. I Visual Studio Solution Explorer högerklickar du på din lösning och väljer sedan Ange startprojekt.

  2. Välj Startprojekt för vanliga egenskaper>och välj sedan Flera startprojekt.

  3. Kontrollera att SimulateDeviceMethods är överst i listan följt av ScheduleJob. Ange båda deras åtgärder till Start och välj OK.

  4. Kör projekten genom att klicka på Start eller gå till felsökningsmenyn och klicka på Starta felsökning.

    Du ser utdata från både enhets- och serverdelsappar.

    Kör apparna för att schemalägga jobb

Nästa steg

I den här artikeln har du schemalagt jobb för att köra en direktmetod och uppdatera enhetstvillingens egenskaper.

Om du vill fortsätta utforska IoT Hub- och enhetshanteringsmönster uppdaterar du en avbildning i självstudiekursen Enhetsuppdatering för Azure IoT Hub med hjälp av Raspberry Pi 3 B+-referensbilden.