教學課程:使用對稱密鑰註冊群組布建裝置

本教學課程說明如何使用註冊群組,將多個模擬對稱密鑰裝置安全地佈建至單一 IoT 中樞。

Azure IoT 中樞 裝置佈建服務支援兩種類型的註冊來布建裝置:

  • 註冊群組:用來註冊多個相關裝置。 本教學課程示範如何使用註冊群組進行布建。
  • 個別註冊:用來註冊單一裝置。

Azure IoT 中樞 裝置佈建服務支援三種形式的驗證來布建裝置:

  • X.509 憑證
  • 信任的平台模組 (TPM)
  • 對稱金鑰 - 本教學課程示範對稱金鑰證明

某些裝置可能沒有憑證、TPM 或任何其他安全性功能,可用來安全地識別裝置。 針對這類裝置,Azure IoT 中樞 裝置佈建服務 (DPS) 包含對稱密鑰證明。 對稱金鑰證明可用來根據 MAC 位址或序號等唯一資訊來識別裝置。

在本教學課程中,您會完成下列目標:

  • 為每個裝置定義唯一的註冊標識碼。
  • 建立使用對稱金鑰證明的註冊群組。
  • 使用其唯一的註冊標識碼和共用註冊群組密鑰,為每個裝置產生裝置密鑰。
  • 使用 Azure IoT 裝置 SDK 中的裝置金鑰和範例程式代碼來佈建裝置。

本教學課程面向以 Windows 為基礎的工作站。 不過,您可以在 Linux 上執行程式。 如需Linux範例,請參閱 教學課程:布建異地延遲

注意

如果您先前已完成 快速入門:布建仿真的對稱密鑰裝置 ,但仍設定您的 Azure 資源和開發環境,您可以繼續 在本教學課程中建立對稱密鑰註冊群組

必要條件

  • 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

  • 使用 Azure 入口網站 完成設定 IoT 中樞 裝置布建服務中的步驟。

  • 如果您使用 Windows 開發環境,請安裝 Visual Studio 2022 並 啟用「使用 C++進行桌面開發」 工作負載。 也支援 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
    
  • 安裝最新版本的 Git。 請確定 Git 已新增至命令視窗可存取的環境變數。 請參閱 Software Freedom Conservancy 的 Git 用戶端工具 ,以取得要安裝之最新版 git 的工具,其中包括 Git Bash,您可以用來與本機 Git 存放庫互動的命令行應用程式。

準備您的開發環境

在本節中,您會準備開發環境來建置適用於 CAzure IoT 裝置 SDK。範例程式代碼會在裝置的開機順序期間佈建裝置。

  1. 在網頁瀏覽器中,移至 Azure IoT C SDK 的 [發行] 頁面。

  2. 複製最新版 Azure IoT C SDK 的標籤名稱,例如: lts_03_2024

  3. 開啟 Windows 命令提示字元並執行下列命令,以複製最新版的 Azure IoT 裝置 SDK for C 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
    

    此作業可能需要幾分鐘的時間才能完成。

  4. 工作完成時,請從 azure-iot-sdk-c 目錄執行下列命令:

    mkdir cmake
    cd cmake
    
  5. 程式代碼範例會使用對稱密鑰來提供證明。 執行下列命令,以建置開發客戶端平台專屬的 SDK 版本,其中包含裝置佈建用戶端:

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    

    提示

    如果 cmake 找不到您的 C++ 編譯程式,您可以在執行上述命令時收到建置錯誤。 如果發生這種情況,請嘗試在 Visual Studio 命令提示字元執行命令。

  6. 當組建順利完成時,最後幾行輸出行看起來會類似下列輸出:

    $ 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
    
  1. 開啟命令提示字元或 Git Bash 終端機。

  2. 使用下列命令複製 適用於 C# 的 Azure IoT SDK GitHub 存放庫:

    git clone https://github.com/Azure/azure-iot-sdk-csharp.git
    
  1. 開啟命令提示字元或 Git Bash 終端機。

  2. 使用下列命令複製適用於 Node.js GitHub 存放庫的 Azure IoT SDK:

    git clone https://github.com/Azure/azure-iot-sdk-node.git --recursive
    
  1. 開啟命令提示字元或 Git Bash 終端機。

  2. 使用下列命令複製適用於 Python 的 Azure IoT 裝置 SDK GitHub 存放庫:

    git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
    

    注意

    本教學課程中使用的範例位於 azure-iot-sdk-python 存放庫的 v2 分支中。 Python SDK 的 V3 可在 Beta 中使用。 如需更新 V2 程式代碼範例以使用 Python SDK V3 版本的相關信息,請參閱 適用於 Python 的 Azure IoT 裝置 SDK 移轉指南

  1. 開啟命令提示字元或 Git Bash 終端機。

  2. 使用下列命令複製 適用於 Java GitHub 的 Azure IoT SDK 存放庫:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  3. 移至根 azure-iot-sdk-java 目錄並建置項目以下載所有必要的套件。 此步驟可能需要幾分鐘的時間才能完成。

    cd azure-iot-sdk-java
    mvn install -DskipTests=true
    

