Sdílet prostřednictvím


Odesílání zpráv typu cloud-zařízení pomocí IoT Hubu (.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 Hubu

  • Příjem zpráv typu cloud-zařízení na zařízení

  • Potvrzení o doručení žádosti (zpětná vazba) z back-endu vašeho řešení pro zprávy odeslané do zařízení ze služby IoT Hub

Poznámka:

Funkce popsané v tomto článku jsou k dispozici pouze na úrovni Standard služby IoT Hub. Další informace o úrovních Služby IoT Hub úrovně Basic a Standard/Free najdete v tématu Volba správné úrovně IoT Hubu 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 typu cloud-zařízení.

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

Poznámka:

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

Další informace o zprávách typu cloud-zařízení najdete v D2C a C2D Messaging pomocí IoT Hubu.

Požadavky

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

  • Centrum IoT 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 ve službě IoT Hub nemáte zařízení, postupujte podle pokynů v části Registrace zařízení.

  • 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ě sady 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ší. V případě potřeby zkontrolujte verzi spuštěním dotnet --version a stažením .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 blokovaný v některých podnikových a vzdělávacích síťových prostředích. Další informace a způsoby řešení tohoto problému najdete v tématu Připojení ke službě IoT Hub (MQTT).

  • Visual Studio.

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

V tomto článku spustíte ukázkovou aplikaci, která simuluje zařízení, které přijímá zprávy typu cloud-zařízení odesílané prostřednictvím služby IoT Hub. Ukázková aplikace MessageReceiveSample , která je součástí sady Microsoft Azure IoT SDK pro .NET , se připojuje 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. Na webu 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 uložte hodnotu.

    Snímek obrazovky, který ukazuje, jak načíst primární připojovací řetězec pro zařízení zaregistrované ve službě IoT Hub na webu 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 odesílaných prostřednictvím 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, do které jste rozbalili sadu SDK Azure IoT C#. Spusťte následující příkazy a nahraďte {Your device connection string} zástupnou hodnotu zařízením, připojovací řetězec 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 pochází z ukázkové aplikace zařízení po úspěšném spuštění a připojení 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ě vrátí přijatou zprávu v době, kdy zařízení obdrží zprávu. ReceiveAsync vrátí hodnotu null po specifikovatelném časovém limitu. V tomto příkladu se použije výchozí hodnota jedné minuty. Když zařízení obdrží hodnotu null, mělo by pokračovat v čekání na nové zprávy. Tento požadavek je důvodem, proč ukázková aplikace v metodě obsahuje následující blok kódu ReceiveC2dMessagesPollingAndCompleteAsync :

   if (receivedMessage == null)
   {
      continue;
   }

Volání CompleteAsync metody oznámí službě IoT Hub, že zpráva byla úspěšně zpracována a že zprávu lze bezpečně odebrat z fronty zařízení. Zařízení by mělo tuto metodu volat, když se jeho zpracování úspěšně dokončí bez ohledu na protokol, který používá.

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

  • Opusťte zprávu, která vede k tomu, že IoT Hub uchovává zprávu ve frontě zařízení pro budoucí spotřebu.
  • Zamítnout zprávu, která trvale odebere zprávu z fronty zařízení.

Pokud se stane něco, co brání zařízení v dokončení, opuštění nebo odmítnutí zprávy, IoT Hub zařadí zprávu znovu do fronty po uplynutí časového limitu. Z tohoto důvodu musí být logika zpracování zpráv v aplikaci zařízení idempotentní, takže přijetí stejné zprávy několikrát způsobí stejný výsledek.

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

Poznámka:

Při použití HTTPS místo MQTT nebo AMQP jako přenosu ReceiveAsync vrátí metoda okamžitě. Podporovaný vzor zpráv typu cloud-zařízení s protokolem HTTPS je přerušovaně připojená zařízení, která kontrolují zprávy zřídka (minimálně každých 25 minut). Vydání dalšího protokolu HTTPS přijímá výsledky omezování požadavků ve službě IoT Hub. Další informace o rozdílech mezi podporou MQTT, AMQP a HTTPS najdete v pokynech ke komunikaci typu Cloud-zařízení a volba komunikačního protokolu.

Získání připojovací řetězec centra IoT

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

Pokud chcete získat připojovací řetězec ioT Hubu pro zásady služby, postupujte takto:

  1. Na webu 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 uložte hodnotu.

Snímek obrazovky znázorňující, jak načíst připojovací řetězec ze služby IoT Hub na webu Azure Portal

Další informace ozásadách

Odeslání zprávy typu cloud-zařízení

V této části vytvoříte konzolovou aplikaci .NET, která odesílá zprávy typu cloud-zařízení do aplikace simulovaného zařízení. Potřebujete ID zařízení ze svého zařízení a připojovací řetězec ioT Hubu.

  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 místní možností Konfigurace nového projektu 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 myši na nový projekt a pak vyberte Spravovat balíčky NuGet.

  5. Ve správě balíčků NuGet vyberte Procházet a vyhledejte a vyberte Microsoft.Azure.Devices. Vyberte volbu Instalovat.

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

  6. Do horní části 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. {iot hub connection string} Nahraďte zástupnou hodnotu připojovací řetězec IoT Hub, kterou jste si poznamenali dříve v připojovací řetězec Get the IoT Hub. {device id} Nahraďte zástupnou hodnotu ID zařízení registrované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 do metody Main přidejte následující řádky.

    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í

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

V této části upravíte ukázkovou aplikaci služby SendCloudToDevice tak, aby požadovala zpětnou vazbu, a obdržíte ji z centra IoT.

  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 vzor příjmu je stejný jako při příjmu zpráv z aplikace zařízení z cloudu na zařízení.

  2. Do metody 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 var commandMessage = new Message(...); řádek.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Ujistěte se, že je aplikace ukázkového zařízení spuštěná, a pak spusťte ukázkovou aplikaci služby stisknutím klávesy F5. Vyberte okno konzoly SendCloudToDevice a stiskněte Enter. Měla by se zobrazit zpráva přijatá ukázkovou aplikací zařízení a po několika sekundách měla být zpráva zpětné vazby přijatá vaší aplikací SendCloudToDevice . Následující výstup ukazuje zprávu zpětné vazby přijaté 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 navrhuje zpracování přechodných chyb.

Další kroky

V tomto článku jste se dozvěděli, jak odesílat a přijímat zprávy typu cloud-zařízení.