Planowanie i emisja zadań (.NET)

Użyj Azure IoT Hub, aby zaplanować i śledzić zadania aktualizujące miliony urządzeń. Użyj zadań, aby:

  • Aktualizowanie żądanych właściwości

  • Aktualizowanie tagów

  • Wywoływanie metod bezpośrednich

Zadanie opakowuje jedną z tych akcji i śledzi wykonywanie względem zestawu urządzeń zdefiniowanych przez zapytanie bliźniaczej reprezentacji urządzenia. Na przykład aplikacja zaplecza może użyć zadania do wywołania metody bezpośredniej na 10 000 urządzeniach, które ponownie uruchamiają urządzenia. Należy określić zestaw urządzeń z zapytaniem bliźniaczej reprezentacji urządzenia i zaplanować uruchomienie zadania w przyszłości. Zadanie śledzi postęp, gdy każdy z urządzeń odbiera i wykonuje metodę bezpośrednią ponownego rozruchu.

Aby dowiedzieć się więcej o każdej z tych funkcji, zobacz:

Uwaga

Funkcje opisane w tym artykule są dostępne tylko w warstwie Standardowa IoT Hub. Aby uzyskać więcej informacji o warstwach podstawowa i Standardowa/Bezpłatna IoT Hub, zobacz Wybieranie odpowiedniej warstwy IoT Hub dla rozwiązania.