建立對稱金鑰註冊群組

  1. 登入 Azure 入口網站 並流覽至您的裝置布建服務實例。

  2. 導覽功能表的 [設定] 區段中選取 [管理註冊]。

  3. 選取 [ 新增註冊群組]。

  4. 在 [新增註冊群組] 頁面的 [註冊 + 布建] 索引卷標上,提供下列資訊來設定註冊群組詳細數據:

    欄位 描述
    認證 選取 [對稱金鑰 ] 作為 證明機制
    對稱金鑰設定 如果您想要使用隨機產生的金鑰,請核取 [自動產生對稱密鑰] 方塊。 如果您想要提供您自己的金鑰,請取消核取此方塊。
    群組名稱 提供裝置群組的名稱。 註冊組名是英數位元的不區分大小寫字串(最多 128 個字元長),加上特殊字元:'-'、、'.''_'':'。 最後一個字元必須是英數位元或虛線 ('-')。
    布建狀態 如果您想要讓此註冊群組可供布建裝置,請核取 [ 啟用此註冊 ] 方塊。 如果您想要停用群組,請取消核取此方塊。 您可以稍後變更此設定。
    重新布建原則 選擇重新布建原則,以反映您希望 DPS 如何處理要求重新布建的裝置。 如需詳細資訊,請參閱 重新布建原則

    Screenshot that shows adding an enrollment group for symmetric key attestation.

  5. 選取 [ 下一步:IoT 中樞]。

  6. 在 [新增註冊群組] 頁面的 [IoT 中樞] 索引標籤上,提供下列資訊來判斷註冊群組可以布建裝置的 IoT 中樞:

    欄位 描述
    目標IoT中樞 選取一或多個連結的IoT中樞,或將新連結新增至IoT中樞。 若要深入瞭解如何將IoT中樞連結至 DPS 實例,請參閱 如何連結和管理IoT中樞。
    配置原則 如果您選取了多個連結的IoT中樞,請選取要將裝置指派給不同中樞的方式。 若要深入瞭解配置原則,請參閱 如何使用配置原則

    如果您只選取一個連結的IoT中樞,建議您使用 平均加權散發 原則。

    Screenshot that shows connecting IoT hubs to the new enrollment group.

  7. 選取 [下一步:裝置設定]

  8. 在 [新增註冊群組] 頁面的 [裝置設定] 索引標籤上,提供下列資訊來定義新布建裝置的設定方式:

    欄位 描述
    IoT Edge 如果透過此群組布建的所有裝置都會執行 Azure IoT Edge,請檢查在布建裝置上啟用 IoT Edge。 如果此群組僅適用於未啟用 IoT Edge 的裝置,請取消核取此方塊。 群組中的所有裝置都會啟用IoT Edge,或無法啟用。
    裝置標籤 使用此文字框提供您想要套用至已布建裝置裝置對應項的任何標籤。
    所需的屬性 使用此文字框提供您想要套用至已布建裝置裝置對應項的任何所需屬性。

    如需詳細資訊,請參閱瞭解和使用 IoT 中樞 中的裝置對應項。

  9. 完成時,選取 [下一步:檢閱 + 建立]。

  10. 在 [ 檢閱 + 建立] 索引標籤上,確認您的所有值,然後選取 [ 建立]。

當您建立註冊群組時,DPS 會產生 主鍵次要密鑰,然後將它們新增至註冊專案。 您的對稱金鑰註冊群組會出現在 [註冊群組] 索引標籤的 [組名] 資料行底下

