Posílání zpráv z cloudu do zařízení pomocí IoT Hub (.NET)Send messages from the cloud to your device with 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-endu řešení.Azure IoT Hub is a fully managed service that helps enable reliable and secure bi-directional communications between millions of devices and a solution back end. Možnost Odeslat telemetrii ze zařízení do služby IoT Hub – rychlý Start ukazuje, jak vytvořit centrum IoT, zřídit v něm identitu zařízení a vytvořit kód aplikace pro zařízení odesílající zprávy typu zařízení-Cloud.The Send telemetry from a device to an IoT hub quickstart shows how to create an IoT hub, provision a device identity in it, and code a device app that sends device-to-cloud messages.

Poznámka

Funkce popsané v tomto článku jsou k dispozici pouze na úrovni Standard IoT Hub.The features described in this article are available only in the standard tier of IoT Hub. Další informace o úrovních Basic a Standard a Free IoT Hub najdete v tématu Volba správné IoT Hub úrovně.For more information about the basic and standard/free IoT Hub tiers, see Choose the right IoT Hub tier.

Tento kurz sestaví na odeslání telemetrie ze zařízení do služby IoT Hub.This tutorial builds on Send telemetry from a device to an IoT hub. Ukazuje, jak provádět následující úlohy:It shows you how to do the following tasks:

  • Z back-endu vašeho řešení odesílají zprávy typu cloud-zařízení do jediného zařízení prostřednictvím IoT Hub.From your solution back end, send cloud-to-device messages to a single device through IoT Hub.

  • Příjem zpráv typu cloud-zařízení na zařízení.Receive cloud-to-device messages on a device.

  • Z back-endu vašeho řešení požadavek na doručení zprávodesílaných do zařízení z IoT Hub.From your solution back end, request delivery acknowledgment (feedback) for messages sent to a device from IoT Hub.

Další informace o zprávách z cloudu na zařízení najdete v D2C a C2D zasílání zpráv pomocí IoT Hub.You can find more information on cloud-to-device messages in D2C and C2D Messaging with IoT Hub.

Na konci tohoto kurzu spustíte dvě konzolové aplikace .NET.At the end of this tutorial, you run two .NET console apps.

  • SimulatedDevice.SimulatedDevice. Tato aplikace se připojí ke službě IoT Hub a přijímá zprávy z cloudu na zařízení.This app connects to your IoT hub and receives cloud-to-device messages. Tato aplikace je upravená verze aplikace vytvořená v rámci odesílání telemetrie ze zařízení do služby IoT Hub.This app is a modified version of the app created in Send telemetry from a device to an IoT hub.

  • SendCloudToDevice.SendCloudToDevice. Tato aplikace pošle zprávu typu cloud-zařízení do aplikace zařízení prostřednictvím IoT Hub a potom obdrží potvrzení o doručení.This app sends a cloud-to-device message to the device app through IoT Hub, and then receives its delivery acknowledgment.

Poznámka

IoT Hub podporuje sadu SDK pro mnoho platforem a jazyků zařízení, včetně C, Java, Pythonu a JavaScriptu, prostřednictvím sad SDK pro zařízení Azure IoT.IoT Hub has SDK support for many device platforms and languages, including C, Java, Python, and Javascript, through Azure IoT device SDKs. Podrobné pokyny, jak připojit zařízení k kódu tohoto kurzu a obecně k Azure IoT Hub, najdete v příručce pro vývojáře IoT Hub.For step-by-step instructions on how to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the IoT Hub developer guide.

PožadavkyPrerequisites

  • Visual StudioVisual Studio

  • Aktivní účet Azure.An active Azure account. Pokud účet nemáte, můžete si během několika minut vytvořit bezplatný účet.If you don't have an account, you can create a free account in just a couple of minutes.

  • Ujistěte se, že je v bráně firewall otevřený port 8883.Make sure that port 8883 is open in your firewall. Ukázka zařízení v tomto článku používá protokol MQTT, který komunikuje přes port 8883.The device sample in this article uses MQTT protocol, which communicates over port 8883. Tento port může být blokovaný v některých podnikových a vzdělávacích prostředích sítě.This port may be blocked in some corporate and educational network environments. Další informace a způsoby, jak tento problém obejít, najdete v tématu připojení k IoT Hub (MQTT).For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

Příjem zpráv v aplikaci zařízeníReceive messages in the device app

