IoT Hub を使用したクラウドからデバイスへのメッセージの送信 (Java)Send cloud-to-device messages with IoT Hub (Java)

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

このチュートリアルは、IoT Hub の概要に関するページのチュートリアルに基づいて作成されており、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 つの Java コンソール アプリを実行します。At the end of this tutorial, you run two Java console apps:

  • simulated-device。「IoT Hub の概要」で作成されたアプリの修正バージョン。これは、IoT Hub に接続し、C2D メッセージを受信します。simulated-device, 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.
  • send-c2d-messages。これは、C2D メッセージを IoT Hub を介してシミュレートされたデバイス アプリに送信し、その配信確認を受信します。send-c2d-messages, which sends a cloud-to-device message to the simulated 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) にデバイスを接続するための詳しい手順については、 Azure IoT デベロッパー センターのページを参照してください。For step-by-step instructions on how to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the [Azure IoT Developer Center].

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

シミュレートされたデバイス アプリでメッセージを受信するReceive messages in the simulated device app

このセクションでは、IoT Hub の概要に関するページで作成したシミュレートされたデバイス アプリを、クラウドからデバイスへのメッセージを IoT ハブから受信するように変更します。In this section, you modify the simulated device app you created in [Get started with IoT Hub] to receive cloud-to-device messages from the IoT hub.

  1. テキスト エディターを使用し、simulated-device\src\main\java\com\mycompany\app\App.java ファイルを開きます。Using a text editor, open the simulated-device\src\main\java\com\mycompany\app\App.java file.

  2. 次の MessageCallback クラスを、App クラス内のネストされたクラスとして追加します。Add the following MessageCallback class as a nested class inside the App class. デバイスが IoT Hub からメッセージを受信すると、 execute メソッドが呼び出されます。The execute method is invoked when the device receives a message from IoT Hub. この例では、デバイスはメッセージが完了したことを常に IoT ハブに通知します。In this example, the device always notifies the IoT hub that it has completed the message:

    private static class AppMessageCallback implements MessageCallback {
      public IotHubMessageResult execute(Message msg, Object context) {
        System.out.println("Received message from hub: "
          + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));
    
        return IotHubMessageResult.COMPLETE;
      }
    }
    
  3. main メソッドを次のとおり変更して、AppMessageCallback インスタンスを作成し、setMessageCallback メソッドを呼び出してから、クライアントを開くようにします。Modify the main method to create an AppMessageCallback instance and call the setMessageCallback method before it opens the client as follows:

    client = new DeviceClient(connString, protocol);
    
    MessageCallback callback = new AppMessageCallback();
    client.setMessageCallback(callback, null);
    client.open();
    

    注意

    トランスポートとして AMQP の代わりに HTTPS を使用した場合、DeviceClient インスタンスが IoT Hub からのメッセージをチェックする頻度は低くなります (25 分に 1 回未満)。If you use HTTPS instead of MQTT or AMQP as the transport, the DeviceClient instance checks for messages from IoT Hub infrequently (less than every 25 minutes). 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.

  4. Maven を使用して simulated-device アプリをビルドするには、コマンド プロンプトで simulated-device フォルダーに移動し、次のコマンドを実行します。To build the simulated-device app using Maven, execute the following command at the command prompt in the simulated-device folder:

    mvn clean package -DskipTests
    

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