W tym artykule pokazano, jak utworzyć dwie aplikacje konsolowe platformy .NET (C#):

  • Aplikacja urządzenia SimulateDeviceMethods implementuje metodę bezpośrednią o nazwie LockDoor, którą można wywołać przez aplikację zaplecza.

  • Aplikacja zaplecza , ScheduleJob, która tworzy dwa zadania. Jedno zadanie wywołuje metodę bezpośrednią lockDoor , a drugie wysyła żądane aktualizacje właściwości do wielu urządzeń.

Uwaga

Zobacz Zestawy SDK usługi Azure IoT , aby uzyskać więcej informacji na temat narzędzi zestawu SDK dostępnych do tworzenia aplikacji zarówno urządzeń, jak i zaplecza.

Wymagania wstępne

Tworzenie aplikacji symulowanego urządzenia

W tej sekcji utworzysz aplikację konsolową platformy .NET, która odpowiada na metodę bezpośrednią wywoływaną przez zaplecze rozwiązania.

  1. W programie Visual Studio wybierz pozycję Utwórz nowy projekt, a następnie wybierz szablon projektu Aplikacja konsolowa (.NET Framework). Wybierz przycisk Dalej, aby kontynuować.

  2. W obszarze Konfigurowanie nowego projektu nadaj projektowi nazwę SimulateDeviceMethods , a następnie wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający wyskakujące okienko

  3. Zaakceptuj domyślną wersję .NET Framework a następnie wybierz pozycję Utwórz, aby utworzyć projekt.

  4. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt SimulateDeviceMethods, a następnie wybierz pozycję Zarządzaj pakietami NuGet.

  5. W Menedżerze pakietów NuGet wybierz pozycję Przeglądaj i wyszukaj i wybierz pozycję Microsoft.Azure.Devices.Client. Wybierz pozycję Zainstaluj.

    Zrzut ekranu przedstawiający Menedżera pakietów NuGet w programie Visual Studio.

    Ten krok umożliwia pobranie, zainstalowanie i dodanie odwołania do pakietu NuGet zestawu SDK urządzenia usługi Azure IoT oraz jego zależności.

  6. Dodaj następujące using instrukcje w górnej części pliku Program.cs :

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. Dodaj następujące pola do klasy Program: Zastąp wartość symbolu zastępczego parametrami połączenia urządzenia zanotowanymi w poprzedniej sekcji:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. Dodaj następujący kod, aby zaimplementować metodę bezpośrednią na urządzeniu:

    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. Dodaj następującą metodę, aby zaimplementować odbiornik bliźniaczych reprezentacji urządzeń na urządzeniu:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. Na koniec dodaj następujący kod do metody Main , aby otworzyć połączenie z centrum IoT i zainicjować odbiornik metody:

    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. Zapisz swoją pracę i skompiluj rozwiązanie.

Uwaga

Aby zachować prostotę, ten artykuł nie implementuje zasad ponawiania. W kodzie produkcyjnym należy zaimplementować zasady ponawiania (takie jak ponawianie próby połączenia), zgodnie z sugestią w obsłudze błędów przejściowych.

Pobieranie parametrów połączenia centrum IoT

W tym artykule tworzysz usługę zaplecza, która planuje wywołanie metody bezpośredniej na urządzeniu, planuje zadanie aktualizacji bliźniaczej reprezentacji urządzenia i monitoruje postęp każdego zadania. Aby wykonać te operacje, usługa wymaga uprawnień do odczytu rejestru i zapisu rejestru . Domyślnie każde centrum IoT jest tworzone przy użyciu zasad dostępu współdzielonego o nazwie registryReadWrite , które przyznaje te uprawnienia.

Aby uzyskać parametry połączenia IoT Hub dla zasad registryReadWrite, wykonaj następujące kroki:

  1. W Azure Portal wybierz pozycję Grupy zasobów. Wybierz grupę zasobów, w której znajduje się centrum, a następnie wybierz centrum z listy zasobów.

  2. W okienku po lewej stronie centrum wybierz pozycję Zasady dostępu współdzielonego.

  3. Z listy zasad wybierz zasady registryReadWrite .

  4. Skopiuj podstawowe parametry połączenia i zapisz wartość.

    Przechwytywanie ekranu pokazujące sposób pobierania parametrów połączenia

Aby uzyskać więcej informacji na temat IoT Hub zasad dostępu współdzielonego i uprawnień, zobacz Kontrola dostępu i uprawnienia.

Planowanie zadań na potrzeby wywoływania metody bezpośredniej i wysyłania aktualizacji bliźniaczej reprezentacji urządzenia

W tej sekcji utworzysz aplikację konsolową platformy .NET (przy użyciu języka C#), która używa zadań do wywoływania metody bezpośredniej LockDoor i wysyłania aktualizacji żądanych właściwości do wielu urządzeń.

  1. W programie Visual Studio wybierz pozycję Plik>nowy>projekt. W obszarze Utwórz nowy projekt wybierz pozycję Aplikacja konsolowa (.NET Framework),a następnie wybierz przycisk Dalej.

  2. W obszarze Konfigurowanie nowego projektu nadaj projektowi nazwę ScheduleJob , a następnie wybierz pozycję Utwórz.

    Nadaj nazwę i skonfiguruj projekt ScheduleJob

    Zrzut ekranu przedstawiający wyskakujące okienko

  3. Zaakceptuj domyślną wersję .NET Framework a następnie wybierz pozycję Utwórz, aby utworzyć projekt.

  4. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt ScheduleJob, a następnie wybierz polecenie Zarządzaj pakietami NuGet.

  5. W Menedżerze pakietów NuGet wybierz pozycję Przeglądaj, wyszukaj i wybierz pozycję Microsoft.Azure.Devices, a następnie wybierz pozycję Zainstaluj.

    Ten krok umożliwia pobranie, zainstalowanie i dodanie odwołania do pakietu NuGet zestawu SDK usługi Azure IoT oraz jego zależności.

  6. Dodaj następujące using instrukcje w górnej części pliku Program.cs :

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. Dodaj następującą using instrukcję, jeśli jeszcze nie istnieje w instrukcjach domyślnych.

    using System.Threading;
    using System.Threading.Tasks;
    
  8. Dodaj następujące pola do klasy Program: Zastąp symbole zastępcze parametrami połączenia IoT Hub skopiowanymi wcześniej w sekcji Pobieranie parametrów połączenia centrum IoT i nazwy urządzenia.

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. Dodaj następującą metodę do klasy 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. Dodaj następującą metodę do klasy 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. Dodaj kolejną metodę do klasy 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");
    }
    

    Uwaga

    Aby uzyskać więcej informacji na temat składni zapytań, zobacz IoT Hub języka zapytań.

  12. Na koniec dodaj następujące wiersze do metody Główne:

    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. Zapisz swoją pracę i skompiluj rozwiązanie.

Uruchamianie aplikacji

Teraz można przystąpić do uruchomienia aplikacji.

  1. W programie Visual Studio Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie, a następnie wybierz polecenie Ustaw projekty startowe.

  2. Wybierz pozycję Wspólny projekt startowy właściwości>, a następnie wybierz pozycję Wiele projektów startowych.

  3. Upewnij się, że SimulateDeviceMethods znajduje się u góry listy, po której znajduje się ciąg ScheduleJob. Ustaw obie akcje na Start i wybierz przycisk OK.

  4. Uruchom projekty, klikając przycisk Start lub przejdź do menu Debugowanie , a następnie kliknij przycisk Rozpocznij debugowanie.

    Dane wyjściowe są wyświetlane zarówno z aplikacji urządzenia, jak i zaplecza.

    Uruchamianie aplikacji do planowania zadań

Następne kroki

W tym artykule zaplanowano zadania uruchamiania metody bezpośredniej i aktualizowania właściwości bliźniaczej reprezentacji urządzenia.

Aby kontynuować eksplorowanie wzorców zarządzania IoT Hub i urządzeń, zaktualizuj obraz w temacie Device Update for Azure IoT Hub tutorial using the Raspberry Pi 3 B+ Reference Image (Obraz referencyjny urządzenia Raspberry Pi 3 B+).