開啟註冊,並複製主要密鑰的值。 此金鑰是您的群組金鑰。

選擇裝置的唯一註冊標識碼

必須定義唯一的註冊標識碼,才能識別每個裝置。 您可以使用來自裝置的 MAC 位址、序號或任何唯一資訊。

在此範例中,我們會使用 MAC 位址和序號的組合,為註冊標識元形成下列字串。

sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6

為每個裝置建立唯一的註冊標識碼。 註冊標識碼是英數位元的不區分大小寫字串(長度最多 128 個字元),加上下列特殊字元: - . _ :。 最後一個字元必須是英數位元或虛線 (-)。

衍生裝置金鑰

若要產生裝置密鑰,請使用註冊群組主鍵來計算 每個裝置註冊標識碼的 HMAC-SHA256 哈希。 結果接著會轉換成每個裝置的Base 64格式。

警告

每個裝置的裝置程式代碼應該只包含該裝置的衍生裝置密鑰。 請勿在裝置程式代碼中包含您的群組主鍵。 遭入侵的群組金鑰有可能危害所有使用其驗證之裝置的安全性。

Azure CLI 的 IoT 擴充功能提供 az iot dps enrollment-group compute-device-key 命令來產生衍生的裝置密鑰。 此命令可從 Windows 和 Linux 系統使用。

以註冊群組的主--key取代 參數的值。

將參數的值 --registration-id 取代為您的註冊標識碼。

az iot dps enrollment-group compute-device-key --key <group_primary_key> --registration-id <device_registration_id>

範例結果:

"Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc="

每個裝置都會使用其衍生的裝置密鑰和唯一註冊標識碼,在布建期間與註冊群組執行對稱密鑰證明。

準備並執行裝置佈建程序代碼

在本節中,您會更新裝置範例程序代碼,以將裝置的開機順序傳送至裝置布建服務實例。 此開機順序會讓裝置辨識、驗證並指派給連結至裝置布建服務實例的IoT中樞。

範例布建程式代碼會依序完成下列工作:

  1. 使用下列三個參數,向裝置布建資源驗證您的裝置:

    • 裝置布建服務的標識碼範圍
    • 裝置的註冊標識碼。
    • 裝置的衍生裝置金鑰。
  2. 將裝置指派給已連結至裝置布建服務實例的IoT中樞。

若要使用您的裝置資訊更新並執行布建範例:

  1. 在裝置布建服務的主功能表中,選取 [ 概觀]。

  2. 複製 [ 標識符範圍] 值。

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 在 Visual Studio 中,開啟 執行 CMake 所產生的azure_iot_sdks.sln 方案檔。 方案檔應位於下列位置:

    
    \azure-iot-sdk-c\cmake\azure_iot_sdks.sln
    
    

    提示

    如果您的 cmake 目錄中未產生檔案,請確定您使用了最新版的 CMake 建置系統。

  4. 在 Visual Studio 的 [方案總管] 視窗中,移至 [Provision_Samples] 資料夾。 展開名為 prov_dev_client_sample 的範例專案。 展開 [原始程序檔],然後開啟 [prov_dev_client_sample.c]。

  5. id_scope尋找常數,並將值取代為您從 Azure 入口網站 複製的標識元範圍值。

    static const char* id_scope = "0ne00002193";
    
  6. 在相同的檔案中尋找函式的定義 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;
    
  7. 在已加上批注的 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>");
    

    取消批注函式呼叫,並將佔位元值(包括角括弧)取代為您在 [選擇裝置的唯一註冊標識符] 中所選擇的 註冊標識元,以及您在衍生裝置 密鑰中 產生的衍生裝置密鑰

    // 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=");
    

    警告

    請注意,此步驟會讓衍生裝置密鑰包含在每個裝置的映射中,這不是建議的安全性最佳做法。 這是安全性與容易使用通常是取捨的原因之一。 您必須根據自己的需求,完整檢閱裝置的安全性。

  8. 儲存檔案。

  9. 滑鼠右鍵按兩下prov_dev_client_sample 專案,然後選取 [ 設定為啟始專案]。

  10. 在 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:
    

範例布建程式代碼會完成下列工作:

  1. 使用下列三個參數,向裝置布建資源驗證您的裝置:

    • 裝置布建服務的標識碼範圍
    • 裝置的註冊標識碼。
    • 裝置的衍生裝置金鑰。
  2. 將裝置指派給已連結至裝置布建服務實例的IoT中樞。

  3. 將測試遙測訊息傳送至IoT中樞。

