Odesílání zpráv z cloudu do zařízení pomocí IoT Hub (.NET)

Azure IoT Hub je plně spravovaná služba, která pomáhá zajistit spolehlivou a zabezpečenou obousměrnou komunikaci mezi miliony zařízení a back-endem řešení.

V tomto článku se dozvíte, jak:

  • Odesílání zpráv typu cloud-zařízení (C2D) z back-endu řešení do jednoho zařízení prostřednictvím IoT Hub

  • Příjem zpráv z cloudu do zařízení na zařízení

  • Vyžádejte si potvrzení o doručení (zpětnou vazbu) z back-endu vašeho řešení pro zprávy odeslané do zařízení z IoT Hub

Poznámka

Funkce popsané v tomto článku jsou k dispozici pouze na úrovni Standard IoT Hub. Další informace o úrovních IoT Hub Basic a Standard/Free najdete v tématu Volba správné IoT Hub úrovně pro vaše řešení.

Na konci tohoto článku spustíte dvě konzolové aplikace .NET.

  • MessageReceiveSample: ukázková aplikace zařízení, která je součástí sady Microsoft Azure IoT SDK pro .NET, která se připojuje k centru IoT a přijímá zprávy z cloudu do zařízení.

  • SendCloudToDevice: Aplikace služby, která odešle zprávu z cloudu do zařízení prostřednictvím IoT Hub a pak obdrží potvrzení o doručení.

Poznámka

IoT Hub podporuje sadu SDK pro mnoho platforem a jazyků zařízení (C, Java, Python a JavaScript) prostřednictvím sad SDK zařízení Azure IoT.

Další informace o zprávách z cloudu do zařízení najdete v D2C a zasílání zpráv C2D pomocí IoT Hub.

Požadavky

  • Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.

  • IoT Hub ve vašem předplatném Azure. Pokud centrum ještě nemáte, můžete postupovat podle kroků v tématu Vytvoření centra IoT.

  • Zařízení zaregistrované ve službě IoT Hub. Pokud jste zařízení ještě nezaregistrovali, zaregistrujte ho v Azure Portal.

  • Tento článek používá ukázkový kód ze sady Azure IoT SDK pro jazyk C#.

    • Stáhněte nebo naklonujte úložiště SDK z GitHubu do vývojového počítače.
    • Ujistěte se, že je na vývojovém počítači nainstalované rozhraní .NET Core 3.0.0 nebo novější. Zkontrolujte verzi spuštěním dotnet --version a v případě potřeby stáhněte .NET .
  • Ujistěte se, že je v bráně firewall otevřený port 8883. Ukázka zařízení v tomto článku používá protokol MQTT, který komunikuje přes port 8883. Tento port může být v některých podnikových a vzdělávacích síťových prostředích blokovaný. Další informace a způsoby, jak tento problém obejít, najdete v tématu Připojení k IoT Hub (MQTT).

  • Visual Studio

Získání připojovacího řetězec zařízení

V tomto článku spustíte ukázkovou aplikaci, která simuluje zařízení, které přijímá zprávy z cloudu do zařízení odeslané prostřednictvím IoT Hub. Ukázková aplikace MessageReceiveSample , která je součástí sady Microsoft Azure IoT SDK pro .NET , se připojí k vašemu centru IoT a funguje jako simulované zařízení. Ukázka používá primární připojovací řetězec zaregistrovaného zařízení ve službě IoT Hub.

Pokud chcete získat primární připojovací řetězec pro zařízení zaregistrované ve službě IoT Hub, postupujte takto:

  1. V Azure Portal vyberte Skupiny prostředků. Vyberte skupinu prostředků, ve které se nachází vaše centrum, a pak vyberte centrum ze seznamu prostředků.

  2. V levém podokně centra IoT v části Správa zařízení vyberte Zařízení.

  3. V seznamu zařízení vyberte příslušné zařízení.

  4. Zkopírujte primární připojovací řetězec a hodnotu uložte.

    Snímek obrazovky, který ukazuje, jak načíst primární připojovací řetězec pro zařízení zaregistrované ve službě IoT Hub v Azure Portal

Příjem zpráv v aplikaci zařízení