このセクションでは、クラウドからデバイスへのメッセージを、シミュレーション済みデバイス アプリに送信する Java コンソール アプリを作成します。In this section, you create a Java console app that sends cloud-to-device messages to the simulated device app. IoT Hub の概要 のチュートリアルで追加したデバイスのデバイス ID が必要です。You need the device ID of the device you added in the [Get started with IoT Hub] tutorial. また、ハブの IoT Hub 接続文字列も必要です (Azure Portal で確認できます)。You also need the IoT Hub connection string for your hub that you can find in the Azure portal.

  1. コマンド プロンプトで次のコマンドを使用して、send-c2d-messages という Maven プロジェクトを作成します。Create a Maven project called send-c2d-messages using the following command at your command prompt. このコマンドが 1 つの長いコマンドであることに注意してください。Note this command is a single, long command:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. コマンド プロンプトで、新しい send-c2d-messages フォルダーに移動します。At your command prompt, navigate to the new send-c2d-messages folder.

  3. テキスト エディターを使用して、send-c2d-messages フォルダー内の pom.xml ファイルを開き、次の依存関係を dependencies ノードに追加します。Using a text editor, open the pom.xml file in the send-c2d-messages folder and add the following dependency to the dependencies node. 依存関係を追加することにより、アプリケーションの iothub-java-service-client パッケージを使用して、IoT Hub サービスと通信できます。Adding the dependency enables you to use the iothub-java-service-client package in your application to communicate with your IoT hub service:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-service-client</artifactId>
      <version>1.7.23</version>
    </dependency>
    

    注意

    Maven 検索を使用して、iot-service-client の最新バージョンを確認できます。You can check for the latest version of iot-service-client using Maven search.

  4. pom.xml ファイルを保存して閉じます。Save and close the pom.xml file.

  5. テキスト エディターを使用し、send-c2d-messages\src\main\java\com\mycompany\app\App.java ファイルを開きます。Using a text editor, open the send-c2d-messages\src\main\java\com\mycompany\app\App.java file.

  6. ファイルに次の import ステートメントを追加します。Add the following import statements to the file:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. 次のクラス レベルの変数を App クラスに追加し、{yourhubconnectionstring}{yourdeviceid} を先にメモした値に置き換えます。Add the following class-level variables to the App class, replacing {yourhubconnectionstring} and {yourdeviceid} with the values your noted earlier:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
    
  8. main メソッドを次のコードで置き換えます。Replace the main method with the following code. このコードは、IoT Hub に接続し、デバイスにメッセージを送信して、デバイスがメッセージを受信して処理したことを示す受信確認を受け取るまで待機します。This code connects to your IoT hub, sends a message to your device, and then waits for an acknowledgment that the device received and processed the message:

    public static void main(String[] args) throws IOException,
        URISyntaxException, Exception {
      ServiceClient serviceClient = ServiceClient.createFromConnectionString(
        connectionString, protocol);
    
      if (serviceClient != null) {
        serviceClient.open();
        FeedbackReceiver feedbackReceiver = serviceClient
          .getFeedbackReceiver();
        if (feedbackReceiver != null) feedbackReceiver.open();
    
        Message messageToSend = new Message("Cloud to device message.");
        messageToSend.setDeliveryAcknowledgement(DeliveryAcknowledgement.Full);
    
        serviceClient.send(deviceId, messageToSend);
        System.out.println("Message sent to device");
    
        FeedbackBatch feedbackBatch = feedbackReceiver.receive(10000);
        if (feedbackBatch != null) {
          System.out.println("Message feedback received, feedback time: "
            + feedbackBatch.getEnqueuedTimeUtc().toString());
        }
    
        if (feedbackReceiver != null) feedbackReceiver.close();
        serviceClient.close();
      }
    }
    

    注意

    わかりやすくするために、このチュートリアルでは再試行ポリシーは実装しません。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].

  9. Maven を使用して simulated-device アプリをビルドするには、コマンド プロンプトで simulated-device フォルダーに移動し、次のコマンドを実行します。To build the simulated-device app using Maven, execute the following command at the command prompt in the simulated-device folder:

    mvn clean package -DskipTests
    

アプリケーションの実行Run the applications

これで、アプリケーションを実行する準備が整いました。You are now ready to run the applications.

  1. simulated-device フォルダーからコマンド プロンプトで次のコマンドを実行し、IoT Hub へのテレメトリの送信を開始して、IoT Hub から送信される (クラウドからデバイスへの) メッセージをリッスンします。At a command prompt in the simulated-device folder, run the following command to begin sending telemetry to your IoT hub and to listen for cloud-to-device messages sent from your hub:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App" 
    

    シミュレーション済みデバイス アプリを実行する

  2. send-c2d-messages フォルダーからコマンド プロンプトで次のコマンドを実行し、クラウドからデバイスへのメッセージを送信して、フィードバックの配信確認を待機します。At a command prompt in the send-c2d-messages folder, run the following command to send a cloud-to-device message and wait for a feedback acknowledgment:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
    

    クラウドからデバイスへのメッセージを送信するコマンドを実行する

次のステップ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].