ジョブのスケジュールとブロードキャスト (Azure CLI)

Azure IoT Hub を使用して、数百万のデバイスを更新するジョブのスケジュールと追跡を行います。 ジョブを使用して、次の操作を行います。

  • 必要なプロパティを更新する
  • タグを更新する
  • ダイレクト メソッドを呼び出す

概念的には、ジョブはこれらのアクションのいずれかをラップし、一連のデバイスに対して実行の進行状況を追跡します。 ジョブが対話するデバイスのセットは、デバイス ツイン クエリによって定義されます。 たとえば、バックエンド アプリでは、ジョブを使用して、10,000 台のデバイスに対して reboot メソッドを呼び出すことができます。これは、デバイス ツイン クエリで指定され、将来の時刻にスケジュールされます。 次に、このアプリケーションを使って、これらの各デバイスが reboot メソッドを受信し実行する進行状況を追跡できます。

これらの各機能について詳しくは、次の記事をご覧ください。

Note

この記事で説明されている機能は、Standard レベルの IoT Hub でのみ使用できます。 Basic および Standard または Free レベルの IoT Hub の詳細については、ソリューションに適した IoT Hub のレベルの選択に関するページを参照してください。

この記事では、次の 2 つの Azure CLI セッションを作成する方法について説明します。

  • シミュレートされたデバイスを作成するセッション。 シミュレートされたデバイスは、ダイレクト メソッドが呼び出されたときに状態コードと JSON ペイロードを返すように構成されます。

  • 2 つのスケジュールされたジョブを作成するセッション。 最初のジョブが、ダイレクト メソッドを呼び出し、2 番目のジョブが、(もう一方のセッションで作成された) シミュレートされたデバイスで目的のデバイス ツイン プロパティを更新します。

前提条件

  • Azure CLI。 この記事のコマンドは、ブラウザーまたは (Windows Terminal などの) アプリで実行されるインタラクティブ CLI シェルである Azure Cloud Shell を使用して実行することもできます。 Cloud Shell を使用する場合は、何もインストールする必要はありません。 CLI をローカルで使用する場合、この記事では、Azure CLI バージョン 2.36 以降が必要です。 バージョンを確認するには、az --version を実行します。 Azure CLI をローカルにインストールまたはアップグレードするには、Azure CLI のインストールに関する記事を参照してください。

  • Azure サブスクリプション内の IoT ハブ。 CLI または Azure portal を使って作成します。

  • ポート 8883 がファイアウォールで開放されていることを確認してください。 この記事のデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。 この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。

Cloud Shell を準備する

Azure Cloud Shell を使用する場合は、まずそれを起動して構成する必要があります。 CLI をローカルで使用する場合は、「2 つの CLI セッションを準備する」のセクションに進んでください。

  1. Azure portal のページ ヘッダーから Cloud Shell アイコンを選択します。

    Azure portal のページ ヘッダーのグローバル コントロールのスクリーンショット。Cloud Shell アイコンが強調表示されています。

    注意

    Cloud Shell を初めて使用する場合は、Cloud Shell を使用するために必要なストレージを作成するように求められます。 ストレージ アカウントと Microsoft Azure ファイル共有を作成するためのサブスクリプションを選択します。

  2. Cloud Shell ツール バーの環境セレクターを使用して、希望する CLI 環境を選択します。 この記事では、Bash 環境を使用します。 PowerShell 環境を使うこともできます。

    注意

    一部のコマンドは、Bash および PowerShell 環境では異なる構文または書式が必要です。 詳細については、「Azure CLI を正しく使用するためのヒント」を参照してください。

    Azure Cloud Shell ウィンドウのスクリーンショット。ツール バーの環境セレクターが強調表示されています。

2 つの CLI セッションを準備する

次に、2 つの Azure CLI セッションを準備する必要があります。 Cloud Shell を使用している場合は、これらのセッションを別々の Cloud Shell タブで実行します。 ローカル CLI クライアントを使用している場合は、別々の CLI インスタンスを実行します。 次のタスクには、別々の CLI セッションを使用します。

  • 最初のセッションでは、IoT ハブと通信する IoT デバイスをシミュレートします。
  • 2 番目のセッションでは、IoT ハブで、シミュレートされたデバイスのジョブをスケジュールします。

