Wysyłanie komunikatów z chmury do urządzenia przy użyciu IoT Hub (.NET)

Azure IoT Hub to w pełni zarządzana usługa, która ułatwia niezawodną i bezpieczną dwukierunkową komunikację między milionami urządzeń a zapleczem rozwiązania.

W tym artykule wyjaśniono, jak:

  • Wysyłanie komunikatów chmury do urządzenia (C2D) z zaplecza rozwiązania do jednego urządzenia za pośrednictwem IoT Hub

  • Odbieranie komunikatów z chmury do urządzenia

  • Żądanie potwierdzenia dostarczenia (opinii) z zaplecza rozwiązania w przypadku komunikatów wysyłanych do urządzenia z IoT Hub

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.

Na końcu tego artykułu uruchomisz dwie aplikacje konsolowe platformy .NET.

  • MessageReceiveSample: przykładowa aplikacja urządzenia dołączona do zestawu SDK usługi Microsoft Azure IoT dla platformy .NET, która łączy się z centrum IoT Hub i odbiera komunikaty z chmury do urządzenia.

  • SendCloudToDevice: aplikacja usługi, która wysyła komunikat z chmury do urządzenia do aplikacji urządzenia za pośrednictwem IoT Hub, a następnie otrzymuje potwierdzenie dostarczenia.

Uwaga

IoT Hub ma obsługę zestawu SDK dla wielu platform urządzeń i języków (C, Java, Python i JavaScript) za pomocą zestawów SDK urządzeń usługi Azure IoT.

Więcej informacji na temat komunikatów chmura-urządzenie można znaleźć w komunikatach D2C i C2D przy użyciu IoT Hub.

