教學課程:布建異地延遲
本教學課程說明如何使用 配置原則,將多個模擬對稱金鑰裝置安全地布建至一組 IoT 中樞。 IoT 中樞裝置布建服務 (DPS) 透過其內建配置原則和自訂配置原則的支援來支援各種配置案例。
為地理位置/地理位置延遲布建是常見的配置案例。 當裝置在位置之間移動時,網路延遲會藉由將裝置布建到最接近每個位置的 IoT 中樞來改善。 在此案例中,會選取一群跨越多個區域的 IoT 中樞進行註冊。 已針對這些註冊選取內建 最低延遲 配置原則。 此原則會促使裝置佈建服務評估裝置延遲,然後從一群 IoT 中樞中判斷出最接近的 IoT 中樞。
本教學課程使用 來自 Azure IoT C SDK 的模擬裝置範例,示範如何跨區域布建裝置。 您將在本教學課程中執行下列步驟:
- 使用 Azure CLI 建立兩個區域 IoT 中樞, (美國西部 2 和美國 東部)
- 建立根據地理位置布建裝置的註冊, (最低延遲)
- 使用 Azure CLI 建立兩個區域 Linux VM,以作為位於美國 西部 2和美國東部 (相同區域中的裝置)
- 在兩個 Linux VM 上設定適用於 Azure IoT C SDK 的開發環境
- 模擬裝置,並確認裝置已布建到最接近區域中的 IoT 中樞。
重要
某些區域可能會隨時強制執行建立虛擬機器的限制。 在撰寫本指南時, westus2 和 eastus 區域允許建立 VM。 如果您無法在其中一個區域中建立,您可以嘗試不同的區域。 若要深入瞭解在建立 VM 時選擇 Azure 地理區域,請參閱 Azure 中虛擬機器的區域
必要條件
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱Azure Cloud Shell中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
建立兩個區域 IoT 中樞
在本節中,您將建立 Azure 資源群組,以及兩個新的區域 IoT 中樞資源。 其中一個 IoT 中樞適用于 美國西部 2 區域,另一個則適用于 美國東部 區域。
重要
建議您針對本教學課程中建立的所有資源使用相同的資源群組。 這可讓您在完成之後更輕鬆地清除。
在 Azure Cloud Shell中,使用下列az group create 命令建立資源群組:
az group create --name contoso-us-resource-group --location eastus
在 eastus 位置建立 IoT 中樞,並將其新增至您使用下列 az iot hub create 命令建立的資源群組, (以您自己的唯一名稱取代
{unique-hub-name}
) :az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
此命令可能會需要花費幾分鐘才能完成。
現在,在 westus2 位置建立 IoT 中樞,然後將它新增至您使用下列 az iot hub create 命令建立的資源群組, (以您自己的唯一名稱取代
{unique-hub-name}
) :az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
此命令可能會需要花費幾分鐘才能完成。
建立異地延遲的註冊
在本節中,您將為裝置建立新的註冊群組。
為了簡單起見,本教學課程會使用 對稱金鑰證明 搭配註冊。 如需更安全的解決方案,請考慮使用 X.509 憑證證明與信任鏈結。
登入 Azure 入口網站,並瀏覽至您的裝置佈建服務執行個體。
從導覽功能表的 [設定] 區段選取[管理註冊]。
選取 [新增註冊群組]。
在 [新增註冊群組] 頁面的 [註冊 + 布建] 索引標籤上,提供下列資訊來設定註冊群組詳細資料:
欄位 描述 證明 選取 [對稱金鑰 ] 作為 證明機制。 對稱金鑰設定 核取 [自動產生對稱金鑰 ] 方塊。 群組名稱 將您的群組命名為 contoso-us-devices,或提供您自己的組名。 註冊群組名稱是不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元: '-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或虛線 ('-'
)。選取 [下一步:IoT 中樞]。
使用下列步驟將兩個 IoT 中樞新增至註冊群組:
在 [新增註冊群組] 頁面的[IoT 中樞] 索引標籤上,選取 [目標 IoT 中樞] 區段中的 [新增IoT 中樞連結]。
在 [ 將連結新增至 IoT 中樞 ] 頁面上,選取您在 eastus 區域中建立的 IoT 中樞,並指派 iothubowner 存取權。
選取 [儲存]。
再次選取 [將連結新增至 IoT 中樞 ],然後遵循相同的步驟來新增您在 westus2 區域中建立的 IoT 中樞。
在 [ 目標 IoT 中樞] 下拉式功能表中 ,選取這兩個 IoT 中樞。
針對 [ 配置原則],選取 [ 最低延遲]。
選取 [檢閱 + 建立]。
在 [ 檢閱 + 建立] 索引標籤上,確認您的所有值,然後選取 [ 建立]。
建立註冊群組之後,請從註冊群組清單中選取其名稱 contoso-us-devices 。
複製 主要金鑰。 此金鑰稍後將用於產生兩個模擬裝置的唯一裝置金鑰。
建立區域 Linux VM
在本節中,您會建立兩個區域 Linux 虛擬機器 (VM) ,一個位於 美國西部 2 ,另一個位於 美國東部 2。 這些 VM 會從每個區域執行裝置模擬範例,以示範這兩個區域中裝置的裝置布建。
若要簡化清除作業,請將這些 VM 新增至包含所建立 IoT 中樞的相同資源群組 contoso-us-resource-group。
在 Azure Cloud Shell中,執行下列命令,在命令中進行下列參數變更之後,建立美國東部區域 VM:
--name:輸入您美國東部區域裝置 VM 的唯一名稱。
--admin-username:使用您自己的系統管理員使用者名稱。
--admin-password:使用您自己的系統管理員密碼。
az vm create \ --resource-group contoso-us-resource-group \ --name ContosoSimDeviceEast \ --location eastus \ --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \ --admin-username contosoadmin \ --admin-password myContosoPassword2018 \ --authentication-type password --public-ip-sku Standard
此命令需要幾分鐘的時間才能完成。
命令完成後,請複製您美國東部區域 VM 的 publicIpAddress 值。
在 Azure Cloud Shell中,執行 命令以在命令中進行下列參數變更之後,建立美國西部 2區域 VM:
--name:輸入您 美國西部 2 區域裝置 VM 的唯一名稱。
--admin-username:使用您自己的系統管理員使用者名稱。
--admin-password:使用您自己的系統管理員密碼。
az vm create \ --resource-group contoso-us-resource-group \ --name ContosoSimDeviceWest2 \ --location westus2 \ --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \ --admin-username contosoadmin \ --admin-password myContosoPassword2018 \ --authentication-type password --public-ip-sku Standard
此命令需要幾分鐘的時間才能完成。
命令完成後,請複製您美國西部 2 區域 VM 的 publicIpAddress 值。
開啟兩個命令列殼層。
使用 SSH 連線至每個殼層中的其中一個區域 VM。
將系統管理員使用者名稱和您複製為參數的公用 IP 位址傳遞至 SSH。 在系統提示時輸入系統管理員密碼。
ssh contosoadmin@1.2.3.4 contosoadmin@ContosoSimDeviceEast:~$
ssh contosoadmin@5.6.7.8 contosoadmin@ContosoSimDeviceWest:~$
準備 Azure IoT C SDK 開發環境
在本節中,您會在每個 VM 上複製 Azure IoT C SDK。 SDK 包含一個範例,可模擬來自每個區域的裝置布建。
針對每個 VM:
使用下列命令安裝 CMake、 g++、 gcc和 Git :
sudo apt-get update sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
尋找並複製 最新版 SDK 的標記名稱。
在兩部 VM 上複製 適用于 C 的 Azure IoT 裝置 SDK 。 使用您在上一個步驟中找到的
-b
標記作為 參數的值,例如:lts_01_2023
。git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --init
預期此作業需要幾分鐘的時間才能完成。
在存放庫內建立新的 cmake 資料夾,並變更為該資料夾。
mkdir ~/azure-iot-sdk-c/cmake cd ~/azure-iot-sdk-c/cmake
執行下列命令,其會建置開發用戶端平臺專屬的 SDK 版本:
cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON ..
建置成功後,最後幾行輸出會類似於下列輸出:
-- IoT Client SDK Version = 1.7.0 -- Provisioning SDK Version = 1.7.0 -- Looking for include file stdint.h -- Looking for include file stdint.h - found -- Looking for include file stdbool.h -- Looking for include file stdbool.h - found -- target architecture: x86_64 -- Performing Test CXX_FLAG_CXX11 -- Performing Test CXX_FLAG_CXX11 - Success -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1") -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0") -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so -- target architecture: x86_64 -- iothub architecture: x86_64 -- Configuring done -- Generating done -- Build files have been written to: /home/contosoadmin/azure-iot-sdk-c/azure-iot-sdk-c
衍生唯一的裝置金鑰
搭配群組註冊使用對稱金鑰證明時,您不會直接使用註冊群組金鑰。 相反地,您會從每個裝置的註冊群組金鑰衍生唯一金鑰。
在本教學課程的這個部分中,您將從群組主要金鑰產生裝置金鑰,以計算裝置的唯一註冊識別碼 HMAC-SHA256 。 然後結果會轉換成 Base64 格式。
重要
請勿在裝置程式碼中包含您的群組主要金鑰。
針對eastus和westus2裝置:
使用 openssl 來產生您的唯一金鑰。 您將使用下列 Bash 殼層腳本 (將 取代
{primary-key}
為您稍早複製的註冊群組 主要金鑰 ,並將 取代{contoso-simdevice}
為每個裝置專屬的唯一註冊識別碼。 登錄識別碼 (registration ID) 是一個不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元:'-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或破折號 ('-'
)。KEY={primary-key} REG_ID={contoso-simdevice} keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000) echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
該指令碼會輸出類似下列金鑰的結果:
p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
現在,每個裝置都有自己的衍生裝置金鑰和唯一的註冊識別碼,可在布建程式期間與註冊群組執行對稱金鑰證明。
從每個區域模擬裝置
在本節中,您將更新這兩個區域 VM 的 Azure IoT C SDK 中的布建範例。
此範例程式碼會模擬將佈建要求傳送至裝置佈建服務執行個體的裝置開機順序。 開機順序會使裝置辨識並指派給根據延遲最接近的 IoT 中樞。
在Azure 入口網站中,選取裝置布建服務的 [概觀] 索引標籤,並記下 [識別碼範圍] 值。
在兩個 VMS 上,開啟 ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c 進行編輯。
vi ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c
在兩部 VM 上,尋找
id_scope
常數,並將值取代為您稍早複製的識別碼 範圍 值。static const char* id_scope = "0ne00002193";
在這兩部 VM 上,尋找相同檔案中函
main()
式的定義。 確定hsm_type
變數如下所示設定為SECURE_DEVICE_TYPE_SYMMETRIC_KEY
,以符合註冊群組證明方法。將變更儲存到兩部 VM 中的檔案。
SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; //hsm_type = SECURE_DEVICE_TYPE_X509; hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
在這兩部 VM 上,尋找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("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
美國西部:
// Set the symmetric key if using they auth type prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
在兩部 VM 上,儲存檔案。
在兩部 VM 上,瀏覽至如下所示的範例資料夾,然後建立範例。
cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/ cmake --build . --target prov_dev_client_sample --config Debug
建置成功之後,請在兩部 VM 上執行 prov_dev_client_sample.exe ,以模擬來自每個區域的裝置。 請注意,每個裝置都會配置給最接近模擬裝置區域的 IoT 中樞。
執行模擬:
~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
從美國東部 VM 輸出的範例:
contosoadmin@ContosoSimDeviceEast:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample Provisioning API Version: 1.2.9 Registering Device Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Registration Information received from service: contoso-east-hub.azure-devices.net, deviceId: contoso-simdevice-east Press enter key to exit:
從美國西部 VM 輸出的範例:
contosoadmin@ContosoSimDeviceWest:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample Provisioning API Version: 1.2.9 Registering Device Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Registration Information received from service: contoso-west-hub.azure-devices.net, deviceId: contoso-simdevice-west Press enter key to exit:
清除資源
如果您打算繼續使用本教學課程中建立的資源,您可以保留這些資源。 否則,請使用下列步驟來刪除本教學課程所建立的所有資源,以避免產生不必要的費用。
此處的步驟假設您已依照 名為 contoso-us-resource-group的相同資源群組中的指示,在本教學課程中建立所有資源。
重要
刪除資源群組是無法回復的動作。 資源群組和其中包含的所有資源都將永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有的資源群組內建立了 IoT 中樞,而該群組中包含您想要保留的資源,則您只需刪除 IoT 中樞本身即可,而不要刪除資源群組。
依名稱刪除資源群組:
登入 Azure 入口網站。
選取 [資源群組]。
在 [依名稱篩選] 文字方塊中,輸入您的資源所屬的資源群組名稱 contoso-us-resource-group。
在結果清單中的資源群組右側,按一下 ...,然後按一下 [刪除資源群組]。
系統將會要求您確認是否刪除資源。 再次輸入您的資源群組名稱以進行確認,然後選取 [刪除]。 片刻過後,系統便會刪除該資源群組及其所有內含的資源。
後續步驟
若要深入瞭解自訂配置原則,請參閱