チュートリアル:バックエンド サービスからデバイスを構成するTutorial: Configure your devices from a back-end service

場合によっては、デバイスからテレメトリを受信するだけでなく、バックエンド サービスからデバイスを構成する必要があります。As well as receiving telemetry from your devices, you may need to configure your devices from your back-end service. デバイスに必要な構成を送信するときに、それらのデバイスから状態とコンプライアンスの更新を受信したい場合もあります。When you send a desired configuration to your devices, you may also want to receive status and compliance updates from those devices. たとえば、デバイスの目標動作温度範囲を設定する場合や、デバイスからファームウェアのバージョン情報を収集する場合などです。For example, you might set a target operational temperature range for a device or collect firmware version information from your devices.

デバイスと IoT ハブ間で状態情報を同期するには、デバイス ツイン を使用します。To synchronize state information between a device and an IoT hub, you use device twins. デバイス ツインは、特定のデバイスに関連付けられた JSON ドキュメントであり、IoT Hub によってクラウドに格納されます。また、デバイス ツインに対してクエリを実行することができます。A device twin is a JSON document, associated with a specific device, and stored by IoT Hub in the cloud where you can query them. デバイス ツインには、必要なプロパティ報告されたプロパティ、および タグ が含まれています。A device twin contains desired properties, reported properties, and tags. 必要なプロパティは、バックエンド アプリケーションによって設定され、デバイスから読み取られます。A desired property is set by a back-end application and read by a device. 報告されたプロパティは、デバイスによって設定され、バックエンド アプリケーションによって読み取られます。A reported property is set by a device and read by a back-end application. タグはバックエンド アプリケーションによって設定され、デバイスに送信されることはありません。A tag is set by a back-end application and is never sent to a device. タグはデバイスの整理に使用します。You use tags to organize your devices. このチュートリアルでは、必要なプロパティと報告されたプロパティを使用して状態情報を同期する方法について説明します。This tutorial shows you how to use desired and reported properties to synchronize state information:

ツインの概要

このチュートリアルでは、以下のタスクを実行します。In this tutorial, you perform the following tasks:

  • IoT ハブを作成し、テスト デバイスを ID レジストリに追加する。Create an IoT hub and add a test device to the identity registry.
  • 必要なプロパティを使用して、シミュレートされたデバイスに状態情報を送信する。Use desired properties to send state information to your simulated device.
  • 報告されたプロパティを使用して、シミュレートされたデバイスから状態情報を受信する。Use reported properties to receive state information from your simulated device.

Azure Cloud Shell を使用するUse Azure Cloud Shell

Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell で Bash または PowerShell を使用して、Azure サービスを操作できます。You can use either Bash or PowerShell with Cloud Shell to work with Azure services. ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Azure Cloud Shell を開始するには:To start Azure Cloud Shell:

オプションOption 例とリンクExample/Link
コード ブロックの右上隅にある [使ってみる] を選択します。Select Try It in the upper-right corner of a code block. [使ってみる] を選択しても、コードは Cloud Shell に自動的にコピーされません。Selecting Try It doesn't automatically copy the code to Cloud Shell. Azure Cloud Shell の [使ってみる] の例
https://shell.azure.com に移動するか、 [Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. 新しいウィンドウで Cloud Shell を起動するLaunch Cloud Shell in a new window
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。Select the Cloud Shell button on the menu bar at the upper right in the Azure portal. Azure Portal の [Cloud Shell] ボタン

Azure Cloud Shell でこの記事のコードを実行するには:To run the code in this article in Azure Cloud Shell:

  1. Cloud Shell を開始します。Start Cloud Shell.

  2. [コピー] ボタンを選択して、コード ブロックをコードにコピーします。Select the Copy button on a code block to copy the code.

  3. Windows と Linux では Ctrl+Shift+V キーを選択し、macOS では Cmd+Shift+V キーを選択して、コードを Cloud Shell セッションに貼り付けます。Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Enter キーを選択して、コードを実行します。Select Enter to run the code.

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