V této části spusťte ukázkovou aplikaci zařízení MessageReceiveSample pro příjem zpráv C2D odeslaných prostřednictvím vašeho centra IoT. Otevřete nový příkazový řádek a přejděte do složky azure-iot-sdk-csharp\iothub\device\samples\getting started\MessageReceiveSample ve složce, ve které jste rozbalili sadu Azure IoT C# SDK. Spusťte následující příkazy a nahraďte {Your device connection string} zástupnou hodnotu připojovacím řetězcem zařízení, který jste zkopírovali z registrovaného zařízení ve službě IoT Hub.

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

Následující výstup je z ukázkové aplikace zařízení, která se úspěšně spustí a připojí se k centru 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.

Ukázková aplikace zařízení se dotazuje na zprávy pomocí metod ReceiveAsync a CompleteAsync . Metoda ReceiveC2dMessagesPollingAndCompleteAsync používá metodu ReceiveAsync , která asynchronně vrací přijatou zprávu v okamžiku, kdy zařízení zprávu přijme. ReceiveAsync vrátí hodnotu null po uplynutí konkrétního časového limitu. V tomto příkladu se použije výchozí hodnota jedna minuta. Když zařízení obdrží hodnotu null, mělo by dál čekat na nové zprávy. Tento požadavek je důvodem, proč ukázková aplikace obsahuje následující blok kódu v ReceiveC2dMessagesPollingAndCompleteAsync metodě:

   if (receivedMessage == null)
   {
      continue;
   }

Volání CompleteAsync metody IoT Hub upozorní, že zpráva byla úspěšně zpracována a že zprávu je možné bezpečně odebrat z fronty zařízení. Zařízení by mělo tuto metodu volat, jakmile se její zpracování úspěšně dokončí bez ohledu na protokol, který používá.

S protokoly AMQP a HTTPS, ale ne protokolem MQTT, může zařízení také:

  • Opustit zprávu, což má za následek IoT Hub uchování zprávy ve frontě zařízení pro budoucí použití.
  • Odmítnout zprávu, která trvale odebere zprávu z fronty zařízení.

Pokud se stane něco, co zařízení zabrání v dokončení, opuštění nebo odmítnutí zprávy, IoT Hub po uplynutí pevného časového limitu zprávu znovu zařadí do fronty pro doručení. Z tohoto důvodu musí být logika zpracování zpráv v aplikaci zařízení idempotentní, aby při vícenásobném přijetí stejné zprávy vznikl stejný výsledek.

Další informace o životním cyklu zpráv cloud-zařízení a o tom, jak IoT Hub zpracovává zprávy z cloudu do zařízení, najdete v tématu Odesílání zpráv z cloudu do zařízení ze služby IoT Hub.

Poznámka

Při použití HTTPS místo MQTT nebo AMQP jako přenosu vrátí ReceiveAsync metoda okamžitě. Podporovaným vzorem pro zprávy typu cloud-zařízení s HTTPS jsou přerušovaně připojená zařízení, která kontrolují zprávy zřídka (minimálně každých 25 minut). Vystavení více HTTPS má za následek IoT Hub omezování požadavků. Další informace o rozdílech mezi podporou MQTT, AMQP a HTTPS najdete v tématu Pokyny ke komunikaci mezi cloudem a zařízením a Volba komunikačního protokolu.

Získání připojovacího řetězce služby IoT Hub

V tomto článku vytvoříte back-endovou službu, která bude odesílat zprávy z cloudu do zařízení prostřednictvím IoT Hub. K odesílání zpráv z cloudu do zařízení potřebuje vaše služba oprávnění pro připojení služby . Ve výchozím nastavení se každá IoT Hub vytvoří se zásadou sdíleného přístupu s názvem služba, která toto oprávnění uděluje.

Chcete-li získat IoT Hub připojovací řetězec pro zásady služby, postupujte takto:

  1. V Azure Portal vyberte Skupiny prostředků. Vyberte skupinu prostředků, ve které se nachází vaše centrum, a pak vyberte centrum ze seznamu prostředků.

  2. V levém podokně centra IoT vyberte Zásady sdíleného přístupu.

  3. V seznamu zásad vyberte zásadu služby .

  4. Zkopírujte primární připojovací řetězec a hodnotu uložte.

Snímek obrazovky, který ukazuje, jak načíst připojovací řetězec z IoT Hub v Azure Portal

Další informace o IoT Hub zásady a oprávnění sdíleného přístupu najdete v tématu Řízení přístupu a oprávnění.

