デバイスに IoT Hub でクラウドからメッセージを送信する (.NET)Send messages from the cloud to your device with IoT Hub (.NET)

はじめにIntroduction

Azure IoT Hub は、何百万ものデバイスとソリューション バックエンドの間に信頼性のある保護された双方向通信を確立するのに役立つ、フル マネージドのサービスです。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. デバイスから IoT ハブへのテレメトリの送信に関するページには、IoT ハブの作成方法、IoT ハブでデバイス ID をプロビジョニングする方法、および device-to-cloud メッセージを送信するデバイス アプリをコード化する方法が示されています。Send telemetry from a device to an IoT hub... shows how to create an IoT hub, provision a device identity in it, and code a device app that sends device-to-cloud messages.

注意

この記事で説明されている機能は、Standard レベルの IoT Hub でのみ使用できます。The features described in this article are available only in the standard tier of IoT Hub. Basic および Standard レベルの IoT Hub の詳細については、適切な IoT Hub レベルの選択に関するページを参照してください。For more information about the basic and standard IoT Hub tiers, see Choose the right IoT Hub tier.

このチュートリアルは、デバイスから IoT ハブへのテレメトリの送信に関するクイック スタートに基づいて作成されています。次の手順の実行方法について説明します。This tutorial builds on the quickstart Send telemetry from a device to an IoT hub.... It shows you how to do the following steps:

  • ソリューション バックエンドから IoT Hub を介して単一のデバイスにクラウドからデバイスへのメッセージを送信する。From your solution back end, send cloud-to-device messages to a single device through IoT Hub.

  • クラウドからデバイスへのメッセージをデバイスで受信する。Receive cloud-to-device messages on a device.

  • IoT Hub からデバイスに送信されたメッセージの配信確認 ("フィードバック") を、ソリューション バックエンドから要求する。From your solution back end, request delivery acknowledgement (feedback) for messages sent to a device from IoT Hub.

cloud-to-device メッセージの詳細については、IoT Hub における D2C と C2D のメッセージングに関するページを参照してください。You can find more information on cloud-to-device messages in D2C and C2D Messaging with IoT Hub.

このチュートリアルの最後に、次の 2 つの .NET コンソール アプリを実行します。At the end of this tutorial, you run two .NET console apps.

  • SimulatedDevice: デバイスから IoT ハブへのテレメトリの送信に関するページで作成されたアプリの修正版であり、IoT ハブに接続し、cloud-to-device メッセージを受信します。SimulatedDevice, a modified version of the app created in Send telemetry from a device to an IoT hub..., which connects to your IoT hub and receives cloud-to-device messages.

  • SendCloudToDevice。クラウドからデバイスへのメッセージを IoT Hub を介してデバイス アプリに送信し、その配信確認を受け取ります。SendCloudToDevice, which sends a cloud-to-device message to the device app through IoT Hub, and then receives its delivery acknowledgement.

注意

IoT Hub には、Azure IoT device SDK を介した多数のデバイス プラットフォームや言語 (C、Java、Javascript など) に対する SDK サポートがあります。IoT Hub has SDK support for many device platforms and languages (including C, Java, and Javascript) through Azure IoT device SDKs. このチュートリアルのコード (一般的には Azure IoT Hub) にデバイスを接続するための詳しい手順については、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.