このクイック スタートで実行する 2 つのサンプル アプリケーションは、Node.js を使って書かれています。The two sample applications you run in this quickstart are written using Node.js. 開発用コンピューター上に Node.js v10.x.x 以降が必要です。You need Node.js v10.x.x or later on your development machine.

複数のプラットフォームに対応する Node.js を nodejs.org からダウンロードできます。You can download Node.js for multiple platforms from nodejs.org.

開発コンピューターに現在インストールされている Node.js のバージョンは、次のコマンドを使って確認できます。You can verify the current version of Node.js on your development machine using the following command:

node --version

https://github.com/Azure-Samples/azure-iot-samples-node/archive/master.zip からサンプル Node.js プロジェクトをダウンロードし、ZIP アーカイブを抽出します。Download the sample Node.js project from https://github.com/Azure-Samples/azure-iot-samples-node/archive/master.zip and extract the ZIP archive.

ポート 8883 がファイアウォールで開放されていることを確認してください。Make sure that port 8883 is open in your firewall. このチュートリアルのデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。The device sample in this tutorial 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).

Azure リソースの設定Set up Azure resources

このチュートリアルを完了するには、Azure サブスクリプションに、デバイスがデバイス ID レジストリに追加されている IoT ハブが含まれている必要があります。To complete this tutorial, your Azure subscription must contain an IoT hub with a device added to the device identity registry. デバイス ID レジストリにエントリがあることで、このチュートリアルで実行するシミュレートされたデバイスがハブに接続できます。The entry in the device identity registry enables the simulated device you run in this tutorial to connect to your hub.

サブスクリプションで IoT ハブをまだ設定していない場合は、次の CLI スクリプトを使用して IoT ハブを設定できます。If you don't already have an IoT hub set up in your subscription, you can set one up with the following CLI script. このスクリプトでは、IoT ハブに tutorial-iot-hub という名前を使用していますが、実行時にはこの名前を一意の名前に置き換える必要があります。This script uses the name tutorial-iot-hub for the IoT hub, you should replace this name with your own unique name when you run it. このスクリプトで、米国中部リージョンにリソース グループとハブが作成されますが、より近いリージョンに変更することもできます。The script creates the resource group and hub in the Central US region, which you can change to a region closer to you. このスクリプトで、IoT ハブ サービス接続文字列が取得されます。この文字列をバックエンド サンプルで使用して IoT ハブに接続します。The script retrieves your IoT hub service connection string, which you use in the back-end sample to connect to your IoT hub:

hubname=tutorial-iot-hub
location=centralus

# Install the IoT extension if it's not already installed:
az extension add --name azure-iot

# Create a resource group:
az group create --name tutorial-iot-hub-rg --location $location

# Create your free-tier IoT Hub. You can only have one free IoT Hub per subscription:
az iot hub create --name $hubname --location $location --resource-group tutorial-iot-hub-rg --sku F1

# Make a note of the service connection string, you need it later:
az iot hub show-connection-string --name $hubname --policy-name service -o table

このチュートリアルでは、MyTwinDevice というシミュレートされたデバイスを使用します。This tutorial uses a simulated device called MyTwinDevice. 次のスクリプトで、このデバイスは ID レジストリに追加され、接続文字列が取得されます。The following script adds this device to your identity registry and retrieves its connection string:

# Set the name of your IoT hub:
hubname=tutorial-iot-hub

# Create the device in the identity registry:
az iot hub device-identity create --device-id MyTwinDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg

# Retrieve the device connection string, you need this later:
az iot hub device-identity show-connection-string --device-id MyTwinDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg -o table

状態情報を送信するSend state information