Wymagania wstępne

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

  • Centrum IoT Hub w ramach subskrypcji platformy Azure. Jeśli nie masz jeszcze centrum, możesz wykonać kroki opisane w temacie Tworzenie centrum IoT.

  • Urządzenie zarejestrowane w centrum IoT Hub. Jeśli urządzenie nie zostało jeszcze zarejestrowane, zarejestruj je w Azure Portal.

  • W tym artykule użyto przykładowego kodu z zestawu Azure IoT SDK dla języka C#.

    • Pobierz lub sklonuj repozytorium zestawu SDK z usługi GitHub na maszynę deweloperską.
    • Upewnij się, że platforma .NET Core 3.0.0 lub nowsza jest zainstalowana na komputerze deweloperskim. Sprawdź wersję, uruchamiając dotnet --version program .NET i pobierając go w razie potrzeby.
  • 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 być zablokowany w niektórych środowiskach sieci firmowych i edukacyjnych. Aby uzyskać więcej informacji i sposobów obejścia tego problemu, zobacz Connecting to IoT Hub (MQTT) (Nawiązywanie połączenia z IoT Hub (MQTT).

  • Programu Visual Studio.

Pobieranie parametrów połączenia urządzenia

W tym artykule uruchomisz przykładową aplikację, która symuluje urządzenie, które odbiera komunikaty z chmury do urządzenia wysyłane za pośrednictwem IoT Hub. Przykładowa aplikacja MessageReceiveSample dołączona do zestawu SDK usługi Microsoft Azure IoT dla platformy .NET łączy się z centrum IoT i działa jako symulowane urządzenie. W przykładzie użyto podstawowych parametrów połączenia zarejestrowanego urządzenia w centrum IoT.

Aby uzyskać podstawowe parametry połączenia dla urządzenia zarejestrowanego w centrum IoT Hub, 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 IoT Hub w obszarze Zarządzanie urządzeniami wybierz pozycję Urządzenia.

  3. Z listy urządzeń wybierz odpowiednie urządzenie.

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

    Zrzut ekranu przedstawiający sposób pobierania podstawowych parametrów połączenia dla urządzenia zarejestrowanego w centrum IoT w Azure Portal.

Odbieranie komunikatów w aplikacji urządzenia

W tej sekcji uruchom przykładową aplikację urządzenia MessageReceiveSample , aby odbierać komunikaty C2D wysyłane za pośrednictwem centrum IoT. Otwórz nowy wiersz polecenia i przejdź do folderu azure-iot-sdk-csharp\iothub\device\samples\getting started\MessageReceiveSample w folderze, w którym rozszerzono zestaw SDK języka C# usługi Azure IoT. Uruchom następujące polecenia, zastępując wartość symbolu {Your device connection string} zastępczego parametrami połączenia urządzenia skopiowanymi z zarejestrowanego urządzenia w centrum IoT.

dotnet restore
dotnet run --c "{Your device connection string}"

Następujące dane wyjściowe pochodzą z przykładowej aplikacji urządzenia po pomyślnym uruchomieniu i nawiązaniu połączenia z centrum IoT:

5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
     
5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.

Przykładowa aplikacja urządzenia sonduje komunikaty przy użyciu metod ReceiveAsync i CompleteAsync . Metoda ReceiveC2dMessagesPollingAndCompleteAsync używa ReceiveAsync metody , która asynchronicznie zwraca odebrany komunikat w momencie odebrania komunikatu przez urządzenie. ReceiveAsync Zwraca wartość null po określonym przedziale czasu. W tym przykładzie jest używana wartość domyślna jednej minuty. Gdy urządzenie otrzyma wartość null, powinno nadal czekać na nowe komunikaty. To wymaganie jest powodem, dla którego przykładowa aplikacja zawiera następujący blok kodu w metodzie ReceiveC2dMessagesPollingAndCompleteAsync :

   if (receivedMessage == null)
   {
      continue;
   }

Wywołanie CompleteAsync metody powiadamia IoT Hub, że komunikat został pomyślnie przetworzony i że komunikat można bezpiecznie usunąć z kolejki urządzenia. Urządzenie powinno wywołać tę metodę po pomyślnym zakończeniu przetwarzania niezależnie od używanego protokołu.

W przypadku protokołów AMQP i HTTPS, ale nie protokołu MQTT, urządzenie może również:

  • Porzucanie komunikatu, co powoduje IoT Hub zachowanie komunikatu w kolejce urządzenia na potrzeby przyszłego użycia.
  • Odrzuć komunikat, który trwale usuwa komunikat z kolejki urządzenia.

Jeśli wystąpi coś, co uniemożliwia ukończenie, porzucenie lub odrzucenie komunikatu przez urządzenie, IoT Hub, po upływie ustalonego limitu czasu, ponownie ustawi komunikat w kolejce do dostarczenia. Z tego powodu logika przetwarzania komunikatów w aplikacji urządzenia musi być idempotentna, dzięki czemu odbieranie tego samego komunikatu wiele razy generuje ten sam wynik.

Aby uzyskać więcej informacji na temat cyklu życia komunikatów z chmury do urządzenia i sposobu IoT Hub przetwarzania komunikatów z chmury do urządzenia, zobacz Wysyłanie komunikatów z chmury do urządzenia z centrum IoT Hub.

Uwaga

W przypadku używania protokołu HTTPS zamiast protokołu MQTT lub AMQP jako transportu ReceiveAsync metoda zwraca natychmiast. Obsługiwany wzorzec dla komunikatów chmura-urządzenie z protokołem HTTPS jest sporadycznie połączonych urządzeń, które sprawdzają komunikaty rzadko (co najmniej co 25 minut). Wystawianie większej liczby żądań HTTPS odbiera wyniki w IoT Hub ograniczania żądań. Aby uzyskać więcej informacji na temat różnic między obsługą protokołów MQTT, AMQP i HTTPS, zobacz Wskazówki dotyczące komunikacji między chmurą i urządzeniem i Wybieranie protokołu komunikacyjnego.

Pobieranie parametrów połączenia centrum IoT

W tym artykule utworzysz usługę zaplecza do wysyłania komunikatów z chmury do urządzenia za pośrednictwem IoT Hub. Aby wysyłać komunikaty z chmury do urządzenia, usługa wymaga uprawnienia połączenia z usługą . Domyślnie każda IoT Hub jest tworzona przy użyciu zasad dostępu współdzielonego o nazwie usługa, która przyznaje to uprawnienie.

Aby uzyskać parametry połączenia IoT Hub dla zasad usługi, 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 IoT hub wybierz pozycję Zasady dostępu współdzielonego.

  3. Z listy zasad wybierz zasady usługi .

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

Zrzut ekranu przedstawiający sposób pobierania parametrów połączenia z IoT Hub w Azure Portal.

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

Wysyłanie komunikatu z chmury do urządzenia

W tej sekcji utworzysz aplikację konsolową platformy .NET, która wysyła komunikaty z chmury do urządzenia do aplikacji symulowanego urządzenia. Potrzebujesz identyfikatora urządzenia z urządzenia i parametrów połączenia centrum IoT Hub.

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

  2. Nadaj projektowi nazwę SendCloudToDevice, a następnie wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający wyskakujące okienko

  3. Zaakceptuj najnowszą wersję .NET Framework. Wybierz polecenie Create (Utwórz), aby utworzyć projekt.

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

  5. W obszarze Zarządzanie pakietami NuGet wybierz pozycję Przeglądaj, a następnie wyszukaj i wybierz pozycję Microsoft.Azure.Devices. Wybierz pozycję Zainstaluj.

    Ten krok umożliwia pobranie, zainstalowanie i dodanie odwołania do pakietu NuGet zestawu SDK usługi Azure IoT.

  6. Dodaj następującą using instrukcję w górnej części pliku Program.cs .

    using Microsoft.Azure.Devices;
    
  7. Dodaj następujące pola do klasy Program: Zastąp wartość symbolu zastępczego {iot hub connection string} parametrami połączenia centrum IoT Zanotowanymi wcześniej w temacie Pobieranie parametrów połączenia centrum IoT. Zastąp {device id} wartość symbolu zastępczego identyfikatorem urządzenia zarejestrowanego urządzenia w centrum IoT.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  8. Dodaj następującą metodę do klasy Program , aby wysłać komunikat do urządzenia.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  9. Na koniec dodaj następujące wiersze do metody Main .

    Console.WriteLine("Send Cloud-to-Device message\n");
    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    
    Console.WriteLine("Press any key to send a C2D message.");
    Console.ReadLine();
    SendCloudToDeviceMessageAsync().Wait();
    Console.ReadLine();
    
  10. Naciśnij klawisz F5 , aby uruchomić przykładową aplikację usługi. Wybierz okno SendCloudToDevice i naciśnij klawisz Enter. Powinien zostać wyświetlony komunikat odebrany przez przykładową aplikację urządzenia, jak pokazano w poniższym przykładzie danych wyjściowych.

    5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
    
    5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
    5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
    5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.
    5/22/2023 11:15:18 AM> Polling using ReceiveAsync() - received message with Id=
    5/22/2023 11:15:18 AM> Received message: [Cloud to device message.]
            Content type:
    
    5/22/2023 11:15:18 AM> Completed C2D message with Id=.
    

Otrzymywanie opinii o dostawie

Istnieje możliwość zażądania potwierdzenia dostarczenia (lub wygaśnięcia) z IoT Hub dla każdego komunikatu z chmury do urządzenia. Ta opcja umożliwia zapleczu rozwiązania łatwe informowanie, ponawianie próby lub logikę kompensacji. Aby uzyskać więcej informacji na temat opinii z chmury do urządzenia, zobacz D2C i C2D Messaging with IoT Hub (Obsługa komunikatów D2C i C2D za pomocą IoT Hub).

W tej sekcji zmodyfikujesz przykładową aplikację usługi SendCloudToDevice w celu żądania opinii i otrzymasz ją z centrum IoT.

  1. W programie Visual Studio w projekcie SendCloudToDevice dodaj następującą metodę do klasy Program .

    private async static void ReceiveFeedbackAsync()
    {
         var feedbackReceiver = serviceClient.GetFeedbackReceiver();
    
         Console.WriteLine("\nReceiving c2d feedback from service");
         while (true)
         {
             var feedbackBatch = await feedbackReceiver.ReceiveAsync();
             if (feedbackBatch == null) continue;
    
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.WriteLine("Received feedback: {0}",
               string.Join(", ", feedbackBatch.Records.Select(f => f.StatusCode)));
             Console.ResetColor();
    
             await feedbackReceiver.CompleteAsync(feedbackBatch);
         }
     }
    

    Należy pamiętać, że ten wzorzec odbierania jest taki sam, jak używany do odbierania komunikatów z chmury do urządzenia z aplikacji urządzenia.

  2. Dodaj następujący wiersz w metodzie Main bezpośrednio po serviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    ReceiveFeedbackAsync();
    
  3. Aby poprosić o opinię na temat dostarczania komunikatu z chmury do urządzenia, należy określić właściwość w metodzie SendCloudToDeviceMessageAsync . Dodaj następujący wiersz bezpośrednio po var commandMessage = new Message(...); wierszu.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Upewnij się, że przykładowa aplikacja urządzenia jest uruchomiona, a następnie uruchom przykładową aplikację usługi, naciskając klawisz F5. Wybierz okno konsoli SendCloudToDevice i naciśnij klawisz Enter. Powinien zostać wyświetlony komunikat odbierany przez przykładową aplikację urządzenia, a po kilku sekundach komunikat opinii otrzymany przez aplikację SendCloudToDevice . Następujące dane wyjściowe zawierają komunikat opinii odebrany przez przykładową aplikację usługi:

    Send Cloud-to-Device message
    
    
    Receiving c2d feedback from service
    Press any key to send a C2D message.
    
    Received feedback: Success
    

Uwaga

Dla uproszczenia ten artykuł nie implementuje żadnych zasad ponawiania. W kodzie produkcyjnym należy zaimplementować zasady ponawiania, takie jak wycofywanie wykładnicze, zgodnie z sugestią w obsłudze błędów przejściowych.

Następne kroki

W tym artykule przedstawiono sposób wysyłania i odbierania komunikatów z chmury do urządzenia.