チュートリアル: 対称キー登録グループを使用したデバイスのプロビジョニング
このチュートリアルでは、登録グループを使用して、複数のシミュレートされた対称キー デバイスを 1 つの IoT Hub に安全にプロビジョニングする方法について説明します。
Azure IoT Hub Device Provisioning Service では、デバイスのプロビジョニングについて 2 種類の登録をサポートしています。
- 登録グループ:複数の関連するデバイスを登録するために使用します。 このチュートリアルでは、登録グループを使用したプロビジョニングについて説明します。
- 個別登録: 単一デバイスを登録するために使用します。
Azure IoT Hub Device Provisioning Service では、デバイスをプロビジョニングするための 3 つの形式の認証がサポートされています。
- X.509 証明書
- トラステッド プラットフォーム モジュール (TPM)
- 対称キー - このチュートリアルでは、対称キー構成証明について説明します
一部のデバイスには、デバイスを安全に識別するために使用できる証明書、TPM、またはその他のセキュリティ機能がない場合があります。 このようなデバイスの場合、Azure IoT Hub Device Provisioning Service (DPS) には対称キーの構成証明が含まれます。 対称キーの構成証明は、MAC アドレスやシリアル番号などの固有の情報に基づいてデバイスを識別するために使用できます。
このチュートリアルの目標は次のとおりです。
- 各デバイスの一意の登録 ID を定義します。
- 対称キー構成証明を使用する登録グループを作成します。
- 一意の登録 ID と共有登録グループ キーを使用して、各デバイスのデバイス キーを生成します。
- Azure IoT デバイス SDK のデバイス キーとサンプル コードを使用してデバイスをプロビジョニングします。
このチュートリアルは、Windows ベースのワークステーション向けです。 ただし、Linux でもこの手順を実行できます。 Linux の例については、「チュートリアル: geo 待機時間のためのプロビジョニング」を参照してください。
Note
「クイック スタート: シミュレートされた対称キー デバイスをプロビジョニングする」をすでに完了し、Azure リソースと開発環境を設定したままにしている場合は、このチュートリアルの「対称キー登録グループの作成」に進むことができます。
前提条件
Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
Azure portal での IoT Hub Device Provisioning Service の設定に関するページの手順を完了します。
Windows 開発環境を使用する場合は、"C++ によるデスクトップ開発" のワークロードが有効になっている Visual Studio 2022 をインストールします。 Visual Studio 2019、Visual Studio 2017、および Visual Studio 2015 もサポートされています。 Linux または macOS については、SDK ドキュメントの「開発環境を準備する」の該当するセクションを参照してください。
最新の CMake ビルド システムをインストールします。 CMake 実行可能ファイルをパスに追加するオプションを必ずオンにします。
重要
CMake
のインストールを開始する前に、Visual Studio の前提条件 (Visual Studio と "C++ によるデスクトップ開発" ワークロード) がコンピューターにインストールされていることを確認します。 前提条件を満たし、ダウンロードを検証したら、CMake ビルド システムをインストールします。 また、以前のバージョンの CMake ビルド システムでは、この記事で使用されているソリューション ファイルを生成できないことに注意してください。 必ず最新バージョンの CMake を使用してください。
Windows ベースのコンピューターに .NET SDK 6.0 以降をインストールします。 次のコマンドを使用してバージョンを確認してください。
dotnet --info
- Node.js v4.0 以降をインストールします。
- Windows ベースのコンピューターに Python 3.7 以降をインストールします。
python --version
を実行して、使用している Python のバージョンを確認できます。
コンピューターに Java SE Development Kit 8 以降をインストールします。
Maven をダウンロードし、インストールします。
- 最新バージョンの Git をインストールします。 コマンド ウィンドウからアクセスできる環境変数に Git が追加されていることを確認します。 Git Bash (ローカル Git リポジトリとやりとりする際に使用できるコマンドライン アプリ) を含む、インストールする
git
ツールの最新バージョンについては、Software Freedom Conservancy の Git クライアント ツールに関するページを参照してください。
開発環境を準備する
このセクションでは、C 用 Azure IoT Device SDK を構築するための開発環境を準備します。サンプル コードは、デバイスのブート シーケンス中にデバイスをプロビジョニングします。
Web ブラウザーで、Azure IoT C SDK のリリース ページに移動します。
最新リリースの Azure IoT C SDK のタグ名をコピーします (例:
lts_03_2024
)。Windows コマンド プロンプトを開いて、次のコマンドを実行して、最新リリースの C 用 Azure IoT Device SDK の GitHub リポジトリを複製します。
<release-tag>
を前のステップでコピーしたタグで置き換えます。git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --init
この操作が完了するまで数分かかる場合があります。
操作が完了したら、
azure-iot-sdk-c
ディレクトリから次のコマンドを実行します。mkdir cmake cd cmake
このコード サンプルでは、対称キーを使用して構成証明を指定します。 次のコマンドを実行して、デバイス プロビジョニング クライアントを含む開発クライアント プラットフォームに固有の SDK のバージョンをビルドします。
cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON ..
ヒント
cmake
で C++ コンパイラが見つからない場合は、上記のコマンドの実行中にビルド エラーが発生する可能性があります。 これが発生した場合は、Visual Studio コマンド プロンプトでコマンドを実行してください。ビルドが正常に完了すると、最後のいくつかの出力行は次の出力のようになります。
$ cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON .. -- Building for: Visual Studio 16 2019 -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22621. -- The C compiler identification is MSVC 19.29.30146.0 -- The CXX compiler identification is MSVC 19.29.30146.0 ... -- Configuring done -- Generating done -- Build files have been written to: C:/azure-iot-sdk-c/cmake
コマンド プロンプトまたは Git Bash ターミナルを開きます。
次のコマンドを使用して、Azure IoT SDK for C# の GitHub リポジトリをクローンします。
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
コマンド プロンプトまたは Git Bash ターミナルを開きます。
次のコマンドを使用して、Azure IoT SDK for Node.js の GitHub リポジトリをクローンします。
git clone https://github.com/Azure/azure-iot-sdk-node.git --recursive
コマンド プロンプトまたは Git Bash ターミナルを開きます。
次のコマンドを使用して、Python 用 Azure IoT Device SDK の GitHub リポジトリを複製します。
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
注意
このチュートリアルで使用するサンプルは、azure-iot-sdk-python リポジトリの v2 ブランチにあります。 Python SDK の V3 はベータ版で使用できます。 Python SDK の V3 リリースを使用するように V2 コード サンプルを更新する方法については、「Python 用 Azure IoT Device SDK 移行ガイド」を参照してください。
コマンド プロンプトまたは Git Bash ターミナルを開きます。
次のコマンドを使用して、Azure IoT SDK for Java の GitHub リポジトリをクローンします。
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
ルート
azure-iot-sdk-java
ディレクトリに移動し、プロジェクトをビルドして必要なパッケージをすべてダウンロードします。 この手順は、完了するまでに数分かかることがあります。cd azure-iot-sdk-java mvn install -DskipTests=true
対称キーの登録グループを作成する
Azure portal にサインインし、Device Provisioning Service インスタンスに移動します。
ナビゲーション メニューの [設定] セクションから [Manage enrollments] (登録の管理) を選択します。
[登録グループの追加] を選択します。
[登録グループの追加] ページの [Registration + provisioning] (登録とプロビジョニング) タブで、次の情報を入力して登録グループの詳細を構成します。
フィールド 説明 構成証明 [Attestation mechanism] (構成証明メカニズム) として [対称キー] を選択します。 Symmetric key settings (対称キーの設定) ランダムに生成されたキーを使用する場合は、[Generate symmetric keys automatically] (対称キーを自動的に生成) ボックスをオンにします。 独自のキーを指定する場合は、このボックスをオフにします。 グループ名 デバイスのグループの名前を指定します。 登録グループ名は、英数字と特殊文字 ( '-'
、'.'
、'_'
、':'
) から成る、大文字と小文字が区別されない文字列です (最大 128 文字)。 最後の文字は、英数字またはダッシュ ('-'
) である必要があります。プロビジョニングの状態 この登録グループをデバイスのプロビジョニングに使用できるようにする場合は、[Enable this enrollment] (この登録を有効にする) ボックスをオンにします。 グループを無効にする場合は、このボックスをオフにします。 この設定は後で変更できます。 再プロビジョニング ポリシー 再プロビジョニングを要求するデバイスを DPS で処理する方法を反映する再プロビジョニング ポリシーを選択します。 詳細については、「再プロビジョニング ポリシー」を参照してください [Next: IoT hubs] (次へ: IoT ハブ) を選択します。
[登録グループの追加] ページの [IoT ハブ] タブで、次の情報を入力して、登録グループでデバイスをプロビジョニングできる IoT ハブを決定します。
フィールド 説明 Target IoT hubs (ターゲット IoT ハブ) 1 つ以上のリンクされた IoT ハブを選択するか、IoT ハブへの新しいリンクを追加します。 IoT ハブを DPS インスタンスにリンクする方法の詳細については、IoT ハブをリンクして管理する方法に関するページを参照してください。 割り当てポリシー 複数のリンクされた IoT ハブを選択した場合は、デバイスを別のハブに割り当てる方法を選択します。 割り当てポリシーの詳細については、割り当てポリシーの使用方法に関するページを参照してください。
リンクされた IoT ハブを 1 つだけ選択した場合は、[加重が均等に分布] ポリシーを使用することをお勧めします。[Next: Device settings] (次へ: デバイスの設定) を選択します
[登録グループの追加] ページの [Device settings] (デバイスの設定) タブで、次の情報を入力して、新しくプロビジョニングされたデバイスの構成方法を定義します。
フィールド 説明 IoT Edge このグループを使用してプロビジョニングされたすべてのデバイスで Azure IoT Edge が実行される場合は、[プロビジョニングされたデバイスで IoT Edge を有効にする] をオンにします。 このグループが IoT Edge 非対応デバイス用だけの場合は、このボックスをオフにします。 グループ内のすべてのデバイスが IoT Edge 対応か、すべてが非対応かのどちらかになります。 デバイス タグ このテキスト ボックスを使用して、プロビジョニングされたデバイスのデバイス ツインに適用するタグを指定します。 Desired properties (必要なプロパティ) このテキスト ボックスを使用して、プロビジョニングされたデバイスのデバイス ツインに適用する必要なプロパティを指定します。 詳細については、「IoT Hub のデバイス ツインの理解と使用」を参照してください。
確認と作成 をクリックします。
[確認 + 作成] タブで、すべての値を確認してから [作成] を選択します。
登録グループを作成すると、DPS で主キーとセカンダリ キーが生成され、登録エントリに追加されます。 対称キーの登録グループが、[登録グループ] タブの [グループ名] 列に表示されます。
登録を開き、主キーの値をコピーします。 このキーはグループ キーです。
デバイスの一意の登録 ID を選択する
各デバイスを識別する一意の登録 ID を定義する必要があります。 デバイスの MAC アドレス、シリアル番号、または何らかの固有の情報を使用できます。
この例では、MAC アドレスとシリアル番号の組み合わせを使用して、次のような登録 ID の文字列を形成します。
sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6
デバイスごとに一意の登録 ID を作成します。 登録 ID は、英数字と次の特殊文字 (- . _ :
) から成る、大文字と小文字が区別されない文字列です (最大 128 文字)。 最後の文字は、英数字またはダッシュ (-
) である必要があります。
デバイス キーを派生させる
デバイス キーを生成するには、登録グループの主キーを使用して、各デバイスの登録 ID の HMAC-SHA256 ハッシュを計算します。 結果は、デバイスごとに Base 64 形式に変換されます。
警告
各デバイスのデバイス コードには、そのデバイスの派生デバイス キーのみ含める必要があります。 デバイス コードにはグループの主キーを含めないでください。 グループ キーが盗まれた場合、それで認証されるすべてのデバイスのセキュリティが危険にさらされる可能性があります。
Azure CLI 用の IoT 拡張機能には、派生デバイス キーを生成するための az iot dps enrollment-group compute-device-key コマンドが用意されています。 このコマンドは、Windows ベースと Linux の両方のシステムから使用できます。
--key
パラメーターの値を、登録グループの主キーに置き換えます。
--registration-id
パラメーターの値を登録 ID に置き換えます。
az iot dps enrollment-group compute-device-key --key <group_primary_key> --registration-id <device_registration_id>
結果の例:
"Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc="
各デバイスのプロビジョニング時に、派生デバイス キーと一意の登録 ID を使用して、登録グループで対称キーの構成証明が実行されます。
デバイス プロビジョニング コードを準備して実行する
このセクションでは、デバイスのブート シーケンスを Device Provisioning Service インスタンスに送信するようにデバイス サンプル コードを更新します。 このブート シーケンスを行うと、デバイスが認識され、認証されて、Device Provisioning Service インスタンスにリンクされた IoT ハブに割り当てられます。
サンプル プロビジョニング コードでは、次のタスクを順に実行します。
次の 3 つのパラメーターを使用して、Device Provisioning リソースでデバイスを認証します。
- Device Provisioning Service の ID スコープ
- デバイスの登録 ID。
- デバイスの派生デバイス キー。
Device Provisioning Service インスタンスに既にリンクされている IoT ハブにデバイスを割り当てます。
デバイス情報を使用してプロビジョニング サンプルを更新して実行するには、次のようにします。
Device Provisioning Service のメイン メニューで、 [概要] を選択します。
[ID スコープ] の値をコピーします。
CMake を実行して生成された azure_iot_sdks.sln ソリューション ファイルを Visual Studio で開きます。 ソリューション ファイルは次の場所にあります。
\azure-iot-sdk-c\cmake\azure_iot_sdks.sln
ヒント
cmake ディレクトリにファイルが生成されていない場合は、最新バージョンの CMake ビルド システムを使用していることを確認してください。
Visual Studio の [ソリューション エクスプローラー] ウィンドウで、Provision_Samples フォルダーに移動します。 prov_dev_client_sample という名前のサンプル プロジェクトを展開します。 [ソース ファイル] を展開して、prov_dev_client_sample.c を開きます。
定数
id_scope
を探し、Azure portal からコピーした ID スコープの値で置き換えます。static const char* id_scope = "0ne00002193";
同じファイル内で
main()
関数の定義を探します。 以下に示すようにhsm_type
変数がSECURE_DEVICE_TYPE_SYMMETRIC_KEY
に設定されていることを確認します。SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; //hsm_type = SECURE_DEVICE_TYPE_X509; hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
prov_dev_client_sample.c で、コメントになっている
prov_dev_set_symmetric_key_info()
の呼び出しを探します。// Set the symmetric key if using they auth type //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
関数呼び出しのコメントを解除し、プレースホルダーの値 (山かっこを含む) を、「デバイスの一意の登録 ID を選択する」で選択した登録 ID と、「デバイス キーを派生させる」で生成したデバイス派生キーに置き換えます。
// Set the symmetric key if using they auth type prov_dev_set_symmetric_key_info("sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6", "Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc=");
注意事項
この手順の完了時点では、派生デバイス キーが各デバイスのイメージの一部として含まれたままになることに注意してください。この状況は、推奨されるセキュリティのベスト プラクティスではありません。 これは、セキュリティと使いやすさが両立しないことが多い理由の 1 つです。 独自の要件に基づいて、デバイスのセキュリティを徹底的に確認する必要があります。
ファイルを保存します。
prov_dev_client_sample プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] を選びます。
Visual Studio のメニューで [デバッグ]>[デバッグなしで開始] の順に選択して、ソリューションを実行します。 プロジェクトをリビルドするよう求められたら、 [はい] を選択して、プロジェクトをリビルドしてから実行します。
次の出力は、プロビジョニング サービス インスタンスに正常に接続して IoT ハブに割り当てられているデバイスの例です。
Provisioning API Version: 1.9.1 Registering Device Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Registration Information received from service: contoso-hub-2.azure-devices.net, deviceId: sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 Press enter key to exit:
サンプル プロビジョニング コードでは次のタスクを実行します。
次の 3 つのパラメーターを使用して、Device Provisioning リソースでデバイスを認証します。
- Device Provisioning Service の ID スコープ
- デバイスの登録 ID。
- デバイスの派生デバイス キー。
Device Provisioning Service インスタンスに既にリンクされている IoT ハブにデバイスを割り当てます。
テスト メッセージを IoT ハブに送信します。
デバイス情報を使用してプロビジョニング サンプルを更新して実行するには、次のようにします。
Device Provisioning Service のメイン メニューで、 [概要] を選択します。
[ID スコープ] の値をコピーします。
コマンド プロンプトを開き、クローンした SDK リポジトリ内の SymmetricKeySample に移動します。
cd .\azure-iot-sdk-csharp\provisioning\device\samples\how to guides\SymmetricKeySample
SymmetricKeySample フォルダーの Parameters.cs をテキスト エディターで開きます。 このファイルには、サンプルによって参照されるパラメーターが表示されます。 この記事では、サンプルを実行するときに、最初の 3 つの必須パラメーターのみを使用します。 このファイルのコードを確認します。 変更は不要です。
パラメーター 必須 説明 --i
または--IdScope
○ DPS インスタンスの ID スコープ --r
または--RegistrationId
○ デバイスの登録 ID。 登録 ID は、英数字と特殊文字 ( '-'
、'.'
、'_'
、':'
) から成る、大文字と小文字が区別されない文字列です (最大 128 文字)。 最後の文字は、英数字またはダッシュ ('-'
) である必要があります。--p
または--PrimaryKey
○ 個々の登録の主キーまたはグループ登録の派生デバイス キー。 --g
または--GlobalDeviceEndpoint
× デバイスの接続先となるグローバル エンドポイント。 既定値は global.azure-devices-provisioning.net
です--t
または--TransportType
× デバイス プロビジョニング インスタンスとの通信に使用するトランスポート。 既定値は Mqtt
です。 指定できる値は、Mqtt
、Mqtt_WebSocket_Only
、Mqtt_Tcp_Only
、Amqp
、Amqp_WebSocket_Only
、Amqp_Tcp_only
、およびHttp1
です。SymmetricKeySample フォルダーの ProvisioningDeviceClientSample.cs をテキスト エディターで開きます。 このファイルには、SecurityProviderSymmetricKey クラスと ProvisioningDeviceClient クラスが連動して、シミュレートされた対称キー デバイスをプロビジョニングする方法が示されます。 このファイルのコードを確認します。 変更は不要です。
次のコマンドを使用してサンプル コードをビルドし、実行します。
<id-scope>
を、Azure portal からコピーした ID スコープに置き換えます。<registration-id>
を、「デバイスの一意の登録 ID を選択する」で選択した登録 ID に置き換えます。<primarykey>
を生成した派生デバイス キーに置き換えます。
dotnet run --i <id-scope> --r <registration-id> --p <primarykey>
次のような出力結果が表示されます。 テスト メッセージとして "TestMessage" という文字列がハブに送信されます。
D:\azure-iot-sdk-csharp\provisioning\device\samples\how to guides\SymmetricKeySample>dotnet run --i 0ne00000A0A --r sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 --p sbDDeEzRuEuGKag+kQKV+T1QGakRtHpsERLP0yPjwR93TrpEgEh/Y07CXstfha6dhIPWvdD1nRxK5T0KGKA+nQ== Initializing the device provisioning client... Initialized for registration Id sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6. Registering with the device provisioning service... Registration status: Assigned. Device sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 registered to contoso-hub-2.azure-devices.net. Creating symmetric key authentication for IoT Hub... Testing the provisioned device with IoT Hub... Sending a telemetry message... Finished.
サンプル プロビジョニング コードでは、次のタスクを順に実行します。
次の 4 つのパラメーターを使用して、Device Provisioning リソースでデバイスを認証します。
PROVISIONING_HOST
PROVISIONING_IDSCOPE
PROVISIONING_REGISTRATION_ID
PROVISIONING_SYMMETRIC_KEY
Device Provisioning Service インスタンスに既にリンクされている IoT ハブにデバイスを割り当てます。
テスト テレメトリ メッセージを IoT ハブに送信します。
デバイス情報を使用してプロビジョニング サンプルを更新して実行するには、次のようにします。
Device Provisioning Service のメイン メニューで、 [概要] を選択します。
[ID スコープ] の値をコピーします。
Node.js コマンドを実行するためのコマンド プロンプトを開き、次のディレクトリに移動します。
cd azure-iot-sdk-node\provisioning\device\samples
provisioning/device/samples フォルダーの register_symkey.js を開いて、コードを確認します。
サンプルでは、トランスポート プロトコルとして MQTT が規定値となっています。 別のプロトコルを使用したい場合は、以下の行をコメントアウトし、適切なプロトコルの行をコメント解除してください。
var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
また、サンプル コードでカスタム ペイロードが設定されていることにも注目してください。
provisioningClient.setProvisioningPayload({a: 'b'});
このコードはこのチュートリアルでは必要ないため、コメントアウトしてもかまいません。 カスタム割り当て Webhook を使用してデバイスを IoT Hub に割り当てる際にカスタム ペイロードを使用できます。 詳細については、カスタム割り当てポリシーの使用に関するチュートリアルを参照してください。
provisioningClient.register()
は、デバイスの登録を試行するメソッドです。コマンド プロンプトで、次のコマンドを実行して、サンプルによって使用される環境変数を設定します。
- 最初のコマンドは、
PROVISIONING_HOST
環境変数をグローバル デバイス エンドポイントに設定します。 このエンドポイントは、すべての DPS インスタンスで同じです。 <id-scope>
を、Azure portal からコピーした ID スコープに置き換えます。<registration-id>
を、「デバイスの一意の登録 ID を選択する」で選択した登録 ID に置き換えます。<derived-device-key>
を、「デバイス キーを派生させる」で生成した派生デバイス キーに置き換えます。
set PROVISIONING_HOST=global.azure-devices-provisioning.net
set PROVISIONING_IDSCOPE=<id-scope>
set PROVISIONING_REGISTRATION_ID=<registration-id>
set PROVISIONING_SYMMETRIC_KEY=<derived-device-key>
- 最初のコマンドは、
次のコマンドを使用して、サンプル コードをビルドし、実行します。
npm install
node register_symkey.js
これで次の出力のようになるはずです。 テスト メッセージとして "Hello World" という文字列がハブに送信されます。
registration succeeded assigned hub=contoso-hub-2.azure-devices.net deviceId=sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 payload=undefined Client connected send status: MessageEnqueued
サンプル プロビジョニング コードでは、次のタスクを順に実行します。
次の 4 つのパラメーターを使用して、Device Provisioning リソースでデバイスを認証します。
PROVISIONING_HOST
PROVISIONING_IDSCOPE
PROVISIONING_REGISTRATION_ID
PROVISIONING_SYMMETRIC_KEY
Device Provisioning Service インスタンスに既にリンクされている IoT ハブにデバイスを割り当てます。
テスト メッセージを IoT ハブに送信します。
デバイス情報を使用してプロビジョニング サンプルを更新して実行するには、次のようにします。
Device Provisioning Service のメイン メニューで、 [概要] を選択します。
[ID スコープ] の値をコピーします。
コマンド プロンプトを開き、サンプル ファイルの provision_symmetric_key.py があるディレクトリに移動します。
cd azure-iot-sdk-python\samples\async-hub-scenarios
コマンド プロンプトで、次のコマンドを実行して、サンプルによって使用される環境変数を設定します。
- 最初のコマンドは、
PROVISIONING_HOST
環境変数をグローバル デバイス エンドポイントに設定します。 このエンドポイントは、すべての DPS インスタンスで同じです。 <id-scope>
を、Azure portal からコピーした ID スコープに置き換えます。<registration-id>
を、「デバイスの一意の登録 ID を選択する」で選択した登録 ID に置き換えます。<derived-device-key>
を、「デバイス キーを派生させる」で生成した派生デバイス キーに置き換えます。
set PROVISIONING_HOST=global.azure-devices-provisioning.net
set PROVISIONING_IDSCOPE=<id-scope>
set PROVISIONING_REGISTRATION_ID=<registration-id>
set PROVISIONING_SYMMETRIC_KEY=<derived-device-key>
- 最初のコマンドは、
次のコマンドを実行して、azure-iot-device ライブラリをインストールします。
pip install azure-iot-device
provision_symmetric_key.py の Python サンプル コードを実行します。
python provision_symmetric_key.py
これで次の出力のようになるはずです。 一部の風速テレメトリ メッセージも、テストとしてハブに送信されます。
D:\azure-iot-sdk-python\samples\async-hub-scenarios>python provision_symmetric_key.py The complete registration result is sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 contoso-hub-2.azure-devices.net initialAssignment null Will send telemetry from the provisioned device sending message #1 sending message #2 sending message #3 sending message #4 sending message #5 sending message #6 sending message #7 sending message #8 sending message #9 sending message #10 done sending message #1 done sending message #2 done sending message #3 done sending message #4 done sending message #5 done sending message #6 done sending message #7 done sending message #8 done sending message #9 done sending message #10
サンプル プロビジョニング コードでは、次のタスクを順に実行します。
次の 4 つのパラメーターを使用して、Device Provisioning リソースでデバイスを認証します。
GLOBAL_ENDPOINT
SCOPE_ID
REGISTRATION_ID
SYMMETRIC_KEY
Device Provisioning Service インスタンスに既にリンクされている IoT ハブにデバイスを割り当てます。
テスト メッセージを IoT ハブに送信します。
デバイス情報を使用してプロビジョニング サンプルを更新して実行するには、次のようにします。
Device Provisioning Service のメイン メニューで、 [概要] を選択します。
[ID スコープ] の値をコピーします。
Java デバイス サンプル コードを開いて編集します。 デバイスのサンプル コードの完全パスは次のとおりです。
azure-iot-sdk-java/provisioning/provisioning-samples/provisioning-symmetrickey-individual-sample/src/main/java/samples/com/microsoft/azure/sdk/iot/ProvisioningSymmetricKeyIndividualEnrollmentSample.java
DPS とデバイスの登録に対して、次の変数の値を設定します。
[Your scope ID here]
を、Azure portal からコピーした ID スコープに置き換えます。[Your Provisioning Service Global Endpoint here]
を次のグローバル デバイス エンドポイントに置き換えます: global.azure-devices-provisioning.net。 このエンドポイントは、すべての DPS インスタンスで同じです。[Enter your Symmetric Key here]
を、「デバイス キーを派生させる」で生成した派生デバイス キーに置き換えます。[Enter your Registration ID here]
を、「デバイスの一意の登録 ID を選択する」で選択した登録 ID に置き換えます。
private static final String SCOPE_ID = "[Your scope ID here]"; private static final String GLOBAL_ENDPOINT = "[Your Provisioning Service Global Endpoint here]"; private static final String SYMMETRIC_KEY = "[Enter your Symmetric Key here]"; private static final String REGISTRATION_ID = "[Enter your Registration ID here]";
注意事項
この手順の完了時点では、派生デバイス キーが各デバイスのイメージの一部として含まれたままになることに注意してください。この状況は、推奨されるセキュリティのベスト プラクティスではありません。 これは、セキュリティと使いやすさが両立しないことが多い理由の 1 つです。 独自の要件に基づいて、デバイスのセキュリティを徹底的に確認する必要があります。
ビルドを実行するために、コマンド プロンプトを開きます。 Java SDK リポジトリのプロビジョニング サンプル プロジェクト フォルダーに移動します。
cd azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-symmetrickey-individual-sample
サンプルをビルドします。
mvn clean install
target
フォルダーに移動し、作成した.jar
ファイルを実行します。java
コマンドで、{version}
プレースホルダーをマシンの.jar
ファイル名のバージョンに置き換えます。cd target java -jar ./provisioning-symmetrickey-individual-sample-{version}-with-deps.jar
これで次の出力のようになるはずです。
Starting... Beginning setup. WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance. 2022-10-07 18:14:48,388 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.2 2022-10-07 18:14:48,390 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread... Waiting for Provisioning Service to register 2022-10-07 18:14:48,392 INFO (global.azure-devices-provisioning.net-002edcf5-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service... 2022-10-07 18:14:48,518 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message 2022-10-07 18:14:48,521 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using symmetric key 2022-10-07 18:14:49,252 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device... 2022-10-07 18:14:49,253 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING 2022-10-07 18:14:52,459 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully IotHUb Uri : contoso-hub-2.azure-devices.net Device ID : sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 2022-10-07 18:14:58,424 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true 2022-10-07 18:14:58,436 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true 2022-10-07 18:14:58,440 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.1 2022-10-07 18:14:58,450 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection... 2022-10-07 18:14:58,471 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet... 2022-10-07 18:14:59,314 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged 2022-10-07 18:14:59,315 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6/messages/devicebound/# 2022-10-07 18:14:59,378 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6/messages/devicebound/# was acknowledged 2022-10-07 18:14:59,379 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully 2022-10-07 18:14:59,381 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established 2022-10-07 18:14:59,383 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK 2022-10-07 18:14:59,389 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads 2022-10-07 18:14:59,392 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details 2022-10-07 18:14:59,395 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully 2022-10-07 18:14:59,404 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully Sending message from device to IoT Hub... 2022-10-07 18:14:59,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) Press any key to exit... 2022-10-07 18:14:59,409 DEBUG (contoso-hub-2.azure-devices.net-sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6-c32c76d0-Cxn0e70bbf7-8476-441d-8626-c17250585ee6-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 2022-10-07 18:14:59,777 DEBUG (MQTT Call: sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 2022-10-07 18:14:59,779 DEBUG (contoso-hub-2.azure-devices.net-sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6-c32c76d0-Cxn0e70bbf7-8476-441d-8626-c17250585ee6-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) with status OK Message received! Response status: OK
デバイス プロビジョニングの登録を確認する
このチュートリアルでは、静的構成の割り当てポリシーを使って、登録グループを通じて登録したデバイスを同じ IoT ハブに割り当てました。 しかし、デバイスが複数の IoT ハブのうちのいずれかにプロビジョニングされる可能性がある割り当ての場合、登録グループの登録レコードを調べると、次にように、デバイスがどの IoT ハブにプロビジョニングされたかを確認することができます。
Azure portal で、DPS インスタンスに移動します。
[設定] メニューで [登録の管理] を選択します。
[登録グループ] を選択します。
このチュートリアル用に作成した登録グループを選択します。
[登録グループの詳細] ページで、[登録状態] を選択します。
[デバイス ID] 列のデバイス ID を見つけて、[割り当て済み IoT ハブ] 列の IoT ハブをメモします。
デバイス レコードを選択すると、デバイスに割り当てられた初期ツインなどの詳細を表示できます。
IoT ハブでデバイスを確認するには:
Azure portal で、デバイスが割り当てられた IoT ハブに移動します。
[デバイス管理] メニューで、[デバイス] を選択します。
デバイスが正常にプロビジョニングされた場合は、デバイス ID が一覧に表示され、[状態] が [有効] として設定されているはずです。 デバイスが表示されない場合は、[最新の情報に更新] を選択します。
Note
登録グループの [デバイス ツインの初期状態] を既定値から変更した場合、デバイスはハブから目的のツインの状態をプルし、それに従って動作することができます。 詳細については、「IoT Hub のデバイス ツインの理解と使用」を参照してください。
その他のデバイスをプロビジョニングする
登録グループを使用してさらに多くのデバイスをプロビジョニングするには、前のセクションの手順に従って次の操作を行います。
デバイス キーを派生させます。 前に行ったように、登録グループの主キーをグループ キーとして使用します。
デバイス プロビジョニング コードを実行します。 必要な成果物を、新しい派生デバイス キーと登録 ID に置き換えます。
リソースをクリーンアップする
デバイス クライアント サンプルでの作業と確認を続行する予定の場合は、このチュートリアルで作成したリソースをクリーンアップしないでください。 続行する予定がない場合は、次の手順を使用して、このチュートリアルで作成したすべてのリソースを削除してください。
登録グループを削除する
登録グループを削除しても、関連付けられている登録レコードは削除されません。 これらの孤立したレコードは、DPS インスタンスの登録クォータにカウントされます。 このため、登録グループ自体を削除する前に、登録グループに関連付けられているすべての登録レコードを削除することをお勧めします。
Azure portal で、DPS インスタンスに移動します。
[設定] メニューで [登録の管理] を選択します。
[登録グループ] タブを選択します。
このチュートリアルで使用した登録グループの名前を選択して、その詳細ページを開きます。
[登録の詳細] ページで、[登録状態] を選択します。 次に、[デバイス ID] 列ヘッダーの横にあるチェック ボックスをオンにして、登録グループのすべての登録レコードを選択します。 ページの上部にある [削除] を選択して、登録レコードを削除します。
[Manage enrollments] (登録の管理) ページに戻ります。
このチュートリアルで使用した登録グループの名前の横にあるチェック ボックスをオンにします。
ページの上部で、[削除] を選択します。
IoT Hub からデバイスの登録を削除する
Azure portal で、デバイスが割り当てられた IoT ハブに移動します。
ナビゲーション メニューの [デバイス管理] セクションから [デバイス] を選択します。
このチュートリアルで登録したデバイスのデバイス ID の横にあるチェック ボックスをオンにします。
ページの上部で、[削除] を選択します。
次のステップ
このチュートリアルでは、登録グループを使って複数のデバイスを 1 つの IoT ハブにプロビジョニングしました。 次に、複数のハブ間で IoT デバイスをプロビジョニングする方法について説明します。