V této části Upravte aplikaci zařízení, kterou jste vytvořili v části odeslání telemetrie ze zařízení do služby IoT Hub pro příjem zpráv z cloudu na zařízení ze služby IoT Hub.In this section, modify the device app you created in Send telemetry from a device to an IoT hub to receive cloud-to-device messages from the IoT hub.

  1. V aplikaci Visual Studio v projektu SimulatedDevice přidejte následující metodu do třídy SimulatedDevice .In Visual Studio, in the SimulatedDevice project, add the following method to the SimulatedDevice class.

     private static async void ReceiveC2dAsync()
     {
         Console.WriteLine("\nReceiving cloud to device messages from service");
         while (true)
         {
             Message receivedMessage = await s_deviceClient.ReceiveAsync();
             if (receivedMessage == null) continue;
    
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.WriteLine("Received message: {0}", 
             Encoding.ASCII.GetString(receivedMessage.GetBytes()));
             Console.ResetColor();
    
             await s_deviceClient.CompleteAsync(receivedMessage);
         }
     }
    
  2. Do metody Main přidejte následující metodu, která je přímo před Console.ReadLine() řádkem:Add the following method in the Main method, right before the Console.ReadLine() line:

    ReceiveC2dAsync();
    

ReceiveAsyncMetoda asynchronně vrátí přijatou zprávu v okamžiku, kdy zařízení obdrží.The ReceiveAsync method asynchronously returns the received message at the time that it is received by the device. Po určitém časovém limitu vrátí hodnotu null .It returns null after a specifiable timeout period. V tomto příkladu je použita výchozí hodnota 1 minuta.In this example, the default of one minute is used. Když aplikace obdrží hodnotu null, měla by nadále čekat na nové zprávy.When the app receives a null, it should continue to wait for new messages. Tento požadavek je důvodem pro if (receivedMessage == null) continue řádek.This requirement is the reason for the if (receivedMessage == null) continue line.

Volání CompleteAsync() upozorňující na IoT Hub, že zpráva byla úspěšně zpracována a že zprávu lze bezpečně odebrat z fronty zařízení.The call to CompleteAsync() notifies IoT Hub that the message has been successfully processed and that the message can be safely removed from the device queue. Zařízení by mělo zavolat tuto metodu, když se její zpracování úspěšně dokončí bez ohledu na to, který protokol používá.The device should call this method when its processing successfully completes regardless of the protocol it's using.

V případě AMQP a HTTPS, ale ne MQTT, může zařízení také:With AMQP and HTTPS, but not MQTT, the device can also:

  • Opuštění zprávy, která má za následek IoT Hub uchování zprávy ve frontě zařízení pro budoucí spotřebu.Abandon a message, which results in IoT Hub retaining the message in the device queue for future consumption.
  • Odmítněte zprávu, která trvale odstraní zprávu z fronty zařízení.Reject a message, which which permanently removes the message from the device queue.

Pokud dojde k nějakému problému, který zabrání zařízení v dokončení, zrušení nebo odmítnutí zprávy, IoT Hub po pevném časovém limitu zařadí do fronty zprávu pro doručení znovu.If something happens that prevents the device from completing, abandoning, or rejecting the message, IoT Hub will, after a fixed timeout period, queue the message for delivery again. Z tohoto důvodu musí být logika zpracování zpráv v aplikaci zařízení idempotentní, aby se stejná zpráva zobrazovala vícekrát, což má stejný výsledek.For this reason, the message processing logic in the device app must be idempotent, so that receiving the same message multiple times produces the same result.

Podrobnější informace o tom, jak IoT Hub zpracovává zprávy typu cloud-zařízení, včetně podrobností o životním cyklu zpráv z cloudu na zařízení, najdete v tématu posílání zpráv z cloudu na zařízení ze služby IoT Hub.For more detailed information about how IoT Hub processes cloud-to-device messages, including details of the cloud-to-device message lifecycle, see Send cloud-to-device messages from an IoT hub.

Poznámka

Při použití protokolu HTTPS namísto MQTT nebo AMQP jako přenosu ReceiveAsync vrátí metoda okamžitě.When using HTTPS instead of MQTT or AMQP as a transport, the ReceiveAsync method returns immediately. Podporovaným vzorům pro zprávy typu cloud-zařízení pomocí protokolu HTTPS jsou občas připojená zařízení, která kontrolují zprávy zřídka (nejméně každých 25 minut).The supported pattern for cloud-to-device messages with HTTPS is intermittently connected devices that check for messages infrequently (a minimum of every 25 minutes). Výsledkem vydávání většího protokolu HTTPS je IoT Hub omezování požadavků.Issuing more HTTPS receives results in IoT Hub throttling the requests. Další informace o rozdílech mezi podporou MQTT, AMQP a HTTPS najdete v tématu pokyny pro komunikaci z cloudu na zařízení a Vyberte komunikační protokol.For more information about the differences between MQTT, AMQP, and HTTPS support, see Cloud-to-device communications guidance and Choose a communication protocol.