必要なプロパティを使用して、バックエンド アプリケーションからデバイスに状態情報を送信します。You use desired properties to send state information from a back-end application to a device. このセクションでは、次の方法について説明します。In this section, you see how to:

  • デバイスで必要なプロパティを受信して処理する。Receive and process desired properties on a device.
  • バックエンド アプリケーションから必要なプロパティを送信する。Send desired properties from a back-end application.

必要なプロパティを受信するシミュレートされたデバイス サンプル コードを表示するには、ダウンロードしたサンプル Node.js プロジェクトの iot-hub/Tutorials/DeviceTwins フォルダーに移動します。To view the simulated device sample code that receives desired properties, navigate to the iot-hub/Tutorials/DeviceTwins folder in the sample Node.js project you downloaded. 次にテキスト エディターで SimulatedDevice.js ファイルを開きます。Then open the SimulatedDevice.js file in a text editor.

次のセクションでは、バックエンド アプリケーションから送信される必要なプロパティの変更に反応する、シミュレートされたデバイスで実行されるコードについて説明します。The following sections describe the code that runs on the simulated device that responds to desired property changes sent from the back end application:

デバイス ツイン オブジェクトを取得するRetrieve the device twin object

次のコードでは、デバイス接続文字列を使用して IoT ハブに接続します。The following code connects to your IoT hub using a device connection string:

// Get the device connection string from a command line argument
var connectionString = process.argv[2];

次のコードでは、クライアント オブジェクトからツインを取得します。The following code gets a twin from the client object:

