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

はじめに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 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 の Standard レベルでのみ利用できます。The features described in this article are only available in the standard tier of IoT hub. IoT Hub の Basic レベルおよび Standard レベルについて詳しくは、適切な IoT Hub レベルの選び方に関するページを参照してください。For more information about the basic and standard IoT Hub tiers, see How to choose the right IoT Hub tier.

このチュートリアルは、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 つの Node.js コンソール アプリを実行します。At the end of this tutorial, you run two Node.js console apps:

  • SimulatedDevice。「IoT Hub の概要」で作成されたアプリケーションの修正バージョン。これは、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.
  • SendCloudToDeviceMessage。クラウドからデバイスへのメッセージを IoT Hub を介してシミュレートされたデバイス アプリに送信し、その配信確認を受け取ります。SendCloudToDeviceMessage, 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:

  • Node.js バージョン 4.0.x 以降。Node.js version 4.0.x or later.
  • アクティブな 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 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. テキスト エディターを使用して SimulatedDevice.js ファイルを開きます。Using a text editor, open the SimulatedDevice.js file.
  2. IoT Hub から送信されたメッセージを処理するように connectCallback 関数を変更します。Modify the connectCallback function to handle messages sent from IoT Hub. この例では、メッセージが処理されたことを IoT Hub に通知するために、デバイスは必ず complete 関数を呼び出します。In this example, the device always invokes the complete function to notify IoT Hub that it has processed the message. 変更後の connectCallback 関数は次のスニペットのようになります。Your new version of the connectCallback function looks like the following snippet:

    var connectCallback = function (err) {
      if (err) {
        console.log('Could not connect: ' + err);
      } else {
        console.log('Client connected');
        client.on('message', function (msg) {
          console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
          client.complete(msg, printResultFor('completed'));
        });
        // Create a message and send it to the IoT Hub every second
        setInterval(function(){
            var temperature = 20 + (Math.random() * 15);
            var humidity = 60 + (Math.random() * 20);            
            var data = JSON.stringify({ deviceId: 'myFirstNodeDevice', temperature: temperature, humidity: humidity });
            var message = new Message(data);
            message.properties.add('temperatureAlert', (temperature > 30) ? 'true' : 'false');
            console.log("Sending message: " + message.getData());
            client.sendEvent(message, printResultFor('send'));
        }, 1000);
      }
    };
    

    注意

    トランスポートとして 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.

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

このセクションでは、クラウドからデバイスへのメッセージを、シミュレートされたデバイス アプリに送信する Node.js コンソール アプリを作成します。In this section, you create a Node.js 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 ポータル で確認できます)。You also need the IoT Hub connection string for your hub that you can find in the Azure portal.

  1. 空のフォルダーを sendcloudtodevicemessageという名前で作成します。Create an empty folder called sendcloudtodevicemessage. コマンド プロンプトで次のコマンドを使用して、sendcloudtodevicemessage フォルダー内に package.json ファイルを作成します。In the sendcloudtodevicemessage folder, create a package.json file using the following command at your command prompt. 次の既定値をすべてそのまま使用します。Accept all the defaults:

    npm init
    
  2. コマンド プロンプトで、sendcloudtodevicemessage フォルダーに移動し、次のコマンドを実行して、azure-iothub パッケージをインストールします。At your command prompt in the sendcloudtodevicemessage folder, run the following command to install the azure-iothub package:

    npm install azure-iothub --save
    
  3. テキスト エディターを使用して、sendcloudtodevicemessage フォルダーに SendCloudToDeviceMessage.js ファイルを作成します。Using a text editor, create a SendCloudToDeviceMessage.js file in the sendcloudtodevicemessage folder.
  4. SendCloudToDeviceMessage.js ファイルの先頭に、次の require ステートメントを追加します。Add the following require statements at the start of the SendCloudToDeviceMessage.js file:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. 次のコードを SendCloudToDeviceMessage.js ファイルに追加します。Add the following code to SendCloudToDeviceMessage.js file. "{iot hub 接続文字列}" プレースホルダーの値は、IoT Hub の概要のチュートリアルで作成したハブの IoT Hub の接続文字列で置き換えてください。Replace the "{iot hub connection string}" placeholder value with the IoT Hub connection string for the hub you created in the Get started with IoT Hub tutorial. "{デバイス id}" プレースホルダーを、次のように IoT Hub の概要のチュートリアルで追加したデバイスのデバイス ID で置き換えます。Replace the "{device id}" placeholder with the device ID of the device you added in the Get started with IoT Hub tutorial:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. 操作結果をコンソールに出力するための次の関数を追加します。Add the following function to print operation results to the console:

    function printResultFor(op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res.constructor.name);
      };
    }
    
  7. 配信フィードバック メッセージをコンソールに出力するための次の関数を追加します。Add the following function to print delivery feedback messages to the console:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. デバイスにメッセージを送信し、クラウドからデバイスへのメッセージが配信されたことの確認応答がデバイスからあったときにフィードバック メッセージを処理するための次のコードを追加します。Add the following code to send a message to your device and handle the feedback message when the device acknowledges the cloud-to-device message:

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFeedbackReceiver(receiveFeedback);
        var message = new Message('Cloud to device message.');
        message.ack = 'full';
        message.messageId = "My Message ID";
        console.log('Sending message: ' + message.getData());
        serviceClient.send(targetDevice, message, printResultFor('send'));
      }
    });
    
  9. SendCloudToDeviceMessage.js ファイルを保存して閉じます。Save and close SendCloudToDeviceMessage.js file.

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

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

  1. simulateddevice フォルダーからコマンド プロンプトで次のコマンドを実行し、IoT Hub にテレメトリを送信して、クラウドからデバイスへのメッセージを待機します。At the command prompt in the simulateddevice folder, run the following command to send telemetry to IoT Hub and to listen for cloud-to-device messages:

    node SimulatedDevice.js 
    

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

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

    node SendCloudToDeviceMessage.js 
    

    クラウドからデバイスへのコマンドを送信するアプリを実行する

    注意

    わかりやすくするために、このチュートリアルでは再試行ポリシーは実装しません。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 リモート監視ソリューション アクセラレータに関するページをご覧ください。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.