チュートリアル:デバイス ファームウェアの更新プロセスを実装するTutorial: Implement a device firmware update process

場合によっては、IoT ハブに接続されているデバイスのファームウェアを更新する必要があります。You may need to update the firmware on the devices connected to your IoT hub. たとえば、ファームウェアに新しい機能を追加したり、セキュリティ パッチを適用したりできます。For example, you might want to add new features to the firmware or apply security patches. 多くの IoT シナリオでは、対象のデバイスに物理的にアクセスして、手動でファームウェア更新を適用することは現実的ではありません。In many IoT scenarios, it's impractical to physically visit and then manually apply firmware updates to your devices. このチュートリアルでは、ハブに接続されたバックエンド アプリケーションを介してファームウェアの更新プロセスをリモートで開始および監視する方法を示します。This tutorial shows how you can start and monitor the firmware update process remotely through a back-end application connected to your hub.

このチュートリアルのバックエンド アプリケーションでは、ファームウェアの更新プロセスを作成および監視するために、IoT ハブに "構成" を作成します。To create and monitor the firmware update process, the back-end application in this tutorial creates a configuration in your IoT hub. IoT Hub の自動デバイス管理では、この構成を使用して、すべての冷却装置上の "デバイス ツインの必要なプロパティ" のセットを更新します。IoT Hub automatic device management uses this configuration to update a set of device twin desired properties on all your chiller devices. 必要なプロパティは、必要なファームウェアの更新の詳細を指定します。The desired properties specify the details of the firmware update that's required. 冷却装置でファームウェアの更新プロセスが実行されている間、"デバイス ツインの報告されたプロパティ" を使用して、バックエンド アプリケーションに状態が報告されます。While the chiller devices are running the firmware update process, they report their status to the back-end application using device twin reported properties. バックエンド アプリケーションは、この構成を使用して、デバイスから送信された報告されたプロパティを監視し、ファームウェアの更新プロセスを完了まで追跡できます。The back-end application can use the configuration to monitor the reported properties sent from the device and track the firmware update process to completion:

ファームウェアの更新プロセス

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

  • IoT ハブを作成し、テスト デバイスをデバイス ID レジストリに追加する。Create an IoT hub and add a test device to the device identity registry.
  • ファームウェアの更新を定義する構成を作成する。Create a configuration to define the firmware update.
  • デバイスでのファームウェアの更新プロセスをシミュレートする。Simulate the firmware update process on a device.
  • ファームウェアの更新の進行状況に応じてデバイスから状態の更新を受信する。Receive status updates from the device as the firmware update progresses.

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 have 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 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 application 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

このチュートリアルでは、MyFirmwareUpdateDevice というシミュレートされたデバイスを使用します。This tutorial uses a simulated device called MyFirmwareUpdateDevice. 次のスクリプトを実行すると、このデバイスがデバイス ID レジストリに追加され、タグ値が設定され、接続文字列が取得されます。The following script adds this device to your device identity registry, sets a tag value, 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 MyFirmwareUpdateDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg

# Add a device type tag
az iot hub device-twin update --device-id MyFirmwareUpdateDevice --hub-name $hubname --set tags='{"devicetype":"chiller"}'

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

ヒント

これらのコマンドを Windows コマンド プロンプトまたは PowerShell プロンプトで実行する場合は、JSON 文字列を引用符で囲む方法について、azure-iot-cli-extension のヒントに関するページを参照してください。If you run these commands at a Windows command prompt or Powershell prompt, see the azure-iot-cli-extension tips page for information about how to quote JSON strings.

ファームウェアの更新を開始するStart the firmware update

devicetype として "chiller" のタグが付けられたすべてのデバイスでファームウェア更新プロセスを開始するには、バックエンド アプリケーションで自動デバイス管理構成を作成します。You create an automatic device management configuration in the back-end application to begin the firmware update process on all devices tagged with a devicetype of chiller. このセクションでは、次の方法について説明します。In this section, you see how to:

  • バックエンド アプリケーションから構成を作成する。Create a configuration from a back-end application.
  • 完了するまでジョブを監視する。Monitor the job to completion.

必要なプロパティを使用して、バックエンド アプリケーションからファームウェアのアップグレードを開始するUse desired properties to start the firmware upgrade from the back-end application

構成を作成するバックエンド アプリケーション コードを表示するには、ダウンロードしたサンプル Node.js プロジェクトの iot-hub/Tutorials/FirmwareUpdate フォルダーに移動します。To view the back-end application code that creates the configuration, navigate to the iot-hub/Tutorials/FirmwareUpdate folder in the sample Node.js project you downloaded. 次に、テキスト エディターで ServiceClient.js ファイルを開きます。Then open the ServiceClient.js file in a text editor.