このチュートリアルを完了するには、以下が必要です。To complete this tutorial, you need the following:

  • Visual StudioVisual Studio

  • アクティブな Azure アカウントアカウントがない場合、Azure 試用版にサインアップして、最大 10 件の無料 Mobile Apps を入手できます。An active Azure account. (アカウントがない場合は、無料アカウント を数分で作成できます)。(If you don't have an account, you can create a free account in just a couple of minutes.)

デバイス アプリでメッセージを受信するReceive messages in the device app

このセクションでは、デバイスから IoT ハブへのテレメトリの送信に関するページで作成したデバイス アプリを変更して、cloud-to-device メッセージを IoT ハブから受信するようにします。In this section, you'll 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. Visual Studio の SimulatedDevice プロジェクトで、次のメソッドを Program クラスに追加します。In Visual Studio, in the SimulatedDevice project, add the following method to the Program 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);
         }
     }
    

    ReceiveAsync メソッドは、受信したメッセージを、そのメッセージがデバイスによって受信されたとき非同期で返します。The ReceiveAsync method asynchronously returns the received message at the time that it is received by the device. 指定可能なタイムアウト期間が経過したら、null が返されます (ここでは、既定の 1 分が使用されます)。It returns null after a specifiable timeout period (in this case, the default of one minute is used). アプリは、null を受信したら、新しいメッセージを受信するために待機を続ける必要があります。When the app receives a null, it should continue to wait for new messages. if (receivedMessage == null) continue 行があるのは、この要件があるためです。This requirement is the reason for the if (receivedMessage == null) continue line.

    CompleteAsync() への呼び出しにより、メッセージが正常に処理されたことが IoT Hub に通知されます。The call to CompleteAsync() notifies IoT Hub that the message has been successfully processed. メッセージはデバイスのキューから安全に削除することができます。The message can be safely removed from the device queue. デバイスのアプリケーションがメッセージの処理を完了できなくなる何らかの事態が生じると、IoT Hub はそれをもう一度送信します。If something happened that prevented the device app from completing the processing of the message, IoT Hub delivers it again. そのため、同じメッセージを複数回受信した場合に生成される結果が毎回同じになるように、デバイス アプリ内のメッセージ処理ロジックをべき等にすることが重要です。It is then important that message processing logic in the device app is idempotent, so that receiving the same message multiple times produces the same result.

    アプリケーションはメッセージを一時的に破棄することもできます。この場合、IoT Hub は将来の使用に備えてメッセージをキュー内に保持します。An application can also temporarily abandon a message, which results in IoT hub retaining the message in the queue for future consumption. または、メッセージを拒否することもできます。この場合、メッセージはキューから完全に削除されます。Or the application can reject a message, which permanently removes the message from the queue. cloud-to-device メッセージのライフサイクルの詳細については、IoT Hub における D2C と C2D のメッセージングに関するページを参照してください。For more information about the cloud-to-device message lifecycle, see D2C and C2D messaging with IoT Hub.

    注意

    トランスポートとして MQTT や AMQP ではなく HTTPS を使用している場合、ReceiveAsync メソッドは即時に返されます。When using HTTPS instead of MQTT or AMQP as a transport, the ReceiveAsync method returns immediately. HTTPS を使用するクラウドからデバイスへのメッセージに関してサポートされているパターンは、メッセージを低頻度 (25 分未満の間隔) でチェックするデバイスに断続的に接続されます。The supported pattern for cloud-to-device messages with HTTPS is intermittently connected devices that check for messages infrequently (less than every 25 minutes). HTTPS 受信の発行が多くなれば、IoT Hub で要求が調整されます。Issuing more HTTPS receives results in IoT Hub throttling the requests. MQTT、AMQP、および HTTPS のサポートの相違点と、IoT Hub スロットルの詳細については、IoT Hub における D2C と C2D のメッセージングに関するページを参照してください。For more information about the differences between MQTT, AMQP and HTTPS support, and IoT Hub throttling, see D2C and C2D messaging with IoT Hub.

  2. Main メソッドの Console.ReadLine() 行の直前に次のメソッドを追加します。Add the following method in the Main method, right before the Console.ReadLine() line:

    ReceiveC2dAsync();
    

IoT ハブ接続文字列を取得するGet the IoT Hub connection string

