Skicka meddelanden från moln till enhet med IoT Hub (.NET)

Azure IoT Hub är en fullständigt hanterad tjänst som möjliggör tillförlitlig och säker dubbelriktad kommunikation mellan miljontals enheter och en serverdelslösning.

Den här artikeln visar hur du:

  • Skicka meddelanden från moln till enhet (C2D) från din lösningsserverdel till en enda enhet via IoT Hub

  • Ta emot meddelanden från moln till enhet på en enhet

  • Bekräftelse av leveransbegäran (feedback), från lösningens serverdel, för meddelanden som skickas till en enhet från IoT Hub

Anteckning

Funktionerna som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om nivåerna basic och standard/kostnadsfri IoT Hub finns i Välja rätt IoT Hub nivå för din lösning.

I slutet av den här artikeln kör du två .NET-konsolappar.

  • MessageReceiveSample: en exempelenhetsapp som ingår i Microsoft Azure IoT SDK för .NET, som ansluter till din IoT-hubb och tar emot meddelanden från molnet till enheten.

  • SendCloudToDevice: en tjänstapp som skickar ett moln-till-enhet-meddelande till enhetsappen via IoT Hub och sedan får sin leveransbekräftelse.

Anteckning

IoT Hub har SDK-stöd för många enhetsplattformar och språk (C, Java, Python och JavaScript) via SDK:er för Azure IoT-enheter.

Mer information om meddelanden från moln till enhet finns i D2C- och C2D-meddelanden med IoT Hub.

Förutsättningar

  • En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

  • 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 registrerat en enhet ännu kan du registrera en i Azure Portal.

  • Den här artikeln använder exempelkod från Azure IoT SDK för C#.

    • Ladda ned eller klona SDK-lagringsplatsen från GitHub till utvecklingsdatorn.
    • Kontrollera att .NET Core 3.0.0 eller senare är installerat på utvecklingsdatorn. Kontrollera din version genom att köra dotnet --version och ladda ned .NET om det behövs.
  • 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).

  • Visual Studio.

Hämta enhetens anslutningssträng

I den här artikeln kör du en exempelapp som simulerar en enhet som tar emot meddelanden från molnet till enheten som skickas via din IoT Hub. Exempelappen MessageReceiveSample som ingår i Microsoft Azure IoT SDK för .NET ansluter till din IoT-hubb och fungerar som din simulerade enhet. Exemplet använder den primära anslutningssträngen för den registrerade enheten på din IoT-hubb.

Så här hämtar du den primära anslutningssträngen för en enhet som är registrerad på din IoT-hubb:

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

  2. Välj Enheter under Enhetshantering i fönstret till vänster i IoT Hub.

  3. Välj lämplig enhet i listan över enheter.

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

    Skärmbild som visar hur du hämtar den primära anslutningssträngen för en enhet som är registrerad på din IoT-hubb i Azure Portal.

Ta emot meddelanden i enhetsappen

I det här avsnittet kör du exempelenhetsappen MessageReceiveSample för att ta emot C2D-meddelanden som skickas via din IoT-hubb. Öppna en ny kommandotolk och gå till mappen azure-iot-sdk-csharp\iothub\device\samples\getting started\MessageReceiveSample under mappen där du expanderade Azure IoT C# SDK. Kör följande kommandon och {Your device connection string} ersätt platshållarvärdet med enhetsanslutningssträngen som du kopierade från den registrerade enheten i IoT-hubben.

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

Följande utdata kommer från exempelenhetsappen när den har startats och ansluter till din IoT-hubb:

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.

Exempelappen söker efter meddelanden med hjälp av metoderna ReceiveAsync och CompleteAsync . Metoden ReceiveC2dMessagesPollingAndCompleteAsync använder ReceiveAsync metoden , som asynkront returnerar det mottagna meddelandet när enheten tar emot meddelandet. ReceiveAsync returnerar null efter en angiven tidsgräns. I det här exemplet används standardvärdet en minut. När enheten får ett null-värde bör den fortsätta att vänta på nya meddelanden. Det här kravet är anledningen till att exempelappen innehåller följande kodblock i ReceiveC2dMessagesPollingAndCompleteAsync metoden :

   if (receivedMessage == null)
   {
      continue;
   }

Anropet CompleteAsync till metoden meddelar IoT Hub att meddelandet har bearbetats och att meddelandet kan tas bort från enhetskön på ett säkert sätt. Enheten bör anropa den här metoden när bearbetningen har slutförts oavsett vilket protokoll den använder.

Med AMQP- och HTTPS-protokoll, men inte MQTT-protokollet, kan enheten också:

  • Avbryt ett meddelande, vilket resulterar i IoT Hub att meddelandet bevaras i enhetskön för framtida förbrukning.
  • Avvisa ett meddelande som permanent tar bort meddelandet från enhetskön.

Om något händer som hindrar enheten från att slutföra, överge eller avvisa meddelandet, kommer IoT Hub efter en fast tidsgräns att köa meddelandet för leverans igen. Därför måste logiken för meddelandebearbetning i enhetsappen vara idempotent, så att samma meddelande tas emot flera gånger ger samma resultat.