若要使用您的裝置資訊更新並執行布建範例:

  1. 在裝置布建服務的主功能表中,選取 [ 概觀]。

  2. 複製 [ 標識符範圍] 值。

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 開啟命令提示字元,並移至 複製的 SDK 存放庫中的 SymmetricKeySample

    cd .\azure-iot-sdk-csharp\provisioning\device\samples\how to guides\SymmetricKeySample
    
  4. SymmetricKeySample 資料夾中,在文字編輯器中開啟 Parameters.cs 。 此檔案會顯示範例所參考的參數。 執行範例時,本文只會使用前三個必要參數。 檢閱此檔案中的程序代碼。 不需要變更。

    參數 必要 描述
    --i--IdScope True DPS 實例的標識碼範圍
    --r--RegistrationId True 裝置的註冊標識碼。 註冊標識碼是英數位元的不區分大小寫字串(最多 128 個字元長),加上特殊字元:'-'、、'.''_'':'。 最後一個字元必須是英數位元或虛線 ('-')。
    --p--PrimaryKey True 個別註冊的主要金鑰或群組註冊的衍生裝置金鑰。
    --g--GlobalDeviceEndpoint False 要連線之裝置的全域端點。 預設為 global.azure-devices-provisioning.net
    --t--TransportType False 要用來與裝置佈建實例通訊的傳輸。 預設為 Mqtt。 可能的值包括Mqtt、、Mqtt_WebSocket_OnlyMqtt_Tcp_OnlyAmqpAmqp_WebSocket_OnlyAmqp_Tcp_only、 和 Http1
  5. SymmetricKeySample 資料夾中,在文字編輯器中開啟 ProvisioningDeviceClientSample.cs 。 此檔案顯示 SecurityProviderSymmetricKey 類別與 ProvisioningDeviceClient 類別搭配使用的方式,以布建仿真的對稱密鑰裝置。 檢閱此檔案中的程序代碼。 不需要變更。

  6. 使用下列命令建置並執行範例程式代碼:

    • 將取代<id-scope>為您從 Azure 入口網站 複製的標識元範圍
    • 將 取代<registration-id>為您在 [選擇裝置的唯一註冊標識符] 中選擇的註冊標識碼。
    • 將取代 <primarykey> 為您產生的衍生裝置金鑰。
    dotnet run --i <id-scope> --r <registration-id> --p <primarykey>
    
  7. 您應該會看到類似下列輸出的內容。 “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.
    

範例布建程式代碼會依序完成下列工作:

  1. 使用下列四個參數,向裝置布建資源驗證您的裝置:

    • PROVISIONING_HOST
    • PROVISIONING_IDSCOPE
    • PROVISIONING_REGISTRATION_ID
    • PROVISIONING_SYMMETRIC_KEY
  2. 將裝置指派給已連結至裝置布建服務實例的IoT中樞。

  3. 將測試遙測訊息傳送至IoT中樞。

若要使用您的裝置資訊更新並執行布建範例:

  1. 在裝置布建服務的主功能表中,選取 [ 概觀]。

  2. 複製 [ 標識符範圍] 值。

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 開啟命令提示字元以執行Node.js命令,然後移至下列目錄:

    cd azure-iot-sdk-node\provisioning\device\samples
    
  4. 在布 建/裝置/samples 資料夾中,開啟 register_symkey.js 並檢閱程序代碼。

    此範例預設為 MQTT 作為傳輸通訊協定。 如果您想要使用不同的通訊協定,請將下列這一行批注化,併為適當的通訊協定取消批注。

    var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
    

    另請注意,範例程式代碼會設定自定義承載:

    provisioningClient.setProvisioningPayload({a: 'b'});
    

    您可以批注化此程式碼,因為本教學課程不需要此程序代碼。 當您使用自定義配置 Webhook 將裝置指派給 IoT 中樞 時,可以使用自定義承載。 如需詳細資訊,請參閱 教學課程:使用自定義配置原則

    方法 provisioningClient.register() 會嘗試註冊您的裝置。

  5. 在命令提示字元中,執行下列命令來設定範例所使用的環境變數:

    • 第一個命令會將 PROVISIONING_HOST 環境變數設定為 全域裝置端點。 所有 DPS 實例的這個端點都相同。
    • 將取代<id-scope>為您從 Azure 入口網站 複製的標識元範圍
    • 將 取代<registration-id>為您在 [選擇裝置的唯一註冊標識符] 中選擇的註冊標識碼。
    • 將取代 <defived-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>
    
  6. 使用下列命令建置並執行範例程式代碼:

     npm install
    
    node register_symkey.js
    
  7. 您現在應該會看到類似下列輸出的內容。 “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
    