Získání připojovacího řetězce centra IoT HubGet the IoT hub connection string

V tomto článku vytvoříte back-end službu pro posílání zpráv z cloudu na zařízení prostřednictvím služby IoT Hub, kterou jste vytvořili v tématu odeslání telemetrie ze zařízení do služby IoT Hub.In this article, you create a back-end service to send cloud-to-device messages through the IoT hub you created in Send telemetry from a device to an IoT hub. K posílání zpráv z cloudu na zařízení potřebuje služba oprávnění připojit se.To send cloud-to-device messages, your service needs the service connect permission. Ve výchozím nastavení se všechny IoT Hub vytvoří pomocí zásad sdíleného přístupu s názvem Služba , která toto oprávnění udělí.By default, every IoT Hub is created with a shared access policy named service that grants this permission.

Pro získání připojovacího řetězce IoT Hub pro zásady služby použijte následující postup:To get the IoT Hub connection string for the service policy, follow these steps:

  1. V Azure Portalvyberte skupiny prostředků.In the Azure portal, select Resource groups. Vyberte skupinu prostředků, ve které se nachází vaše centrum, a potom v seznamu prostředků vyberte své centrum.Select the resource group where your hub is located, and then select your hub from the list of resources.

  2. V levém podokně Centra IoT vyberte zásady sdíleného přístupu.On the left-side pane of your IoT hub, select Shared access policies.

  3. V seznamu zásad vyberte zásadu služby .From the list of policies, select the service policy.

  4. V části sdílené přístupové klíče vyberte ikonu kopírování pro připojovací řetězec – primární klíč a uložte hodnotu.Under Shared access keys, select the copy icon for the Connection string -- primary key and save the value.

    Zobrazit způsob načtení připojovacího řetězce

Další informace o zásadách a oprávněních sdíleného přístupu IoT Hub najdete v tématu řízení přístupu a oprávnění.For more information about IoT Hub shared access policies and permissions, see Access control and permissions.

Odeslání zprávy typu cloud-zařízeníSend a cloud-to-device message

V této části vytvoříte konzolovou aplikaci .NET, která odesílá zprávy typu cloud-zařízení do aplikace simulovaného zařízení.In this section, you create a .NET console app that sends cloud-to-device messages to the simulated device app.

  1. V aktuálním řešení sady Visual Studio vyberte soubor > Nový > projekt.In the current Visual Studio solution, select File > New > Project. V poli vytvořit nový projekt vyberte Konzolová aplikace (.NET Framework) a pak vyberte Další.In Create a new project, select Console App (.NET Framework), and then select Next.

  2. Pojmenujte projekt SendCloudToDevice.Name the project SendCloudToDevice. V části řešení vyberte Přidat do řešení a přijměte nejnovější verzi .NET Framework.Under Solution, select Add to solution and accept the most recent version of the .NET Framework. Vyberte Vytvořit a vytvořte projekt.Select Create to create the project.

    Konfigurace nového projektu v aplikaci Visual Studio

  3. V Průzkumník řešení klikněte pravým tlačítkem myši na nový projekt a vyberte možnost Spravovat balíčky NuGet.In Solution Explorer, right-click the new project, and then select Manage NuGet Packages.

  4. V možnosti spravovat balíčky NuGet vyberte Procházet a pak vyhledejte a vyberte Microsoft. Azure. Devices.In Manage NuGet Packages, select Browse, and then search for and select Microsoft.Azure.Devices. Vyberte nainstalovat.Select Install.

    Tento krok stáhne, nainstaluje a přidá odkaz na balíček NuGet sady SDK služby Azure IoT.This step downloads, installs, and adds a reference to the Azure IoT service SDK NuGet package.

  5. Do using horní části souboru program. cs přidejte následující příkaz.Add the following using statement at the top of the Program.cs file.

    using Microsoft.Azure.Devices;
    
  6. Do třídy Program přidejte následující pole.Add the following fields to the Program class. Nahraďte {iot hub connection string} hodnotu zástupného symbolu připojovacím řetězcem IoT Hub, který jste si dříve poznamenali v části získání připojovacího řetězce centra IoT Hub.Replace the {iot hub connection string} placeholder value with the IoT hub connection string you noted previously in Get the IoT hub connection string. Nahraďte {device id} hodnotu zástupného symbolu ID zařízení, které jste přidali při odesílání telemetrie ze zařízení do rychlého startu služby IoT Hub .Replace the {device id} placeholder value with the device ID of the device you added in the Send telemetry from a device to an IoT hub quickstart.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  7. Do třídy program přidejte následující metodu, která odešle zprávu do vašeho zařízení.Add the following method to the Program class to send a message to your device.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  8. Nakonec do metody Main přidejte následující řádky.Finally, add the following lines to the Main method.

    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();
    
  9. V Průzkumníku řešení klikněte pravým tlačítkem na své řešení a vyberte nastavit projekty po spuštění.In Solutions Explorer, right-click your solution, and select Set StartUp Projects.

  10. V okně běžné vlastnosti > spouštěný projekt vyberte více projektů po spuštění a pak vyberte akci spuštění pro SimulatedDevice a SendCloudToDevice.In Common Properties > Startup Project, select Multiple startup projects, then select the Start action for SimulatedDevice and SendCloudToDevice. Výběrem OK uložte změny.Select OK to save your changes.

  11. Stiskněte klávesu F5.Press F5. Obě aplikace by měly být spuštěny.Both applications should start. Vyberte okno SendCloudToDevice a stiskněte klávesu ENTER.Select the SendCloudToDevice window, and press Enter. Měla by se zobrazit zpráva přijímaná aplikací zařízení.You should see the message being received by the device app.

    Zpráva přijímání aplikace zařízení