最初に、ポータルから IoT ハブ接続文字列を取得します。First, retrieve the IoT Hub connection string from the portal.

  1. Azure portal にサインインし、 [リソース グループ] を選択します。Sign in to the Azure portal, select Resource groups.

  2. このハウツー記事で使用しているリソース グループを選択します。Select the Resource group you are using for this how-to.

  3. 使用している IoT ハブを選択します。Select the IoT Hub you are using.

  4. ハブ用のウィンドウで、 [共有アクセス ポリシー] を選択します。In the pane for the hub, select Shared access policies.

  5. [iothubowner] を選びます。Select iothubowner. [iothubowner] パネルに接続文字列が表示されます。It shows the connection strings on the iothubowner panel. [接続文字列--主キー] のコピー アイコンを選択します。Select the copy icon for the Connection string--primary key. 後で使用できるように接続文字列を保存します。Save the connection string for later use.

    IoT ハブ接続文字列を取得する

C2D メッセージを送信するSend a cloud-to-device message

次に、デバイスからクラウドへのメッセージを、デバイス アプリに送信する .NET コンソール アプリを作成します。Now you write a .NET console app that sends cloud-to-device messages to the device app.

  1. 現在の Visual Studio ソリューション内で、ソリューションを右クリックし、[追加]、[新しいプロジェクト] の順に選択します。In the current Visual Studio solution, right-click on the solution and select Add > New Project. [Windows デスクトップ][コンソール アプリ (.NET Framework)] の順に選択します。Select Windows Desktop and then Console App (.NET Framework). プロジェクトに「SendCloudToDevice」という名前を付け、.NET Framework の最新バージョンを選択した後、 [OK] を選択してプロジェクトを作成します。Name the project SendCloudToDevice and select the most recent version of the .NET Framework, then select OK to create the project.

    Visual Studio での新しいプロジェクト

  2. ソリューション エクスプローラーでソリューションを右クリックし、 [ソリューション用 NuGet パッケージの管理] をクリックします。In Solution Explorer, right-click the solution, and then click Manage NuGet Packages for Solution....

    この操作によって、 [NuGet パッケージの管理] ウィンドウが開きます。This action opens the Manage NuGet Packages window.

  3. Microsoft.Azure.Devices」を検索し、[参照] タブを選択します。パッケージが見つかったら、 [インストール] をクリックし、利用規約に同意します。Search for Microsoft.Azure.Devices, select the Browse tab. When you find the package, click Install, and accept the terms of use.

    これによりパッケージのダウンロードとインストールが実行され、Azure IoT - サービス SDK NuGet パッケージへの参照が追加されます。This downloads, installs, and adds a reference to the Azure IoT service SDK NuGet package.

  4. Program.cs ファイルの先頭に次の using ステートメントを追加します。Add the following using statement at the top of the Program.cs file.

    using Microsoft.Azure.Devices;
    
  5. Program クラスに次のフィールドを追加します。Add the following fields to the Program class. プレースホルダーの値を、このセクションで保存した IoT ハブ接続文字列に置き換えます。Substitute the placeholder value with the IoT hub connection string you saved previously in this section.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    
  6. Program クラスに次のメソッドを追加します。Add the following method to the Program class. [Send telemetry from a device to an IoT hub...](デバイスから IoT ハブへのテレメトリの送信) でデバイスを定義するときに使用したデバイス名を設定します。Set the device name to what you used when defining the device in Send telemetry from a device to an IoT hub....

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync("myDevice", commandMessage);
    }
    

    このメソッドは、クラウドからデバイスへの新しいメッセージを ID myFirstDeviceを持つデバイスに送信します。This method sends a new cloud-to-device message to the device with the ID, myFirstDevice. デバイスから IoT ハブへのテレメトリの送信に関するページで使用したパラメーターに変更を加えた場合にのみ、このパラメーターを変更します。Change this parameter only if you modified it from the one used in Send telemetry from a device to an IoT hub....

  7. 最後に、 Main メソッドに次の行を追加します。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();
    
  8. Visual Studio 内でソリューションを右クリックし、 [スタートアップ プロジェクトの設定] を選択します。 [マルチ スタートアップ プロジェクト] を選択してから、ReadDeviceToCloudMessagesSimulatedDeviceSendCloudToDevice[開始] アクションを選択します。From within Visual Studio, right-click your solution, and select Set StartUp projects.... Select Multiple startup projects, then select the Start action for ReadDeviceToCloudMessages, SimulatedDevice, and SendCloudToDevice.

  9. F5キーを押します。Press F5. 3 つのすべてのアプリケーションが開始されます。All three applications should start. [SendCloudToDevice] ウィンドウを選択して Enter キーを押します。Select the SendCloudToDevice windows, and press Enter. デバイス アプリによってメッセージが受信されていることがわかります。You should see the message being received by the device app.

    アプリによるメッセージの受信