Mer information om meddelandelivscykeln från moln till enhet och hur IoT Hub bearbetar meddelanden från molnet till enheten finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.

Anteckning

När du använder HTTPS i stället för MQTT eller AMQP som transport ReceiveAsync returnerar metoden omedelbart. Det mönster som stöds för meddelanden från moln till enhet med HTTPS är tillfälligt anslutna enheter som söker efter meddelanden sällan (minst var 25:e minut). Om du utfärdar fler HTTPS-inträffar IoT Hub att begäranden begränsas. Mer information om skillnaderna mellan MQTT-, AMQP- och HTTPS-stöd finns i Vägledning för kommunikation från moln till enhet och Välj ett kommunikationsprotokoll.

Hämta IoT Hub-anslutningssträngen

I den här artikeln skapar du en serverdelstjänst för att skicka meddelanden från moln till enhet via din IoT Hub. Om du vill skicka meddelanden från molnet till enheten behöver din tjänst behörighet att ansluta till tjänsten . Som standard skapas varje IoT Hub med en princip för delad åtkomst med namnet service som ger den här behörigheten.

Så här hämtar du IoT Hub anslutningssträngen för tjänstprincipen:

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

  2. I fönstret till vänster i IoT-hubben väljer du Principer för delad åtkomst.

  3. I listan över principer väljer du tjänstprincipen .

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

Skärmbild som visar hur du hämtar anslutningssträngen från din IoT Hub i Azure Portal.

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

Skicka ett meddelande från molnet till enheten

I det här avsnittet skapar du en .NET-konsolapp som skickar moln-till-enhet-meddelanden till den simulerade enhetsappen. Du behöver enhets-ID:t från enheten och IoT Hub-anslutningssträngen.

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

  2. Ge projektet namnet SendCloudToDevice och välj sedan Nästa.

    Skärmbild av popup-fönstret

  3. Acceptera den senaste versionen av .NET Framework. Välj Skapa för att skapa projektet.

  4. I Solution Explorer högerklickar du på det nya projektet och väljer sedan Hantera NuGet-paket.

  5. I Hantera NuGet-paket väljer du Bläddra och söker sedan efter och väljer Microsoft.Azure.Devices. Välj installera.

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

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

    using Microsoft.Azure.Devices;
    
  7. Lägg till följande fält i klassen Program. {iot hub connection string} Ersätt platshållarvärdet med den IoT Hub-anslutningssträng som du antecknade tidigare i Hämta IoT Hub-anslutningssträngen. {device id} Ersätt platshållarvärdet med enhets-ID:t för den registrerade enheten i din IoT-hubb.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  8. Lägg till följande metod i klassen Program för att skicka ett meddelande till enheten.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  9. Lägg slutligen till följande rader i Main-metoden .

    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. Tryck på F5 för att starta exempeltjänstappen. Välj fönstret SendCloudToDevice och tryck på Retur. Du bör se meddelandet som tas emot av exempelenhetsappen, som du ser i följande utdataexempel.

    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=.
    

Få feedback om leverans

Det är möjligt att begära leveransbekräftelser (eller förfallodatum) från IoT Hub för varje moln-till-enhet-meddelande. Med det här alternativet kan lösningens serverdel enkelt informera, försöka igen eller kompensationslogik. Mer information om feedback från moln till enhet finns i D2C- och C2D-meddelanden med IoT Hub.

I det här avsnittet ändrar du exempeltjänstappen SendCloudToDevice för att begära feedback och ta emot den från IoT-hubben.

  1. Lägg till följande metod i klassen Program i projektet SendCloudToDevice i Visual Studio.

    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);
         }
     }
    

    Observera att det här mottagningsmönstret är samma som används för att ta emot meddelanden från molnet till enheten från enhetsappen.

  2. Lägg till följande rad i Main-metoden direkt efter serviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    ReceiveFeedbackAsync();
    
  3. Om du vill begära feedback om leveransen av ditt moln-till-enhet-meddelande måste du ange en egenskap i metoden SendCloudToDeviceMessageAsync . Lägg till följande rad direkt efter var commandMessage = new Message(...); raden.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Kontrollera att exempelenhetsappen körs och kör sedan exempeltjänstappen genom att trycka på F5. Välj konsolfönstret SendCloudToDevice och tryck på Retur. Du bör se meddelandet som tas emot av exempelenhetsappen och efter några sekunder tas feedbackmeddelandet emot av ditt SendCloudToDevice-program . Följande utdata visar feedbackmeddelandet som tas emot av exempeltjänstappen:

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

Anteckning

För enkelhetens skull implementerar den här artikeln inte någon återförsöksprincip. I produktionskoden bör du implementera återförsöksprinciper, till exempel exponentiell backoff, som föreslås i Hantering av tillfälliga fel.

Nästa steg

I den här artikeln har du lärt dig hur du skickar och tar emot meddelanden från molnet till enheten.