Doručení zpětné vazbyReceive delivery feedback

Pro každou zprávu z cloudu na zařízení je možné požádat o potvrzení doručení (nebo vypršení platnosti) z IoT Hub.It is possible to request delivery (or expiration) acknowledgments from IoT Hub for each cloud-to-device message. Tato možnost umožňuje back-end řešení snadno informovat o opakování nebo logiku kompenzace.This option enables the solution back end to easily inform retry or compensation logic. Další informace o zpětné vazbě z cloudu na zařízení najdete v tématu zasílání zpráv z D2C a C2D pomocí IoT Hub.For more information about cloud-to-device feedback, see D2C and C2D Messaging with IoT Hub.

V této části upravíte aplikaci SendCloudToDevice tak, aby požádala o zpětnou vazbu a přijímala ji ze služby IoT Hub.In this section, you modify the SendCloudToDevice app to request feedback, and receive it from the IoT hub.

  1. V aplikaci Visual Studio v projektu SendCloudToDevice přidejte následující metodu do třídy program .In Visual Studio, in the SendCloudToDevice project, add the following method to the Program class.

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

    Poznámka: Tento model příjmu je stejný jako použitý k přijímání zpráv z cloudu na zařízení z aplikace zařízení.Note this receive pattern is the same one used to receive cloud-to-device messages from the device app.

  2. Do metody Main přidejte následující řádek, a to hned po serviceClient = ServiceClient.CreateFromConnectionString(connectionString) .Add the following line in the Main method, right after serviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    ReceiveFeedbackAsync();
    
  3. Chcete-li požádat o zpětnou vazbu k doručování zpráv z cloudu na zařízení, je nutné zadat vlastnost v metodě SendCloudToDeviceMessageAsync .To request feedback for the delivery of your cloud-to-device message, you have to specify a property in the SendCloudToDeviceMessageAsync method. Přidejte následující řádek hned za var commandMessage = new Message(...); řádek.Add the following line, right after the var commandMessage = new Message(...); line.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Spusťte aplikace stisknutím klávesy F5.Run the apps by pressing F5. Měli byste vidět, jak se obě aplikace spouštějí.You should see both applications start. Vyberte okno SendCloudToDevice a stiskněte klávesu ENTER.Select the SendCloudToDevice window, and press Enter. Měla by se zobrazit zpráva přijímaná aplikací zařízení a po několika sekundách zpráva o zpětné vazbě přijímaná vaší aplikací SendCloudToDevice .You should see the message being received by the device app, and after a few seconds, the feedback message being received by your SendCloudToDevice application.

    Aplikace zařízení, která přijímá zprávu a aplikace služby, obdrží zpětnou vazbu

Poznámka

Pro zjednodušení tento kurz neimplementuje žádné zásady opakování.For simplicity, this tutorial does not implement any retry policy. V produkčním kódu by měly být implementovány zásady opakování, například exponenciální omezení rychlosti, navržené při zpracování přechodné chyby.In production code, you should implement retry policies, such as exponential backoff, as suggested in Transient fault handling.

Další krokyNext steps

V tomto postupu jste zjistili, jak odesílat a přijímat zprávy z cloudu do zařízení.In this how-to, you learned how to send and receive cloud-to-device messages.

Příklady kompletních řešení, která používají IoT Hub, najdete v tématu akcelerátor řešení vzdáleného monitorování Azure IoT.To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Remote Monitoring solution accelerator.

Další informace o vývoji řešení pomocí IoT Hub najdete v příručce pro vývojáře IoT Hub.To learn more about developing solutions with IoT Hub, see the IoT Hub developer guide.