デバイスに 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. Azure IoT Hub for .NET の使用チュートリアルには、IoT Hub の作成方法、IoT Hub でデバイス ID をプロビジョニングする方法、およびデバイスからクラウドへのメッセージを送信するデバイス アプリをコード化する方法が示されています。The [Get started with IoT Hub] tutorial shows how to create an IoT hub, provision a device identity in it, and code a device app that sends device-to-cloud messages.

このチュートリアルは、Azure IoT Hub for .NET の使用に関するページのチュートリアルに基づいて作成されており、This tutorial builds on [Get started with IoT Hub]. 次の方法について説明します。It shows you how to:

  • ソリューション バックエンドから 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.

クラウドからデバイスへのメッセージの詳細については、IoT Hub 開発者ガイドを参照してください。You can find more information on cloud-to-device messages in the IoT Hub developer guide.

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

  • SimulatedDevice。「Azure IoT Hub for .NET の使用」で作成されたアプリケーションの修正バージョン。これは、IoT Hub に接続し、クラウドからデバイスへのメッセージを受け取ります。SimulatedDevice, a modified version of the app created in [Get started with 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 Studio 2015 または Visual Studio 2017Visual Studio 2015 or Visual Studio 2017
  • アクティブな Azure アカウント。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

このセクションでは、Azure IoT Hub for .NET の使用に関するページで作成したデバイス アプリを、クラウドからデバイスへのメッセージを IoT Hub から受信するように変更します。In this section, you'll modify the device app you created in [Get started with 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 deviceClient.ReceiveAsync();
             if (receivedMessage == null) continue;
    
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.WriteLine("Received message: {0}", Encoding.ASCII.GetString(receivedMessage.GetBytes()));
             Console.ResetColor();
    
             await 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. クラウドからデバイスへのメッセージのライフサイクルの詳細については、「Azure IoT Hub 開発者ガイド」を参照してください。For more information about the cloud-to-device message lifecycle, see the IoT Hub developer guide.

    注意

    トランスポートとして 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 開発者ガイドを参照してください。For more information about the differences between MQTT, AMQP and HTTPS support, and IoT Hub throttling, see the IoT Hub developer guide.

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

     ReceiveC2dAsync();
    

注意

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

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

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

  1. 現在の Visual Studio ソリューションで、コンソール アプリケーション プロジェクト テンプレートを使用して、Visual C# デスクトップ アプリ プロジェクトを作成します。In the current Visual Studio solution, create a Visual C# Desktop App project by using the Console Application project template. プロジェクトに SendCloudToDeviceという名前を付けます。Name the project SendCloudToDevice.

    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, 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. プレースホルダーの値を「Azure IoT Hub for .NET の使用」で取得した IoT hub の接続文字列に置き換えます。Substitute the placeholder value with the IoT hub connection string from [Get started with IoT Hub]:

     static ServiceClient serviceClient;
     static string connectionString = "{iot hub connection string}";
    
  6. Program クラスに次のメソッドを追加します。Add the following method to the Program class:

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

    このメソッドは、クラウドからデバイスへの新しいメッセージを ID myFirstDeviceを持つデバイスに送信します。This method sends a new cloud-to-device message to the device with the ID, myFirstDevice. Azure IoT Hub for .NET の使用に関するページで使用したパラメーターに変更を加えた場合にのみ、このパラメーターを変更します。Change this parameter only if you modified it from the one used in [Get started with 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. クラウドからデバイスへのメッセージに対するフィードバックの詳細については、「Azure IoT Hub 開発者ガイド」を参照してください。For more information about cloud-to-device feedback, see the IoT Hub developer guide.

このセクションでは、フィードバックを要求し、それを IoT Hub から受信するように、SendCloudToDevice アプリを変更します。In this section, you modify the SendCloudToDevice app to request feedback, and receive it from 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. 運用環境のコードでは、MSDN の記事「 Transient Fault Handling (一時的な障害の処理)」で推奨されているように、再試行ポリシー (指数関数的バックオフなど) を実装することをお勧めします。In production code, you should implement retry policies (such as exponential backoff), as suggested in the MSDN article [Transient Fault Handling].

次のステップNext steps

このチュートリアルでは、クラウドからデバイスへのメッセージを送受信する方法を学習しました。In this tutorial, you learned how to send and receive cloud-to-device messages.

IoT Hub を使用する完全なエンド ツー エンド ソリューションの例については、 Azure IoT Suiteに関するドキュメントをご覧ください。To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Suite.

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