注意

Azure CLI を使用するには、Azure アカウントにログインする必要があります。 Cloud Shell を使用している場合は、Azure アカウントに自動的にログインします。 ローカル CLI クライアントを使用している場合は、各 CLI セッションにログインする必要があります。 Azure CLI シェル セッションと IoT hub の間のすべての通信は認証および暗号化されます。 そのため、この記事では、接続文字列などの実際のデバイスで使用する追加の認証は必要ありません。 Azure CLI を使用したログインについて詳しくは、「Azure CLI を使用してサインインする」をご覧ください。

  1. 最初の CLI セッションで、 az extension add コマンドを実行します。 このコマンドにより、Azure CLI 用の Microsoft Azure IoT 拡張機能が CLI シェルにインストールされます。 この拡張機能により、IoT Hub、IoT Edge、IoT Device Provisioning Service (DPS) 固有のコマンドが Azure CLI に追加されます。 この拡張機能をインストールした後は、Cloud Shell セッションで再度インストールする必要はありません。

    az extension add --name azure-iot
    

    注意

    この記事では、azure-iot と呼ばれる、Azure IoT 拡張機能の最新バージョンを使用します。 従来のバージョンは azure-cli-iot-ext と呼ばれます。一度にインストールできるバージョンは 1 つだけです。 コマンド az extension list を使用すると、現在インストールされている拡張機能を確認できます。

    拡張機能の従来のバージョンを削除するには、az extension remove --name azure-cli-iot-ext を使用します。

    拡張機能の新しいバージョンを追加するには、az extension add --name azure-iot を使用します。

    インストール済みの拡張機能を表示するには、az extension list を使用してください。

  2. 2 つ目の CLI セッションを開きます。 ブラウザーで Cloud Shell を使用している場合は、最初の CLI セッションのツール バーにある [新しいセッションを開く] アイコンを選択します。 CLI をローカルで使用している場合は、2 つ目の CLI インスタンスを開きます。

    Azure Cloud Shell ウィンドウのスクリーンショット。ツール バーの [新しいセッションを開く] アイコンが強調表示されています。

デバイスを作成してシミュレートする

このセクションでは、最初の CLI セッションで IoT ハブのデバイス ID を作成し、そのデバイス ID を使用してデバイスをシミュレートします。 シミュレートされたデバイスは、2 番目の CLI セッションでスケジュールするジョブに応答します。

シミュレートされたデバイスを作成し開始するには以下を行います。

  1. 最初の CLI セッションで、az iot hub device-identity create コマンドを実行し、以下のプレースホルダーを対応する値に置き換えます。 このコマンドは、シミュレートされたデバイスのデバイス ID を作成します。

    {DeviceName}。 シミュレートされたデバイスの名前。

    {HubName}。 IoT Hub の名前です。

    az iot hub device-identity create --device-id {DeviceName} --hub-name {HubName} 
    
  2. 最初の CLI セッションで、az iot device simulate コマンドを実行し、以下のプレースホルダーを対応する値に置き換えます。 このコマンドは、前の手順で作成したデバイスをシミュレートします。 シミュレートされたデバイスは、ダイレクト メソッドが呼び出されるたびに状態コードとペイロードを返すように構成されます。

    {DeviceName}。 シミュレートされたデバイスの名前。

    {HubName}。 IoT Hub の名前です。

    az iot device simulate --device-id {DeviceName} --hub-name {HubName} \
                           --method-response-code 201 \
                           --method-response-payload '{"result":"Direct method successful"}'
    

    ヒント

    az iot device simulate コマンドは、既定では、device-to-cloud メッセージを 3 秒のメッセージ間隔で 100 件送信します。 シミュレーションは、すべてのメッセージが送信されると終了します。 シミュレーションの実行時間を長くする場合は、--msg-count パラメーターを使用して、指定するメッセージ数を増やすか、--msg-interval パラメーターを使用して、より長いメッセージ間隔を指定できます。 コマンドをもう一度実行して、シミュレートされたデバイスを再起動することもできます。

ダイレクト メソッドを呼び出すようにジョブをスケジュールする