範例布建程式代碼會依序完成下列工作:

  1. 使用下列四個參數,向裝置布建資源驗證您的裝置:

    • PROVISIONING_HOST
    • PROVISIONING_IDSCOPE
    • PROVISIONING_REGISTRATION_ID
    • PROVISIONING_SYMMETRIC_KEY
  2. 將裝置指派給已連結至裝置布建服務實例的IoT中樞。

  3. 將測試遙測訊息傳送至IoT中樞。

若要使用您的裝置資訊更新並執行布建範例:

  1. 在裝置布建服務的主功能表中,選取 [ 概觀]。

  2. 複製 [ 標識符範圍] 值。

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 開啟命令提示字元,然後移至範例檔案provision_symmetric_key.py所在的目錄。

    cd azure-iot-sdk-python\samples\async-hub-scenarios
    
  4. 在命令提示字元中,執行下列命令來設定範例所使用的環境變數:

    • 第一個命令會將 PROVISIONING_HOST 環境變數設定為 全域裝置端點。 所有 DPS 實例的這個端點都相同。
    • 將取代<id-scope>為您從 Azure 入口網站 複製的標識元範圍
    • 將 取代<registration-id>為您在 [選擇裝置的唯一註冊標識符] 中選擇的註冊標識碼。
    • 將取代 <defived-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>
    
  5. 執行下列命令來安裝 azure-iot-device 連結庫。

    pip install azure-iot-device
    
  6. 在 provision_symmetric_key.py執行 Python 範例程式代碼。

    python provision_symmetric_key.py
    
  7. 您現在應該會看到類似下列輸出的內容。 一些範例風速遙測訊息也會以測試的形式傳送至中樞。

    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
    

範例布建程式代碼會依序完成下列工作:

  1. 使用下列四個參數,向裝置布建資源驗證您的裝置:

    • GLOBAL_ENDPOINT
    • SCOPE_ID
    • REGISTRATION_ID
    • SYMMETRIC_KEY
  2. 將裝置指派給已連結至裝置布建服務實例的IoT中樞。

  3. 將測試遙測訊息傳送至IoT中樞。

若要使用您的裝置資訊更新並執行布建範例:

  1. 在裝置布建服務的主功能表中,選取 [ 概觀]。

  2. 複製 [ 標識符範圍] 值。

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 開啟 Java 裝置範例程式代碼以進行編輯。 裝置範例程式代碼的完整路徑為:

    azure-iot-sdk-java/provisioning/provisioning-samples/provisioning-symmetrickey-individual-sample/src/main/java/samples/com/microsoft/azure/sdk/iot/ProvisioningSymmetricKeyIndividualEnrollmentSample.java

  4. 為您的 DPS 和裝置註冊設定下列變數的值:

    • 將取代[Your scope ID here]為您從 Azure 入口網站 複製的標識元範圍
    • 將取代 [Your Provisioning Service Global Endpoint here]全域裝置端點:global.azure-devices-provisioning.net。 所有 DPS 實例的這個端點都相同。
    • 將取代 [Enter your Symmetric Key here] 為您在衍生裝置金鑰中 產生的衍生裝置金鑰
    • 將 取代[Enter your Registration ID here]為您在 [選擇裝置的唯一註冊標識符] 中選擇的註冊標識碼。
    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]";
    

    警告

    請注意,此步驟會讓衍生裝置密鑰包含在每個裝置的映射中,這不是建議的安全性最佳做法。 這是安全性與容易使用通常是取捨的原因之一。 您必須根據自己的需求,完整檢閱裝置的安全性。

  5. 開啟要建置的命令提示字元。 移至 Java SDK 存放庫的布建範例項目資料夾。

    cd azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-symmetrickey-individual-sample
    
  6. 建置 (Build) 範例。

    mvn clean install
    
  7. 移至 target 資料夾並執行已建立 .jar 的檔案。 在命令中 java ,將 {version} 佔位元取代為您電腦上的檔名中的 .jar 版本。

    cd target
    java -jar ./provisioning-symmetrickey-individual-sample-{version}-with-deps.jar
    
  8. 您現在應該會看到類似下列輸出的內容。

    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 [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] )
    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 [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] )
    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 [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] )
    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 [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] ) with status OK
    Message received! Response status: OK
    

