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

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 メッセージを送信するデバイス アプリをコード化する方法が示されています。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.

注意

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

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

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

  • SimulatedDeviceSimulatedDevice. このアプリは IoT ハブに接続し、cloud-to-device メッセージを受信します。This app connects to your IoT hub and receives cloud-to-device messages. このアプリは、「デバイスから IoT ハブへのテレメトリの送信」で作成されたアプリの改良版です。This app is a modified version of the app created in Send telemetry from a device to an IoT hub.

  • SendCloudToDeviceSendCloudToDevice. このアプリは cloud-to-device メッセージを IoT Hub を介してデバイス アプリに送信し、その配信確認を受け取ります。This app sends a cloud-to-device message to the device app through IoT Hub, and then receives its delivery acknowledgment.

注意

IoT Hub には、Azure IoT device SDK シリーズを介した多数のデバイス プラットフォームや言語 (C、Java、Python、JavaScript など) に対する SDK サポートがあります。IoT Hub has SDK support for many device platforms and languages, including C, Java, Python, 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.

前提条件Prerequisites

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

  • ポート 8883 がファイアウォールで開放されていることを確認してください。Make sure that port 8883 is open in your firewall. この記事のデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。The device sample in this article uses MQTT protocol, which communicates over port 8883. このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。This port may be blocked in some corporate and educational network environments. この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

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

このセクションでは、「デバイスから IoT ハブへのテレメトリの送信」で作成したデバイス アプリを変更し、cloud-to-device メッセージを IoT ハブから受信するようにします。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. Visual Studio の SimulatedDevice プロジェクトで、次のメソッドを 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. Main メソッドの Console.ReadLine() 行の直前に次のメソッドを追加します。Add the following method in the Main method, right before the Console.ReadLine() line:

    ReceiveC2dAsync();
    

ReceiveAsync メソッドは、受信したメッセージを、そのメッセージがデバイスによって受信されたとき非同期で返します。The ReceiveAsync method asynchronously returns the received message at the time that it is received by the device. 指定可能タイムアウト期間を過ぎると null が返されます。It returns null after a specifiable timeout period. この例では、既定の 1 分が使用されます。In this example, 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. 同じメッセージを複数回受信した場合に生成される結果が毎回同じになるように、デバイス アプリ内のメッセージ処理ロジックをべき等にする必要があります。The message processing logic in the device app must be 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.

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

この記事では、「デバイスから IoT ハブへのテレメトリの送信」で作成した IoT ハブを介して cloud-to-device メッセージを送信するバックエンド サービスを作成します。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. cloud-to-device メッセージを送信するサービスには、サービス接続のアクセス許可が必要となります。To send cloud-to-device messages, your service needs the service connect permission. 既定では、どの IoT Hub も、このアクセス許可を付与する service という名前の共有アクセス ポリシーがある状態で作成されます。By default, every IoT Hub is created with a shared access policy named service that grants this permission.

サービス ポリシーの IoT Hub 接続文字列を取得するには、次の手順を実行します。To get the IoT Hub connection string for the service policy, follow these steps:

  1. Azure portal で、 [リソース グループ] を選択します。In the Azure portal, select Resource groups. ハブが配置されているリソース グループを選択し、リソースの一覧からハブを選択します。Select the resource group where your hub is located, and then select your hub from the list of resources.

  2. IoT ハブの左側のウィンドウで、 [共有アクセス ポリシー] を選択します。On the left-side pane of your IoT hub, select Shared access policies.

  3. ポリシーの一覧から、サービス ポリシーを選択します。From the list of policies, select the service policy.

  4. [共有アクセス キー] で、 [接続文字列 - プライマリ キー] のコピー アイコンを選択し、その値を保存します。Under Shared access keys, select the copy icon for the Connection string -- primary key and save the value.

    接続文字列を取得する方法を示す画面

IoT Hub の共有アクセス ポリシーとアクセス許可の詳細については、「アクセス制御とアクセス許可」を参照してください。For more information about IoT Hub shared access policies and permissions, see Access control and permissions.

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

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

  1. 現在の Visual Studio ソリューションで、ファイル > 新規 > 、プロジェクト の順に選択します。In the current Visual Studio solution, select File > New > Project. [新しいプロジェクトの作成] で、 [コンソール アプリ (.NET Framework)] を選択してから、 [次へ] を選択します。In Create a new project, select Console App (.NET Framework), and then select Next.

  2. プロジェクトに SendCloudToDeviceという名前を付けます。Name the project SendCloudToDevice. [ソリューション][ソリューションに追加] を選択し、最新版の .NET Framework をそのまま使用します。Under Solution, select Add to solution and accept the most recent version of the .NET Framework. [作成] を選択してプロジェクトを作成します。Select Create to create the project.

    Visual Studio で新しいプロジェクトを構成する

  3. ソリューション エクスプローラーで、新しいプロジェクトを右クリックし、 [NuGet パッケージの管理] を選択します。In Solution Explorer, right-click the new project, and then select Manage NuGet Packages.

  4. [NuGet パッケージの管理] ウィンドウで [参照] を選択し、Microsoft.Azure.Devices を検索して選択します。In Manage NuGet Packages, select Browse, and then search for and select Microsoft.Azure.Devices. [インストール] を選択します。Select Install.

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

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

    using Microsoft.Azure.Devices;
    
  6. Program クラスに次のフィールドを追加します。Add the following fields to the Program class. {iot hub connection string} プレースホルダーの値を、先ほど「IoT ハブ接続文字列を取得する」で書き留めた 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. {device id} プレースホルダー値は、デバイスから IoT Hub へのテレメトリ送信に関するクイックスタートで追加したデバイスのデバイス ID で置き換えてください。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. メッセージをデバイスに送信するために、次のメソッドを Program クラスに追加します。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. 最後に、 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();
    
  9. ソリューション エクスプローラーで、ソリューションを右クリックし、 [スタートアップ プロジェクトの設定] を選択します。In Solutions Explorer, right-click your solution, and select Set StartUp Projects.

  10. [共通プロパティ] > [スタートアップ プロジェクト][マルチ スタートアップ プロジェクト] を選択してから、SimulatedDevice および SendCloudToDevice[開始] アクションを選択します。In Common Properties > Startup Project, select Multiple startup projects, then select the Start action for SimulatedDevice and SendCloudToDevice. [OK] を選択して変更を保存します。Select OK to save your changes.

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

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

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

各 cloud-to-device メッセージに対して IoT Hub からの配信 (または有効期限) 確認を要求することができます。It is possible to request delivery (or expiration) acknowledgments 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 line in the Main method, right after serviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    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. 両方のアプリケーションが開始されていることが確認できます。You should see both applications start. [SendCloudToDevice] ウィンドウを選択して Enter キーを押します。Select the SendCloudToDevice window, 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, this tutorial does not implement any retry policy. 運用コードでは、「一時的な障害の処理」で推奨されているように、再試行ポリシー (エクスポネンシャル バックオフなど) を実装してください。In production code, you should implement retry policies, such as exponential backoff, as suggested in 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.