バックエンド アプリケーションでは、次の構成を作成します。The back-end application creates the following configuration:

var firmwareConfig = {
  id: sampleConfigId,
  content: {
    deviceContent: {
      'properties.desired.firmware': {
        fwVersion: fwVersion,
        fwPackageURI: fwPackageURI,
        fwPackageCheckValue: fwPackageCheckValue
      }
    }
  },

  // Maximum of 5 metrics per configuration
  metrics: {
    queries: {
      current: 'SELECT deviceId FROM devices WHERE configurations.[[firmware285]].status=\'Applied\' AND properties.reported.firmware.fwUpdateStatus=\'current\'',
      applying: 'SELECT deviceId FROM devices WHERE configurations.[[firmware285]].status=\'Applied\' AND ( properties.reported.firmware.fwUpdateStatus=\'downloading\' OR properties.reported.firmware.fwUpdateStatus=\'verifying\' OR properties.reported.firmware.fwUpdateStatus=\'applying\')',
      rebooting: 'SELECT deviceId FROM devices WHERE configurations.[[firmware285]].status=\'Applied\' AND properties.reported.firmware.fwUpdateStatus=\'rebooting\'',
      error: 'SELECT deviceId FROM devices WHERE configurations.[[firmware285]].status=\'Applied\' AND properties.reported.firmware.fwUpdateStatus=\'error\'',
      rolledback: 'SELECT deviceId FROM devices WHERE configurations.[[firmware285]].status=\'Applied\' AND properties.reported.firmware.fwUpdateStatus=\'rolledback\''
    }
  },

  // Specify the devices the firmware update applies to
  targetCondition: 'tags.devicetype = \'chiller\'',
  priority: 20
};

構成には、次のセクションが含まれます。The configuration includes the following sections:

  • content: 選択したデバイスに送信されるファームウェアの必要なプロパティを指定します。content specifies the firmware desired properties sent to the selected devices.
  • metrics: ファームウェア更新の状態を報告するために実行するクエリを指定します。metrics specifies the queries to run that report the status of the firmware update.
  • targetCondition: ファームウェアの更新プログラムを受信するデバイスを選択します。targetCondition selects the devices to receive the firmware update.
  • priorty: 他の構成に対するこの構成の相対的な優先度を設定します。priorty sets the relative priority of this configuration to other configurations.

バックエンド アプリケーションは、次のコードを使用して、必要なプロパティを設定するための構成を作成します。The back-end application uses the following code to create the configuration to set the desired properties:

var createConfiguration = function(done) {
  console.log();
  console.log('Add new configuration with id ' + firmwareConfig.id + ' and priority ' + firmwareConfig.priority);

  registry.addConfiguration(firmwareConfig, function(err) {
    if (err) {
      console.log('Add configuration failed: ' + err);
      done();
    } else {
      console.log('Add configuration succeeded');
      done();
    }
  });
};

構成を作成した後、アプリケーションは、ファームウェアの更新を監視します。After it creates the configuration, the application monitors the firmware update:

var monitorConfiguration = function(done) {
  console.log('Monitor metrics for configuration: ' + sampleConfigId);
  setInterval(function(){
    registry.getConfiguration(sampleConfigId, function(err, config) {
      if (err) {
        console.log('getConfiguration failed: ' + err);
      } else {
        console.log('System metrics:');
        console.log(JSON.stringify(config.systemMetrics.results, null, '  '));
        console.log('Custom metrics:');
        console.log(JSON.stringify(config.metrics.results, null, '  '));
      }
    });
  }, 20000);
  done();
};

構成では、次の 2 種類のメトリックが報告されます。A configuration reports two types of metrics:

  • ターゲットとするデバイスの数と更新プログラムが適用されたデバイスの数を報告するシステム メトリック。System metrics that report how many devices are targeted and how many devices have the update applied.
  • 構成に追加したクエリによって生成されたカスタム メトリック。Custom metrics generated by the queries you add to the configuration. このチュートリアルのクエリでは、更新プロセスの各段階にあるデバイスの数を報告します。In this tutorial, the queries report how many devices are at each stage of the update process.

デバイス上のファームウェア アップグレード要求に応答するRespond to the firmware upgrade request on the device

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