このセクションでは、2 番目の CLI セッションでジョブをスケジュールして、最初の CLI セッションで実行されているシミュレートされたデバイスでダイレクト メソッドを呼び出します。

  1. 最初の CLI セッションでシミュレートされたデバイスが実行されていることを確認します。 そうでない場合は、「デバイスを作成してシミュレートする」に記載されている az iot device simulate コマンドをもう一度実行して再起動します。

  2. 2 番目の CLI セッションで、az iot hub job create コマンドを実行し、以下のプレースホルダーを対応する値に置き換えます。 この例では、デバイスの既存のメソッドはありません。 このコマンドは、シミュレートされたデバイスでメソッド名の例を呼び出すジョブをスケジュールし、メソッドのペイロードに null 値を指定します。 このメソッドにより、状態コードとペイロードが応答で提供されます。

    {HubName}。 IoT Hub の名前です。

    {JobName}。 スケジュールされたジョブの名前。 ジョブ名は一意であるため、このコマンドを実行するたびに異なるジョブ名を選択します。

    {MethodName}。 ダイレクト メソッドの名前。 シミュレートされたデバイスには既存のメソッドがないため、このコマンド用に任意の名前を選択できます。

    {DeviceName}。 シミュレートされたデバイスの名前。

    az iot hub job create --hub-name {HubName} --job-id {JobName} \
                          --job-type scheduleDeviceMethod \
                          --method-name {MethodName} --method-payload 'null' \
                          --query-condition "deviceId = '{DeviceName}'"
    

    ヒント

    ダイレクト メソッドを呼び出すジョブ az iot hub job create コマンドをスケジュールする場合、省略可能なパラメーターである --method-name--method-payload の両方の値を指定する必要があります。 ペイロードを受け入れないダイレクト メソッドの場合、--method-payload パラメーターに null を指定します。

  3. 最初の CLI セッションで、出力にメソッド呼び出しが表示されていることを確認します。 次のスクリーンショットでは、以前の手順の az iot hub job create CLI コマンドで、{DeviceName}{MethodName} のプレースホルダーにそれぞれ SampleDeviceSampleMethod を使用しました。

    メソッドが呼び出された後に出力が表示されている、シミュレートされたデバイスのスクリーンショット。

デバイス ツインのプロパティを更新するようにジョブをスケジュールする

このセクションでは、2 番目の CLI セッションでジョブをスケジュールして、最初の CLI セッションで実行されているシミュレートされたデバイスで目的のデバイス ツイン プロパティを更新します。

  1. 最初の CLI セッションでシミュレートされたデバイスが実行されていることを確認します。 そうでない場合は、「デバイスを作成してシミュレートする」に記載されている az iot device simulate コマンドをもう一度実行して再起動します。

  2. 2 番目の CLI セッションで、az iot hub job create コマンドを実行し、以下のプレースホルダーを対応する値に置き換えます。 この例では、シミュレートされたデバイスで目的のツイン プロパティ BuildingNo の値を 45 に設定するジョブをスケジュールしています。

    {HubName}。 IoT Hub の名前です。

    {JobName}。 スケジュールされたジョブの名前。 ジョブ名は一意であるため、このコマンドを実行するたびに異なるジョブ名を選択します。

    {DeviceName}。 シミュレートされたデバイスの名前。

    az iot hub job create --hub-name {HubName} --job-id {JobName} \
                          --job-type scheduleUpdateTwin \
                          --twin-patch '{"properties":{"desired": {"BuildingNo": 45}}}' \
                          --query-condition "deviceId = '{DeviceName}'"
    
  3. 最初の CLI セッションで、レポートされたデバイス ツイン プロパティの正常な更新が出力に示されており、目的のデバイス ツイン プロパティも更新されたことが示されていることを確認します。

    デバイス ツイン プロパティ が更新された後の出力が表示されている、シミュレートされたデバイスのスクリーンショット。

次のステップ

この記事では、Azure CLI を使用してデバイスをシミュレートし、ジョブをスケジュールして、ダイレクト メソッドを実行し、そのシミュレートされたデバイスのデバイス ツインのプロパティを更新しました。

IoT ハブとデバイス管理パターンの調査を続けるには、「Raspberry Pi 3 B+ 参照イメージを使用した Device Update for Azure IoT Hub のチュートリアル」でイメージを更新してください。