配信フィードバックの受信Receive delivery feedback

クラウドからデバイスへの各メッセージに対して IoT Hub からの配信 (または有効期限) 確認を要求できます。It is possible to request delivery (or expiration) acknowledgements from IoT Hub for each cloud-to-device message. このオプションによって、ソリューション バックエンドで再試行または補正ロジックを簡単に通知できるようになります。This option enables the solution back end to easily inform retry or compensation logic. cloud-to-device フィードバックの詳細については、IoT Hub における D2C と C2D のメッセージングに関するページを参照してください。For more information about cloud-to-device feedback, see D2C and C2D Messaging with IoT Hub.

このセクションでは、フィードバックを要求し、それを IoT ハブから受信するように、SendCloudToDevice アプリを変更します。In this section, you modify the SendCloudToDevice app to request feedback, and receive it from the IoT hub.

  1. Visual Studio の SendCloudToDevice プロジェクトで、次のメソッドを 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);
         }
     }
    

    この受信パターンは、クラウドからデバイスへのメッセージをデバイス アプリから受信するために使用するものと同じであることに注意してください。Note this receive pattern is the same one used to receive cloud-to-device messages from the device app.

  2. Main メソッドの serviceClient = ServiceClient.CreateFromConnectionString(connectionString) 行の直後に次のメソッドを追加します。Add the following method in the Main method, right after the serviceClient = ServiceClient.CreateFromConnectionString(connectionString) line.

    ReceiveFeedbackAsync();
    
  3. クラウドからデバイスへのメッセージの配信に対するフィードバックを要求するには、SendCloudToDeviceMessageAsync メソッドでプロパティを指定する必要があります。To request feedback for the delivery of your cloud-to-device message, you have to specify a property in the SendCloudToDeviceMessageAsync method. var commandMessage = new Message(...); 行の直後に次の行を追加します。Add the following line, right after the var commandMessage = new Message(...); line.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. F5キーを押してアプリを実行します。Run the apps by pressing F5. 3 つすべてのアプリケーションが開始されていることが確認できます。You should see all three applications start. [SendCloudToDevice] ウィンドウを選択して Enter キーを押します。Select the SendCloudToDevice windows, and press Enter. デバイス アプリがメッセージを受信し、その数秒後に、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.

    アプリによるメッセージの受信

注意

わかりやすくするために、このチュートリアルでは再試行ポリシーは実装しません。For simplicity's sake, this tutorial does not implement any retry policy. 運用環境のコードでは、「一時的な障害の処理」の記事で推奨されているように、再試行ポリシー (指数関数的バックオフなど) を実装することをお勧めします。In production code, you should implement retry policies (such as exponential backoff), as suggested in the article, Transient Fault Handling.

次の手順Next steps

このハウツー記事では、cloud-to-device メッセージを送受信する方法を学習しました。In this how-to, you learned how to send and receive cloud-to-device messages.

IoT Hub を使用する完全なエンド ツー エンド ソリューションの例については、Azure IoT リモート監視ソリューション アクセラレータに関するページをご覧ください。To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Remote Monitoring solution accelerator.

IoT Hub を使用したソリューションの開発に関する詳細については、IoT Hub 開発者ガイドをご覧ください。To learn more about developing solutions with IoT Hub, see the IoT Hub developer guide.