確認您的裝置布建註冊

在本教學課程中,您已使用 靜態 設定配置原則,將透過註冊群組註冊的裝置指派給相同的IoT中樞。 不過,針對裝置可能布建到數個IoT中樞之一的配置,您可以檢查註冊群組的註冊記錄,以查看裝置布建到哪一個IoT中樞:

  1. 在 Azure 入口網站 中,移至您的 DPS 實例。

  2. [設定] 功能表中,選取 [管理註冊]。

  3. 選取 [ 註冊群組]。

  4. 選取您為此教學課程建立的註冊群組。

  5. 在 [ 註冊群組詳細數據] 頁面上,選取 [ 註冊狀態]。

  6. 尋找裝置裝置識別碼數據行的裝置標識碼,並記下 [指派的IoT中樞] 資料行中的IoT中

    您可以選取裝置記錄,以查看更多詳細數據,例如指派給裝置的初始對應項。

若要確認 IoT 中樞上的裝置:

  1. 在 Azure 入口網站 中,移至您裝置已指派的IoT中樞。

  2. 在 [ 裝置管理] 功能表中,選取 [ 裝置]。

  3. 如果已成功布建您的裝置,其裝置標識碼應該會出現在清單中,且 狀態 設定為 已啟用。 如果您沒有看到您的裝置,請選取 [ 重新整理]。

    Device is registered with the IoT hub

注意

如果您從註冊群組中的預設值變更 初始裝置對應項狀態 ,裝置可以從中樞提取所需的對應項狀態,並據以採取行動。 如需詳細資訊,請參閱瞭解和使用 IoT 中樞 中的裝置對應項。

布建更多裝置

若要透過註冊群組布建更多裝置,請遵循上述各節中的步驟來:

  1. 選擇裝置的唯一註冊標識碼。

  2. 衍生裝置金鑰。 如同您先前所做的,請使用註冊群組的主鍵作為群組密鑰。

  3. 執行裝置布建程序代碼。 以新的衍生裝置金鑰和註冊標識碼取代必要的成品。

清除資源

如果您打算繼續處理和探索裝置用戶端範例,請勿清除本教學課程中建立的資源。 如果您不打算繼續,請使用下列步驟來刪除本教學課程中建立的所有資源。

刪除您的註冊群組

刪除註冊群組並不會刪除與其相關聯的註冊記錄。 這些孤立的記錄會計入 DPS 實例的註冊配額 。 基於這個理由,最好先刪除與註冊群組相關聯的所有註冊記錄,再刪除註冊群組本身。

  1. 在 Azure 入口網站 中,移至您的 DPS 實例。

  2. [設定] 功能表中,選取 [管理註冊]。

  3. 選取 [ 註冊群組] 索引標籤

  4. 選取您在本教學課程中使用的註冊組名,以開啟其詳細數據頁面。

  5. 在 [ 註冊詳細數據] 頁面上,選取 [ 註冊狀態]。 然後選取 [裝置標識符] 數據行標頭旁的複選框,以選取註冊群組的所有註冊記錄。 選取 頁面頂端的 [刪除 ],以刪除註冊記錄。

  6. 返回 [ 管理註冊] 頁面。

  7. 選取您在本教學課程中使用的註冊組名旁的複選框。

  8. 在頁面頂端,選取 [刪除]

從IoT 中樞 刪除裝置註冊

  1. 在 Azure 入口網站 中,移至您裝置已指派的IoT中樞。

  2. 導覽功能表的 [裝置管理] 區段選取 [裝置]。

  3. 選取您在本教學課程中註冊之裝置的裝置標識符旁的複選框。

  4. 在頁面頂端,選取 [刪除]

下一步

在本教學課程中,您已使用註冊群組將多個裝置布建至單一 IoT 中樞。 接下來,瞭解如何跨多個中樞布建 IoT 裝置。