シミュレートされたデバイス アプリケーションは、デバイス ツインの properties.desired.firmware の必要なプロパティに対する更新のためのハンドラーを作成します。The simulated device application creates a handler for updates to the properties.desired.firmware desired properties in the device twin. ハンドラーでは、更新プロセスを開始する前に、必要なプロパティに対していくつかの基本的なチェックを実行します。In the handler, it carries out some basic checks on the desired properties before launching the update process:

// Handle firmware desired property updates - this triggers the firmware update flow
twin.on('properties.desired.firmware', function(fwUpdateDesiredProperties) {
  console.log(chalk.green('\nCurrent firmware version: ' + twin.properties.reported.firmware.currentFwVersion));
  console.log(chalk.green('Starting firmware update flow using this data:'));
  console.log(JSON.stringify(fwUpdateDesiredProperties, null, 2));
  desiredFirmwareProperties = twin.properties.desired.firmware;

  if (fwUpdateDesiredProperties.fwVersion == twin.properties.reported.firmware.currentFwVersion) {
    sendStatusUpdate('current', 'Firmware already up to date', function (err) {
      if (err) {
        console.error(chalk.red('Error occured sending status update : ' + err.message));
      }
      return;
    });
  }
  if (fwUpdateInProgress) {
    sendStatusUpdate('current', 'Firmware update already running', function (err) {
      if (err) {
        console.error(chalk.red('Error occured sending status update : ' + err.message));
      }
      return;
    });
  }
  if (!fwUpdateDesiredProperties.fwPackageURI.startsWith('https')) {
    sendStatusUpdate('error', 'Insecure package URI', function (err) {
      if (err) {
        console.error(chalk.red('Error occured sending status update : ' + err.message));
      }
      return;
    });
  }

  fwUpdateInProgress = true;

  sendStartingUpdate(fwUpdateDesiredProperties.fwVersion, function (err) {
    if (err) {
      console.error(chalk.red('Error occured sending starting update : ' + err.message));
    }
    return;
  });
  initiateFirmwareUpdateFlow(function(err, result) {
    fwUpdateInProgress = false;
    if (!err) {
      console.log(chalk.green('Completed firmwareUpdate flow. New version: ' + result));
      sendFinishedUpdate(result, function (err) {
        if (err) {
          console.error(chalk.red('Error occured sending finished update : ' + err.message));
        }
        return;
      });
    }
  }, twin.properties.reported.firmware.currentFwVersion);
});

ファームウェアを更新するUpdate the firmware

更新を実行するのは initiateFirmwareUpdateFlow 関数です。The initiateFirmwareUpdateFlow function runs the update. この関数は、waterfall 関数を使用して、更新プロセスの各フェーズを順番に実行します。This function uses the waterfall function to run the phases of the update process in sequence. この例では、ファームウェアの更新には 4 つのフェーズがあります。In this example, the firmware update has four phases. 最初のフェーズでイメージをダウンロードし、2 番目のフェーズでチェックサムを使用してイメージを検証します。3 番目のフェーズでイメージを適用し、最後のフェーズでデバイスを再起動します。The first phase downloads the image, the second phase verifies the image using a checksum, the third phase applies the image, and the last phase reboots the device:

// Implementation of firmwareUpdate flow
function initiateFirmwareUpdateFlow(callback, currentVersion) {

  async.waterfall([
    downloadImage,
    verifyImage,
    applyImage,
    reboot
  ], function(err, result) {
    if (err) {
      console.error(chalk.red('Error occured firmwareUpdate flow : ' + err.message));
      sendStatusUpdate('error', err.message, function (err) {
        if (err) {
          console.error(chalk.red('Error occured sending status update : ' + err.message));
        }
      });
      setTimeout(function() {
        console.log('Simulate rolling back update due to error');
        sendStatusUpdate('rolledback', 'Rolled back to: ' + currentVersion, function (err) {
          if (err) {
            console.error(chalk.red('Error occured sending status update : ' + err.message));
          }
        });
        callback(err, result);
      }, 5000);
    } else {
      callback(null, result);
    }
  });
}

更新プロセス中、シミュレートされたデバイスは、報告されたプロパティを使用して進捗状況を報告します。During the update process, the simulated device reports on progress using reported properties:

// Firmware update patch
//  currentFwVersion: The firmware version currently running on the device.
//  pendingFwVersion: The next version to update to, should match what's
//                    specified in the desired properties. Blank if there
//                    is no pending update (fwUpdateStatus is 'current').
//  fwUpdateStatus:   Defines the progress of the update so that it can be
//                    categorized from a summary view. One of:
//     - current:     There is no pending firmware update. currentFwVersion should
//                    match fwVersion from desired properties.
//     - downloading: Firmware update image is downloading.
//     - verifying:   Verifying image file checksum and any other validations.
//     - applying:    Update to the new image file is in progress.
//     - rebooting:   Device is rebooting as part of update process.
//     - error:       An error occurred during the update process. Additional details
//                    should be specified in fwUpdateSubstatus.
//     - rolledback:  Update rolled back to the previous version due to an error.
//  fwUpdateSubstatus: Any additional detail for the fwUpdateStatus . May include
//                     reasons for error or rollback states, or download %.
//
// var twinPatchFirmwareUpdate = {
//   firmware: {
//     currentFwVersion: '1.0.0',
//     pendingFwVersion: '',
//     fwUpdateStatus: 'current',
//     fwUpdateSubstatus: '',
//     lastFwUpdateStartTime: '',
//     lastFwUpdateEndTime: ''
//   }
// };

次のスニペットは、ダウンロード フェーズの実装を示しています。The following snippet shows the implementation of the download phase. ダウンロード フェーズでは、シミュレートされたデバイスは、報告されたプロパティを使用して、状態情報をバックエンド アプリケーションに送信します。During the download phase, the simulated device uses reported properties to send status information to the back-end application:

// Simulate downloading an image
function downloadImage(callback) {
  console.log('Simulating image download from: ' + desiredFirmwareProperties.fwPackageURI);

  async.waterfall([
    function(callback) {
      sendStatusUpdate('downloading', 'Start downloading', function (err) {
        if (err) {
          console.error(chalk.red('Error occured sending status update : ' + err.message));
        }
      });
      callback(null);
    },
    function(callback) {
      // Simulate a delay downloading the image.
      setTimeout(function() {
        // Simulate some firmware image data
        var imageData = '[Fake firmware image data]';
        callback(null, imageData); 
      }, 30000);
    },
    function(imageData, callback) {
      console.log('Downloaded image data: ' + imageData);
      sendStatusUpdate('downloading', 'Finished downloading', function (err) {
        if (err) {
          console.error(chalk.red('Error occured sending status update : ' + err.message));
        }
      });
      callback(null, imageData);
    }
  ], function (err, result) {
    callback(err, result);
  });
}

サンプルを実行するRun the sample

このセクションでは、2 つのサンプル アプリケーションを実行して、バックエンド アプリケーションがシミュレートされたデバイス上のファームウェア更新プロセスを管理するための構成を作成する操作を監視します。In this section, you run two sample applications to observe as a back-end application creates the configuration to manage the firmware update process on the simulated 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/FirmwareUpdate フォルダーに移動します。To run the simulated device application, open a shell or command prompt window and navigate to the iot-hub/Tutorials/FirmwareUpdate 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/FirmwareUpdate フォルダーに移動します。Then navigate to the iot-hub/Tutorials/FirmwareUpdate 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 shows how it responds to the firmware desired properties update from the back-end application:

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

次のスクリーンショットは、バックエンド アプリケーションからの出力を示しています。ファームウェアの必要なプロパティを更新するための構成を作成する方法が強調表示されています。The following screenshot shows the output from the back-end application and highlights how it creates the configuration to update the firmware desired properties:

バックエンド アプリケーションからの出力を示すスクリーンショット。

次のスクリーンショットは、バックエンド アプリケーションからの出力を示しています。シミュレートされたデバイスからのファームウェア更新メトリックを監視する方法が強調表示されています。The following screenshot shows the output from the back-end application and highlights how it monitors the firmware update metrics from the simulated device:

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

デバイスの自動構成は、作成時に実行された後は 5 分ごとに実行されるため、バックエンド アプリケーションに送信されるすべての状態更新を確認できるわけではありません。Because automatic device configurations run at creation time and then every five minutes, you may not see every status update sent to the back-end application. ポータルの IoT ハブの [Automatic device management](自動デバイス管理) -> [IoT device configuration](IoT デバイス構成) セクションでメトリックを表示することもできます。You can also view the metrics in the portal in the Automatic device management -> IoT device configuration section of your IoT hub:

ポータルで構成を表示する

リソースをクリーンアップする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

このチュートリアルでは、接続されたデバイスのファームウェア更新プロセスを実装する方法を学習しました。In this tutorial, you learned how to implement a firmware update process for your connected devices. Azure IoT Hub ポータル ツールと Azure CLI コマンドを使用してデバイス接続をテストする方法については、次のチュートリアルに進んでください。Advance to the next tutorial to learn how to use Azure IoT Hub portal tools and Azure CLI commands to test device connectivity.