// Get the device twin
client.getTwin(function(err, twin) {
  if (err) {
    console.error(chalk.red('Could not get device twin'));
  } else {
    console.log(chalk.green('Device twin created'));

必要なプロパティのサンプルSample desired properties

アプリケーションに適した方法で必要なプロパティを構成することができます。You can structure your desired properties in any way that's convenient to your application. この例では、fanOn という 1 つの最上位プロパティを使用し、その他のプロパティを個別のコンポーネントにグループ化します。This example uses one top-level property called fanOn and groups the remaining properties into separate components. 次の JSON スニペットは、このチュートリアルで使用する必要なプロパティの構造を示しています。The following JSON snippet shows the structure of the desired properties this tutorial uses:

{
  "fanOn": "true",
  "components": {
    "system": {
      "id": "17",
      "units": "farenheit",
      "firmwareVersion": "9.75"
    },
    "wifi" : { 
      "channel" : "6",
      "ssid": "my_network"
    },
    "climate" : {
      "minTemperature": "68",
      "maxTemperature": "76"
    }
  }
}

ハンドラーを作成するCreate handlers

JSON 階層内のさまざまなレベルの更新に反応して必要なプロパティを更新するハンドラーを作成できます。You can create handlers for desired property updates that respond to updates at different levels in the JSON hierarchy. たとえば、このハンドラーは、バックエンド アプリケーションからデバイスに送信されるすべてのプロパティの変更を把握しています。For example, this handler sees all desired property changes sent to the device from a back-end application. delta 変数には、ソリューションのバックエンドから送信された必要なプロパティが含まれています。The delta variable contains the desired properties sent from the solution back end:

// Handle all desired property updates
twin.on('properties.desired', function(delta) {
    console.log(chalk.yellow('\nNew desired properties received in patch:'));

次のハンドラーは、必要なプロパティ fanOn に加えられた変更にのみ反応します。The following handler only reacts to changes made to the fanOn desired property:

// Handle changes to the fanOn desired property
twin.on('properties.desired.fanOn', function(fanOn) {
    console.log(chalk.green('\nSetting fan state to ' + fanOn));

    // Update the reported property after processing the desired property
    reportedPropertiesPatch.fanOn = fanOn ? fanOn : '{unknown}';
});

複数のプロパティのハンドラーHandlers for multiple properties

前に示した必要なプロパティの JSON の例では、componentsclimate ノードに minTemperaturemaxTemperature という 2 つのプロパティが含まれています。In the example desired properties JSON shown previously, the climate node under components contains two properties, minTemperature and maxTemperature.

デバイスのローカルの twin オブジェクトには、必要なプロパティと報告されたプロパティの完全なセットが格納されています。A device's local twin object stores a complete set of desired and reported properties. バックエンドから送信された delta で、必要なプロパティのサブセットのみが更新される可能性があります。The delta sent from the back end might update just a subset of desired properties. 次のコード スニペットでは、シミュレートされたデバイスが minTemperaturemaxTemperature のいずれかの更新を受信した場合に、ローカルの twin の値をもう一方の値に使用し、デバイスを構成します。In the following code snippet, if the simulated device receives an update to just one of minTemperature and maxTemperature, it uses the value in the local twin for the other value to configure the device:

// Handle desired properties updates to the climate component
twin.on('properties.desired.components.climate', function(delta) {
    if (delta.minTemperature || delta.maxTemperature) {
      console.log(chalk.green('\nUpdating desired tempertures in climate component:'));
      console.log('Configuring minimum temperature: ' + twin.properties.desired.components.climate.minTemperature);
      console.log('Configuring maximum temperture: ' + twin.properties.desired.components.climate.maxTemperature);

      // Update the reported properties and send them to the hub
      reportedPropertiesPatch.minTemperature = twin.properties.desired.components.climate.minTemperature;
      reportedPropertiesPatch.maxTemperature = twin.properties.desired.components.climate.maxTemperature;
      sendReportedProperties();
    }
});

ローカルの twin オブジェクトには、必要なプロパティと報告されたプロパティの完全なセットが格納されています。The local twin object stores a complete set of desired and reported properties. バックエンドから送信された delta で、必要なプロパティのサブセットのみが更新される可能性があります。The delta sent from the back end might update just a subset of desired properties.

挿入、更新、削除操作を処理するHandle insert, update, and delete operations

バックエンドから送信される必要なプロパティは、特定の必要なプロパティに対して実行されている操作を示していません。The desired properties sent from the back end don't indicate what operation is being performed on a particular desired property. コードで、ローカルに格納されている現在の必要なプロパティとハブから送信された変更のセットから、操作を推測する必要があります。Your code needs to infer the operation from the current set of desired properties stored locally and the changes sent from the hub.

次のスニペットは、シミュレートされたデバイスが、必要なプロパティの components のリストに対して挿入、更新、および削除操作を処理する方法を示しています。The following snippet shows how the simulated device handles insert, update, and delete operations on the list of components in the desired properties. コンポーネントを削除する必要があることを示すために、null 値を使用する方法も確認できます。You can see how to use null values to indicate that a component should be deleted:

// Keep track of all the components the device knows about
var componentList = {};

// Use this componentList list and compare it to the delta to infer
// if anything was added, deleted, or updated.
twin.on('properties.desired.components', function(delta) {
  if (delta === null) {
    componentList = {};
  }
  else {
    Object.keys(delta).forEach(function(key) {

      if (delta[key] === null && componentList[key]) {
        // The delta contains a null value, and the
        // device has a record of this component.
        // Must be a delete operation.
        console.log(chalk.green('\nDeleting component ' + key));
        delete componentList[key];

      } else if (delta[key]) {
        if (componentList[key]) {
          // The delta contains a component, and the
          // device has a record of it.
          // Must be an update operation.
          console.log(chalk.green('\nUpdating component ' + key + ':'));
          console.log(JSON.stringify(delta[key]));
          // Store the complete object instead of just the delta
          componentList[key] = twin.properties.desired.components[key];

        } else {
          // The delta contains a component, and the
          // device has no record of it.
          // Must be an add operation.
          console.log(chalk.green('\nAdding component ' + key + ':'));
          console.log(JSON.stringify(delta[key]));
          // Store the complete object instead of just the delta
          componentList[key] = twin.properties.desired.components[key];
        }
      }
    });
  }
});

バックエンドからデバイスに必要なプロパティを送信するSend desired properties to a device from the back end

これまでは、必要なプロパティの更新を受信するためにデバイスがハンドラーを実装する方法を見てきました。You've seen how a device implements handlers for receiving desired property updates. このセクションでは、バックエンド アプリケーションからデバイスに必要なプロパティの変更を送信する方法について説明します。This section shows you how to send desired property changes to a device from a back-end application.

必要なプロパティを受信するシミュレートされたデバイス サンプル コードを表示するには、ダウンロードしたサンプル Node.js プロジェクトの iot-hub/Tutorials/DeviceTwins フォルダーに移動します。To view the simulated device sample code that receives desired properties, navigate to the iot-hub/Tutorials/DeviceTwins folder in the sample Node.js project you downloaded. 次に、テキスト エディターで ServiceClient.js ファイルを開きます。Then open the ServiceClient.js file in a text editor.

次のコード スニペットは、デバイス ID レジストリに接続し、特定のデバイスのツインにアクセスする方法を示しています。The following code snippet shows how to connect to the device identity registry and access the twin for a specific device:

// Create a device identity registry object
var registry = Registry.fromConnectionString(connectionString);

// Get the device twin and send desired property update patches at intervals.
// Print the reported properties after some of the desired property updates.
registry.getTwin(deviceId, async (err, twin) => {
  if (err) {
    console.error(err.message);
  } else {
    console.log('Got device twin');

次のスニペットは、バックエンド アプリケーションがデバイスに送信するさまざまな必要なプロパティのパッチを示しています。The following snippet shows different desired property patches the back end application sends to the device:

// Turn the fan on
var twinPatchFanOn = {
  properties: {
    desired: {
      patchId: "Switch fan on",
      fanOn: "false",
    }
  }
};

// Set the maximum temperature for the climate component
var twinPatchSetMaxTemperature = {
  properties: {
    desired: {
      patchId: "Set maximum temperature",
      components: {
        climate: {
          maxTemperature: "92"
        }
      }
    }
  }
};

// Add a new component
var twinPatchAddWifiComponent = {
  properties: {
    desired: {
      patchId: "Add WiFi component",
      components: {
        wifi: { 
          channel: "6",
          ssid: "my_network"
        }
      }
    }
  }
};

// Update the WiFi component
var twinPatchUpdateWifiComponent = {
  properties: {
    desired: {
      patchId: "Update WiFi component",
      components: {
        wifi: { 
          channel: "13",
          ssid: "my_other_network"
        }
      }
    }
  }
};

// Delete the WiFi component
var twinPatchDeleteWifiComponent = {
  properties: {
    desired: {
      patchId: "Delete WiFi component",
      components: {
        wifi: null
      }
    }
  }
};

次のスニペットは、バックエンド アプリケーションが必要なプロパティの更新をデバイスに送信する方法を示しています。The following snippet shows how the back-end application sends a desired property update to a device:

// Send a desired property update patch
async function sendDesiredProperties(twin, patch) {
  twin.update(patch, (err, twin) => {
    if (err) {
      console.error(err.message);
    } else {
      console.log(chalk.green(`\nSent ${twin.properties.desired.patchId} patch:`));
      console.log(JSON.stringify(patch, null, 2));
    }
  });
}

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

このセクションでは、2 つのサンプル アプリケーションを実行して、バックエンド アプリケーションが必要なプロパティの更新をシミュレートされたデバイス アプリケーションに送信するときを監視します。In this section, you run two sample applications to observe as a back-end application sends desired property updates to a simulated device application.

シミュレートされたデバイスとバックエンド アプリケーションを実行するには、デバイスとサービス接続文字列が必要です。To run the simulated device and back-end applications, you need the device and service connection strings. このチュートリアルの冒頭でリソースの作成時に接続文字列をメモしました。You made a note of the connection strings when you created the resources at the start of this tutorial.

シミュレートされたデバイス アプリケーションを実行するには、シェルまたはコマンド プロンプト ウィンドウを開き、ダウンロードした Node.js プロジェクトの iot-hub/Tutorials/DeviceTwins フォルダーに移動します。To run the simulated device application, open a shell or command prompt window and navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. 次のコマンドを実行します。Then run the following commands:

npm install
node SimulatedDevice.js "{your device connection string}"

バックエンド アプリケーションを実行するには、別のシェルまたはコマンド プロンプト ウィンドウを開きます。To run the back-end application, open another shell or command prompt window. 次に、ダウンロードした Node.js プロジェクトの iot-hub/Tutorials/DeviceTwins フォルダーに移動します。Then navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. 次のコマンドを実行します。Then run the following commands:

npm install
node ServiceClient.js "{your service connection string}"

次のスクリーンショットは、シミュレートされたデバイス アプリケーションからの出力を示しています。必要なプロパティ maxTemperature の更新を処理する方法が強調表示されています。The following screenshot shows the output from the simulated device application and highlights how it handles an update to the maxTemperature desired property. 最上位のハンドラーと climate コンポーネント ハンドラーの両方がどのように動作するかがわかります。You can see how both the top-level handler and the climate component handlers run:

最上位のハンドラーと climate コンポーネント ハンドラーの両方がどのように動作するかを示すスクリーンショット。

次のスクリーンショットは、バックエンド アプリケーションからの出力を示しています。必要なプロパティ maxTemperature に更新が送信される方法が強調表示されています。The following screenshot shows the output from the back-end application and highlights how it sends an update to the maxTemperature desired property:

バックエンド アプリケーションからの出力を示し、更新が送信される方法が強調表示されているスクリーンショット。

状態情報を受信するReceive state information

バックエンド アプリケーションは、デバイスからの状態情報を報告されたプロパティとして受信します。Your back-end application receives state information from a device as reported properties. デバイスは報告されたプロパティを設定し、ハブに送信します。A device sets the reported properties, and sends them to your hub. バックエンド アプリケーションは、ハブに格納されているデバイス ツインから、報告されたプロパティの現在の値を読み取ることができます。A back-end application can read the current values of the reported properties from the device twin stored in your hub.

デバイスから報告されたプロパティを送信するSend reported properties from a device

報告されたプロパティ値の更新をパッチとして送信できます。You can send updates to reported property values as a patch. 次のスニペットは、シミュレートされたデバイスが送信するパッチのテンプレートを示しています。The following snippet shows a template for the patch the simulated device sends. シミュレートされたデバイスは、パッチのフィールドを更新してからハブに送信します。The simulated device updates the fields in the patch before sending it to the hub:

// Create a patch to send to the hub
var reportedPropertiesPatch = {
  firmwareVersion:'1.2.1',
  lastPatchReceivedId: '',
  fanOn:'',
  minTemperature:'',
  maxTemperature:''
};

シミュレートされたデバイスは、次の関数を使用して、報告されたプロパティを含むパッチをハブに送信します。The simulated device uses the following function to send the patch that contains the reported properties to the hub:

// Send the reported properties patch to the hub
function sendReportedProperties() {
  twin.properties.reported.update(reportedPropertiesPatch, function(err) {
    if (err) throw err;
    console.log(chalk.blue('\nTwin state reported'));
    console.log(JSON.stringify(reportedPropertiesPatch, null, 2));
  });
}

報告されたプロパティを処理するProcess reported properties

バックエンド アプリケーションは、デバイス ツインを介して、デバイスの現在の報告されたプロパティ値にアクセスします。A back-end application accesses the current reported property values for a device through the device twin. 次のスニペットは、バックエンド アプリケーションがシミュレーションされたデバイスの報告されたプロパティ値を読み取る方法を示しています。The following snippet shows you how the back-end application reads the reported property values for the simulated device:

// Display the reported properties from the device
function printReportedProperties(twin) {
  console.log("Last received patch: " + twin.properties.reported.lastPatchReceivedId);
  console.log("Firmware version: " + twin.properties.reported.firmwareVersion);
  console.log("Fan status: " + twin.properties.reported.fanOn);
  console.log("Min temperature set: " + twin.properties.reported.minTemperature);
  console.log("Max temperature set: " + twin.properties.reported.maxTemperature);
}

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

このセクションでは、2 つのサンプル アプリケーションを実行して、シミュレートされたデバイスが報告されたプロパティの更新をバックエンド アプリケーションに送信するときを監視します。In this section, you run two sample applications to observe as a simulated device application sends reported property updates to a back-end application.

実行した 2 つの同じサンプル アプリケーションを実行して、必要なプロパティがデバイスにどのように送信されるかを確認します。You run the same two sample applications that you ran to see how desired properties are sent to a device.

シミュレートされたデバイスとバックエンド アプリケーションを実行するには、デバイスとサービス接続文字列が必要です。To run the simulated device and back-end applications, you need the device and service connection strings. このチュートリアルの冒頭でリソースの作成時に接続文字列をメモしました。You made a note of the connection strings when you created the resources at the start of this tutorial.

シミュレートされたデバイス アプリケーションを実行するには、シェルまたはコマンド プロンプト ウィンドウを開き、ダウンロードした Node.js プロジェクトの iot-hub/Tutorials/DeviceTwins フォルダーに移動します。To run the simulated device application, open a shell or command prompt window and navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. 次のコマンドを実行します。Then run the following commands:

npm install
node SimulatedDevice.js "{your device connection string}"

バックエンド アプリケーションを実行するには、別のシェルまたはコマンド プロンプト ウィンドウを開きます。To run the back-end application, open another shell or command prompt window. 次に、ダウンロードした Node.js プロジェクトの iot-hub/Tutorials/DeviceTwins フォルダーに移動します。Then navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. 次のコマンドを実行します。Then run the following commands:

npm install
node ServiceClient.js "{your service connection string}"

次のスクリーンショットは、シミュレートされたデバイス アプリケーションからの出力を示しています。報告されたプロパティの更新をハブに送信する方法が強調表示されています。The following screenshot shows the output from the simulated device application and highlights how it sends a reported property update to your hub:

シミュレートされたデバイス

次のスクリーンショットは、バックエンド アプリケーションからの出力を示します。デバイスからレポートされたプロパティの更新を受信し、処理する方法が強調表示されています。The following screenshot shows the output from the back-end application and highlights how it receives and processes a reported property update from a device:

バックエンド アプリケーション

リソースをクリーンアップするClean up resources

次のチュートリアルを実行する場合は、リソース グループと IoT ハブをそのままにしておき、後で再利用します。If you plan to complete the next tutorial, leave the resource group and IoT hub and reuse them later.

IoT ハブが必要でなくなった場合は、ポータルを使用して IoT ハブとリソース グループを削除します。If you don't need the IoT hub any longer, delete it and the resource group in the portal. これを行うには、IoT ハブを含む tutorial-iot-hub-rg リソース グループを選択し、 [削除] をクリックします。To do so, select the tutorial-iot-hub-rg resource group that contains your IoT hub and click Delete.

または、次の CLI を使用します。Alternatively, use the CLI:

# Delete your resource group and its contents
az group delete --name tutorial-iot-hub-rg

次のステップNext steps

このチュートリアルでは、デバイスと IoT ハブ間の状態情報を同期する方法について説明しました。In this tutorial, you learned how to synchronize state information between your devices and your IoT hub. デバイス ツインを使用してファームウェアの更新プロセスを実装する方法については、次のチュートリアルに進んでください。Advance to the next tutorial to learn how to use device twins to implement a firmware update process.