教學課程: 使用對稱金鑰註冊群組佈建裝置
本教學課程示範如何使用註冊群組,將多部模擬對稱密鑰裝置安全佈建到單一 IoT 中樞。
Azure IoT 中樞裝置佈建服務支援兩種註冊類型以佈建裝置:
- 註冊群組:用來註冊多個相關的裝置。 本教學課程示範如何使用註冊群組進行布建。
- 個別註冊:用來註冊單一裝置。
Azure IoT 中樞裝置佈建服務支援三種驗證形式以佈建裝置:
- X.509 憑證
- 信賴平台模組 (TPM)
- 對稱金鑰 - 本教學課程示範對稱金鑰證明
某些裝置可能沒有憑證、TPM 或任何其他安全性功能,可用來安全地識別裝置。 對這類裝置而言,Azure IoT 中樞裝置佈建服務 (DPS) 包括對稱金鑰證明。 使用對稱金鑰證明可根據 MAC 位址或序號等唯一資訊來識別裝置。
在本教學課程中,您將完成下列目標:
- 為每個裝置定義唯一的註冊標識碼。
- 建立使用對稱金鑰證明的註冊群組。
- 使用其唯一的註冊標識碼和共用註冊群組密鑰,為每個裝置產生裝置密鑰。
- 使用 Azure IoT 裝置 SDK 中的裝置金鑰和範例程式代碼來佈建裝置。
本教學課程以 Windows 工作站說明。 不過,您可以在 Linux 上執行上述程序。 如需 Linux 的範例,請參閱教學課程: 針對地理延遲來佈建。
注意
之前若已完成快速入門: 佈建模擬的對稱金鑰裝置,但仍需要設定 Azure 資源和開發環境,您可以繼續本教學課程的建立對稱密鑰註冊群組。
必要條件
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
如果您使用 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
- 安裝 Node.js v4.0+。
- 在您的 Windows 型機器上安裝 Python 3.7 或更新版本。 您可以藉由執行
python --version
來檢查您的 Python 版本。
在您的機器上安裝 Java SE 開發套件 8 或更新版本。
下載並安裝 Maven。
- 安裝最新版的 Git。 確定 Git 已新增至可存取命令視窗的環境變數中。 請參閱 Software Freedom Conservancy 的 Git 用戶端工具以取得要安裝的最新版
git
工具,其中包括 Git Bash (您可用來與本機 Git 存放庫互動的命令列應用程式)。
準備您的開發環境
在本節中,您會準備開發環境來建置適用於 C 的 Azure IoT 裝置 SDK。範例程式代碼會在裝置的開機順序期間佈建裝置。
在網頁瀏覽器中,移至 Azure IoT C SDK 的 [發行] 頁面。
複製最新版 Azure IoT C SDK 的標籤名稱,例如:
lts_03_2024
。開啟 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
此作業可能需要幾分鐘的時間才能完成。
作業完成後,請從
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 C# SDK (英文) GitHub 存放庫:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
開啟命令提示字元或 Git Bash 終端機。
使用下列命令複製適用於 Node.js 的 Azure IoT SDK GitHub 存放庫:
git clone https://github.com/Azure/azure-iot-sdk-node.git --recursive
開啟命令提示字元或 Git Bash 終端機。
使用下列命令複製 Azure IoT Python 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 版本的資訊,請參閱 Azure IoT Python SDK 移轉指南 (英文)。
開啟命令提示字元或 Git Bash 終端機。
使用下列命令複製 Azure IoT Java SDK (英文) 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 入口網站,並瀏覽至您的裝置佈建服務執行個體。
從導覽功能表的 [設定] 區段選取 [管理註冊]。
選取 [新增註冊群組]。
在 [新增註冊群組] 頁面的 [註冊 + 佈建] 索引標籤上,提供下列資訊以設定註冊群組詳細資料:
欄位 描述 證明 選取 [對稱金鑰] 作為 [證明機制]。 對稱金鑰設定 如果您想要使用隨機產生的金鑰,請核取 [自動產生對稱金鑰] 方塊。 如果您想要提供自己的金鑰,請取消核取此方塊。 群組名稱 提供裝置群組的名稱。 註冊群組名稱是不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元: '-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或虛線 ('-'
)。佈建狀態 如果您想要讓此註冊群組可用於佈建裝置,請核取 [啟用此註冊] 方塊。 如果您想要停用群組,請取消核取此方塊。 您之後無法變更此設定。 重新佈建原則 選擇重新佈建原則,以反映您希望 DPS 如何處理要求重新佈建的裝置。 如需詳細資訊,請參閱重新佈建原則 選取 [下一步:IoT 中樞]。
在 [新增註冊群組] 頁面的 [IoT 中樞] 索引標籤上,提供下列資訊以判斷註冊群組可將裝置佈建到哪些 IoT 中樞:
欄位 描述 目標 IoT 中樞 選取一或多個連結的 IoT 中樞,或是新增 IoT 中樞的連結。 若要深入了解如何將 IoT 中樞連結到 DPS 執行個體,請參閱如何連結和管理 IoT 中樞。 配置原則 如果您選取了多個連結的 IoT 中樞,請選取要如何將裝置指派給不同的中樞。 若要深入了解配置原則,請參閱如何使用配置原則。
如果您只選取一個連結的 IoT 中樞,建議您使用 [權重相等的分佈] 原則。選取 [下一步: 裝置設定]
在 [新增註冊群組] 頁面的 [裝置設定] 索引標籤上,提供下列資訊以定義新佈建裝置的設定方式:
欄位 描述 IoT Edge 如果所有透過此群組佈建的裝置都會執行 Azure IoT Edge,請核取 [在佈建的裝置上啟用 IoT Edge]。 如果此群組僅適用於未啟用 IoT Edge 的裝置,請取消核取此方塊。 群組中的所有裝置必須全部啟用 IoT Edge,或全部未啟用。 裝置標籤 使用此文字輸入框來提供您要套用至已佈建裝置之裝置對應項的任何標籤。 所需屬性 使用此文字輸入框來提供您要套用至已佈建裝置之裝置對應項的任何所需屬性。 如需詳細資訊,請參閱了解和使用 Azure IoT 中樞的裝置對應項。
完成時,選取 [下一步:檢閱 + 建立]。
在 [檢閱 + 建立] 索引標籤上,確認所有值,然後選取 [建立]。
當您建立註冊群組時,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 中樞。
範例佈建程式碼會依序完成下列工作:
使用下列三個參數,向裝置佈建資源驗證您的裝置:
- 裝置佈建服務的識別碼範圍
- 裝置的註冊識別碼。
- 裝置的衍生裝置金鑰。
將裝置指派給已連結至裝置佈建服務執行個體的 IoT 中樞。
若要使用您的裝置資訊來更新並執行佈建範例:
在裝置佈建服務的主功能表中,選取 [概觀]。
複製 [識別碼範圍] 值。
在 Visual Studio 中,開啟透過執行 CMake 而產生的 azure_iot_sdks.sln 方案檔案。 該方案檔案應位於下列位置:
\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 入口網站 複製的標識元範圍值。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>");
請取消註解函式呼叫,並將預留位置值 (包括角括號) 更換成您在 [為裝置選擇唯一的註冊識別碼] 中選擇的註冊識別碼和在 [衍生裝置金鑰] 中產生的衍生裝置金鑰。
// 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=");
警告
請注意,此步驟會讓每部裝置的映像包含衍生的裝置金鑰,這不是建議的安全性最佳做法。 這就是為什麼安全性和易用性常互為取捨。 您必須根據自己的需求,完整檢閱裝置安全性。
儲存檔案。
以滑鼠右鍵按一下 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:
範例佈建程式碼會完成下列工作:
使用下列三個參數,向裝置佈建資源驗證您的裝置:
- 裝置佈建服務的識別碼範圍
- 裝置的註冊識別碼。
- 裝置的衍生裝置金鑰。
將裝置指派給已連結至裝置佈建服務執行個體的 IoT 中樞。
將測試訊息傳送至IoT中樞。
若要使用您的裝置資訊來更新並執行佈建範例:
在裝置佈建服務的主功能表中,選取 [概觀]。
複製 [識別碼範圍] 值。
開啟命令提示字元,並移至 複製的 SDK 存放庫中的 SymmetricKeySample :
cd .\azure-iot-sdk-csharp\provisioning\device\samples\how to guides\SymmetricKeySample
在 SymmetricKeySample 資料夾中,用文字編輯器開啟 Parameters.cs。 此檔案會顯示範例所參考的參數。 在執行範例時,本文只會使用前三個必要參數。 檢閱此檔案中的程式碼。 不需要任何變更。
參數 必要 描述 --i
或--IdScope
True DPS 執行個體的識別碼範圍 --r
或--RegistrationId
True 裝置的註冊識別碼。 登錄識別碼 (registration ID) 是一個不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元: '-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或虛線 ('-'
)。--p
或--PrimaryKey
True 個別註冊的主要金鑰或群組註冊的衍生裝置金鑰。 --g
或--GlobalDeviceEndpoint
False 裝置要連線到的全域端點。 預設為 global.azure-devices-provisioning.net
--t
或--TransportType
False 要用來與裝置佈建執行個體通訊的傳輸。 預設為 Mqtt
。 可能的值包括Mqtt
、Mqtt_WebSocket_Only
、Mqtt_Tcp_Only
、Amqp
、Amqp_WebSocket_Only
、Amqp_Tcp_only
和Http1
。在 SymmetricKeySample 資料夾中,用文字編輯器開啟 ProvisioningDeviceClientSample.cs。 此檔案顯示 SecurityProviderSymmetricKey 類別如何搭配 ProvisioningDeviceClient 類別來佈建仿真的對稱密鑰裝置。 檢閱此檔案中的程式碼。 不需要任何變更。
使用下列命令建置和執行範例程式碼:
- 將取代
<id-scope>
為您從 Azure 入口網站 複製的標識元範圍。 - 將
<registration-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.
範例佈建程式碼會依序完成下列工作:
使用下列四個參數,向裝置佈建資源驗證您的裝置:
PROVISIONING_HOST
PROVISIONING_IDSCOPE
PROVISIONING_REGISTRATION_ID
PROVISIONING_SYMMETRIC_KEY
將裝置指派給已連結至裝置佈建服務執行個體的 IoT 中樞。
將測試遙測訊息傳送至 IoT 中樞。
若要使用您的裝置資訊來更新並執行佈建範例:
在裝置佈建服務的主功能表中,選取 [概觀]。
複製 [識別碼範圍] 值。
開啟用於執行 Node.js 命令的命令提示字元,然後移至下列目錄:
cd azure-iot-sdk-node\provisioning\device\samples
在佈建/裝置/範例資料夾中,開啟 register_symkey.js 並檢閱程式碼。
此範例預設使用 MQTT 為傳輸通訊協定。 如果您想要使用不同的通訊協定,請將下一行註解化,並取消註解適當的通訊協定行。
var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
亦請注意,範例程式碼會設定自訂承載:
provisioningClient.setProvisioningPayload({a: 'b'});
您可以將此程式碼註解化,因為本教學課程用不到。 當您使用自定義配置 Webhook 將裝置指派給 IoT 中樞 時,可以使用自定義承載。 如需詳細資訊,請參閱教學課程: 使用自訂配置原則。
provisioningClient.register()
方法會嘗試註冊您的裝置。在命令提示字元中,執行下列命令以設定範例所使用的環境變數:
- 第一個命令會將
PROVISIONING_HOST
環境變數設定為 全域裝置端點。 所有 DPS 執行個體都是這個端點。 - 將取代
<id-scope>
為您從 Azure 入口網站 複製的標識元範圍。 - 將
<registration-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
範例佈建程式碼會依序完成下列工作:
使用下列四個參數,向裝置佈建資源驗證您的裝置:
PROVISIONING_HOST
PROVISIONING_IDSCOPE
PROVISIONING_REGISTRATION_ID
PROVISIONING_SYMMETRIC_KEY
將裝置指派給已連結至裝置佈建服務執行個體的 IoT 中樞。
將測試訊息傳送至IoT中樞。
若要使用您的裝置資訊來更新並執行佈建範例:
在裝置佈建服務的主功能表中,選取 [概觀]。
複製 [識別碼範圍] 值。
開啟命令提示字元,然後移至範例檔案 provision_symmetric_key.py 所在的目錄。
cd azure-iot-sdk-python\samples\async-hub-scenarios
在命令提示字元中,執行下列命令以設定範例所使用的環境變數:
- 第一個命令會將
PROVISIONING_HOST
環境變數設定為 全域裝置端點。 所有 DPS 執行個體都是這個端點。 - 將取代
<id-scope>
為您從 Azure 入口網站 複製的標識元範圍。 - 將
<registration-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
範例佈建程式碼會依序完成下列工作:
使用下列四個參數,向裝置佈建資源驗證您的裝置:
GLOBAL_ENDPOINT
SCOPE_ID
REGISTRATION_ID
SYMMETRIC_KEY
將裝置指派給已連結至裝置佈建服務執行個體的 IoT 中樞。
將測試訊息傳送至IoT中樞。
若要使用您的裝置資訊來更新並執行佈建範例:
在裝置佈建服務的主功能表中,選取 [概觀]。
複製 [識別碼範圍] 值。
開啟 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 入口網站 複製的標識元範圍。 - 將
[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]";
警告
請注意,此步驟會讓每部裝置的映像包含衍生的裝置金鑰,這不是建議的安全性最佳做法。 這就是為什麼安全性和易用性常互為取捨。 您必須根據自己的需求,完整檢閱裝置安全性。
- 將取代
開啟命令提示字元以便建置。 移至 Java SDK 存放庫的佈建範例專案資料夾。
cd azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-symmetrickey-individual-sample
建置 (Build) 範例。
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 入口網站中,移至您的 DPS 執行個體。
在 [設定] 功能表中,選取 [管理註冊]。
選取 [註冊群組]。
選取您在本教學課程中建立的註冊群組。
在 [註冊群組詳細資料] 頁面中,選取 [註冊狀態]。
找到裝置 [裝置標識碼] 資料行的裝置識別碼,並記下 [指派的 IoT 中樞] 資料行中的 IoT 中樞。
您可以選取裝置記錄以查看更多詳細資料,例如指派給裝置的初始對應項。
若要驗證 IoT 中樞內的裝置:
在 Azure 入口網站中,前往裝置被指派的 IoT 中樞。
在 [裝置管理] 功能表中,選取 [裝置]。
如果您的裝置已成功佈建,其裝置識別碼應該會出現在清單中,且 [狀態] 會設定為 [已啟用]。 如果您沒有看到裝置,請選取 [重新整理]。
注意
如果您在註冊群組中變更了預設值的「初始裝置對應項狀態」,裝置會從中樞提取所需的對應項狀態並採取適當的動作。 如需詳細資訊,請參閱了解和使用 Azure IoT 中樞的裝置對應項。
布建更多裝置
若要透過註冊群組佈建更多裝置,請遵循上述各節中的步驟執行作業:
清除資源
如果您打算繼續使用並探索裝置用戶端範例,請勿清除在本教學課程中建立的資源。 如不打算繼續,請使用下列步驟刪除在本教學課程中建立的所有資源。
刪除您的註冊群組
刪除註冊群組不會刪除與其相關聯的註冊記錄。 這些孤立的記錄會計入 DPS 實例的註冊配額 。 因此,最好先刪除與註冊群組相關聯的所有註冊記錄,再刪除註冊群組本身。
在 Azure 入口網站中,移至您的 DPS 執行個體。
在 [設定] 功能表中,選取 [管理註冊]。
選取 [註冊群組] 索引標籤。
選取您在本教學課程中所使用的註冊群組名稱,開啟其詳細資料頁面。
在 [註冊詳細資料] 頁面中,選取 [註冊狀態]。 然後選取 [裝置識別碼] 資料行標頭旁的核取方塊,以選取註冊群組的所有註冊記錄。 選取頁面頂端的 [刪除],以刪除註冊記錄。
返回 [管理註冊] 頁面。
選取您在本教學課程中所用之註冊群組名稱旁的核取方塊。
在頁面頂端,選取 [刪除]。
從IoT 中樞 刪除裝置註冊
在 Azure 入口網站中,前往裝置被指派的 IoT 中樞。
從導覽功能表的 [裝置管理] 區段中選取 [裝置]。
選取您在本教學課程中所註冊裝置之裝置識別碼旁的核取方塊。
在頁面頂端,選取 [刪除]。
下一步
在本教學課程中,您已使用註冊群組將多部裝置佈建到單一 IoT 中樞。 接下來,了解如何跨多個中樞佈建 IoT 裝置。