Odeslání zprávy z cloudu do zařízení

V této části vytvoříte konzolovou aplikaci .NET, která odesílá zprávy z cloudu do zařízení do aplikace simulovaného zařízení. Potřebujete ID zařízení z vašeho zařízení a připojovací řetězec služby IoT Hub.

  1. V sadě Visual Studio vyberte Soubor>nový>projekt. V části Vytvořit nový projekt vyberte Konzolová aplikace (.NET Framework) a pak vyberte Další.

  2. Pojmenujte projekt SendCloudToDevice a pak vyberte Další.

    Snímek obrazovky s automaticky otevíranou možností Konfigurovat nový projekt v sadě Visual Studio

  3. Přijměte nejnovější verzi rozhraní .NET Framework. Vyberte Vytvořit a vytvořte projekt.

  4. V Průzkumník řešení klikněte pravým tlačítkem na nový projekt a pak vyberte Spravovat balíčky NuGet.

  5. V části Spravovat balíčky NuGet vyberte Procházet a pak vyhledejte a vyberte Microsoft.Azure.Devices. Vyberte Nainstalovat.

    Tento krok stáhne, nainstaluje a přidá odkaz na balíček NuGet sdk služby Azure IoT.

  6. Na začátek souboru Program.cs přidejte následující using příkaz.

    using Microsoft.Azure.Devices;
    
  7. Do třídy Program přidejte následující pole. Nahraďte hodnotu zástupného symbolu {iot hub connection string} připojovacím řetězcem služby IoT Hub, který jste si poznamenali dříve v tématu Získání připojovacího řetězce služby IoT Hub. {device id} Zástupnou hodnotu nahraďte ID zařízení zaregistrovaného zařízení ve službě IoT Hub.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  8. Přidejte do třídy Program následující metodu pro odeslání zprávy do zařízení.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  9. Nakonec přidejte následující řádky 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. Stisknutím klávesy F5 spusťte ukázkovou aplikaci služby. Vyberte okno SendCloudToDevice a stiskněte Enter. Měla by se zobrazit zpráva přijatá ukázkovou aplikací zařízení, jak je znázorněno v následujícím příkladu výstupu.

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

Příjem zpětné vazby k doručení

O potvrzení doručení (nebo vypršení platnosti) je možné požádat IoT Hub pro každou zprávu z cloudu do zařízení. Tato možnost umožňuje back-endu řešení snadno informovat, opakovat nebo kompenzační logiku. Další informace o zpětné vazbě z cloudu do zařízení najdete v tématu Zasílání zpráv D2C a C2D pomocí IoT Hub.

V této části upravíte aplikaci ukázkové služby SendCloudToDevice tak, aby vyžadovala zpětnou vazbu a přijímala ji ze služby IoT Hub.

  1. V sadě Visual Studio v projektu SendCloudToDevice přidejte do třídy Program následující metodu.

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

    Všimněte si, že tento způsob příjmu je stejný jako při příjmu zpráv z cloudu do zařízení z aplikace zařízení.

  2. V metodě Main přidejte následující řádek hned za serviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    ReceiveFeedbackAsync();
    
  3. Pokud chcete požádat o zpětnou vazbu k doručení zprávy typu cloud-zařízení, musíte zadat vlastnost v metodě SendCloudToDeviceMessageAsync . Přidejte následující řádek hned za řádek var commandMessage = new Message(...); .

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Ujistěte se, že je aplikace ukázkového zařízení spuštěná, a pak spusťte aplikaci ukázkové služby stisknutím klávesy F5. Vyberte okno konzoly SendCloudToDevice a stiskněte Enter. Měli byste vidět zprávu, kterou přijímá ukázková aplikace zařízení, a po několika sekundách by měla vaše aplikace SendCloudToDevice přijmout zprávu o zpětné vazbě. Následující výstup ukazuje zpětnou vazbu přijatou ukázkovou aplikací služby:

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

Poznámka

Pro zjednodušení tento článek neimplementuje žádné zásady opakování. V produkčním kódu byste měli implementovat zásady opakování, jako je exponenciální zpochybnění, jak se navrhuje v tématu Zpracování přechodných chyb.

Další kroky

V tomto článku jste zjistili, jak odesílat a přijímat zprávy z cloudu do zařízení.