Planowanie i emisja zadań (.NET)
Usługa Azure IoT Hub umożliwia planowanie i śledzenie zadań, które aktualizują 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 możliwości, zobacz:
Bliźniacze reprezentacje urządzenia i właściwości: Wprowadzenie do bliźniaczych reprezentacji urządzeń oraz Omówienie bliźniaczych reprezentacji urządzeń i korzystanie z nich w usłudze IoT Hub
Metody bezpośrednie: Przewodnik dewelopera usługi IoT Hub — metody bezpośrednie
Uwaga
Funkcje opisane w tym artykule są dostępne tylko w warstwie Standardowa usługi IoT Hub. Aby uzyskać więcej informacji na temat warstw podstawowej i standardowej/bezpłatnej usługi IoT Hub, zobacz Wybieranie odpowiedniej warstwy usługi 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 inne zadanie 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 kompilowania aplikacji urządzeń i zaplecza.
Wymagania wstępne
Visual Studio.
Centrum IoT w ramach subskrypcji platformy Azure. Jeśli nie masz jeszcze centrum, możesz wykonać kroki opisane w temacie Tworzenie centrum IoT Hub.
Urządzenie zarejestrowane w centrum IoT Hub. Jeśli nie masz urządzenia w centrum IoT Hub, wykonaj kroki opisane w temacie Rejestrowanie urządzenia.
Upewnij się, że port 8883 jest otwarty w zaporze. Przykład urządzenia w tym artykule używa protokołu MQTT, który komunikuje się za pośrednictwem portu 8883. Ten port może zostać zablokowany w niektórych środowiskach sieci firmowych i edukacyjnych. Aby uzyskać więcej informacji i sposobów obejścia tego problemu, zobacz Nawiązywanie połączenia z usługą IoT Hub (MQTT).
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.
Ważne
Ten artykuł zawiera kroki łączenia urządzenia przy użyciu sygnatury dostępu współdzielonego, nazywanej również uwierzytelnianiem klucza symetrycznego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie urządzenia przy użyciu certyfikatów X.509 jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Zabezpieczenia najlepszych rozwiązań > zabezpieczeń Zabezpieczenia zabezpieczeń Zabezpieczenia zabezpieczeń.
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ć.
W obszarze Konfigurowanie nowego projektu nadaj projektowi nazwę SimulateDeviceMethods , a następnie wybierz pozycję Dalej.
Zaakceptuj domyślną wersję programu .NET Framework, a następnie wybierz pozycję Utwórz , aby utworzyć projekt.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt SimulateDeviceMethods, a następnie wybierz pozycję Zarządzaj pakietami NuGet.
W Menedżer pakietów NuGet wybierz pozycję Przeglądaj i wyszukaj i wybierz pozycję Microsoft.Azure.Devices.Client. Wybierz Zainstaluj.
Ten krok pobiera, instaluje i dodaje odwołanie do pakietu NuGet zestawu SDK urządzeń usługi Azure IoT oraz jego zależności.
Dodaj następujące instrukcje
using
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;
Dodaj następujące pola do klasy Program: Zastąp wartość symbolu zastępczego parametry połączenia urządzenia zanotowaną w poprzedniej sekcji:
static string DeviceConnectionString = "<yourDeviceConnectionString>"; static DeviceClient Client = null;
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)); }
Dodaj następującą metodę, aby zaimplementować odbiornik bliźniaczych reprezentacji urządzenia na urządzeniu:
private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext) { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); }
Na koniec dodaj następujący kod do metody Main , aby otworzyć połączenie z centrum IoT Hub 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); }
Zapisz swoją pracę i skompiluj rozwiązanie.
Uwaga
Aby zachować prostotę, ten artykuł nie implementuje zasad ponawiania prób. W kodzie produkcyjnym należy zaimplementować zasady ponawiania prób (takie jak ponawianie próby połączenia), zgodnie z sugestią w temacie Obsługa błędów przejściowych.
Pobieranie parametry 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 usługi IoT Hub dla zasad registryReadWrite, wykonaj następujące kroki:
W witrynie 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.
W okienku po lewej stronie centrum wybierz pozycję Zasady dostępu współdzielonego.
Z listy zasad wybierz zasady registryReadWrite .
Skopiuj parametry połączenia podstawową i zapisz wartość.
Aby uzyskać więcej informacji na temat zasad dostępu współdzielonego i uprawnień usługi IoT Hub, zobacz Kontrola dostępu i uprawnienia.
Ważne
Ten artykuł zawiera kroki nawiązywania połączenia z usługą przy użyciu sygnatury dostępu współdzielonego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie w usłudze przy użyciu identyfikatora Entra firmy Microsoft lub tożsamości zarządzanych jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Security best practices Cloud security (Najlepsze rozwiązania > dotyczące zabezpieczeń w chmurze).
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ń.
W programie Visual Studio wybierz pozycje Plik>Nowy>Projekt. W obszarze Utwórz nowy projekt wybierz pozycję Aplikacja konsolowa (.NET Framework), a następnie wybierz przycisk Dalej.
W obszarze Konfigurowanie nowego projektu nadaj projektowi nazwę ScheduleJob , a następnie wybierz pozycję Utwórz.
Zaakceptuj domyślną wersję programu .NET Framework, a następnie wybierz pozycję Utwórz , aby utworzyć projekt.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt ScheduleJob, a następnie wybierz polecenie Zarządzaj pakietami NuGet.
W Menedżer pakietów NuGet wybierz pozycję Przeglądaj, wyszukaj i wybierz pozycję Microsoft.Azure.Devices, a następnie wybierz pozycję Zainstaluj.
Ten krok pobiera, instaluje i dodaje odwołanie do pakietu NuGet zestawu SDK usługi Azure IoT oraz jego zależności.
Dodaj następujące instrukcje
using
w górnej części pliku Program.cs:using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Shared;
Dodaj następującą
using
instrukcję, jeśli jeszcze nie istnieje w instrukcjach domyślnych.using System.Threading; using System.Threading.Tasks;
Dodaj następujące pola do klasy Program: Zastąp symbole zastępcze parametry połączenia usługi IoT Hub skopiowanymi wcześniej w sekcji Pobierz parametry połączenia centrum IoT i nazwę urządzenia.
static JobClient jobClient; static string connString = "<yourIotHubConnectionString>"; static string deviceId = "<yourDeviceId>";
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)); }
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"); }
Dodaj inną 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 Język zapytań usługi IoT Hub.
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();
Zapisz swoją pracę i skompiluj rozwiązanie.
Uruchamianie aplikacji
Teraz można przystąpić do uruchomienia aplikacji.
W programie Visual Studio Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie, a następnie wybierz polecenie Ustaw projekty startowe.
Wybierz pozycję Wspólny projekt startowy właściwości>, a następnie wybierz pozycję Wiele projektów startowych.
Upewnij się, że
SimulateDeviceMethods
znajduje się w górnej części listy, po której znajduje sięScheduleJob
ciąg . Ustaw obie akcje na Start , a następnie wybierz przycisk OK.Uruchom projekty, klikając przycisk Start lub przejdź do menu Debugowanie , a następnie kliknij przycisk Rozpocznij debugowanie.
Zobaczysz dane wyjściowe zarówno z aplikacji urządzenia, jak i zaplecza.
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 usługą IoT Hub i urządzeniami, zaktualizuj obraz w samouczku Dotyczącym aktualizacji urządzenia dla usługi Azure IoT Hub przy użyciu obrazu referencyjnego urządzenia Raspberry Pi 3 B+ .