適用於:
Azure IoT Edge 1.5
重要事項
IoT Edge 1.5 LTS 是支援的版本。 自 2024 年 11 月 12 日起,IoT Edge 1.4 LTS 已結束生命週期。 如果您採用舊版,請參閱更新 IoT Edge。
本教學課程示範如何開發程式碼並將其部署至 IoT Edge 裝置。 Azure IoT Edge 模組可讓您直接在 IoT Edge 裝置上部署執行商務邏輯的程式碼。 在將 程式代碼部署至 Linux 裝置 快速入門中,您會設定 IoT Edge 裝置,並從 Azure Marketplace 部署模組。
本文說明兩個 IoT Edge 開發工具的步驟:
- Azure IoT Edge 開發工具 命令列介面(CLI),是開發時的偏好選擇。
- 適用於 Visual Studio Code 的 Azure IoT Edge 工具 擴充功能,其處於 維護模式。
使用本文開頭的工具選取器按鈕來選擇您的工具。
在本教學課程中,您會了解如何:
- 設定您的開發電腦
- 使用IoT Edge工具來建立新專案
- 將您的專案建置為 Docker 容器 ,並將其儲存在 Azure 容器登錄中
- 將您的程式代碼部署至IoT Edge裝置
您在本教學課程中建立的 IoT Edge 模組會篩選裝置所產生的溫度數據。 只有在溫度高於設定閾值時,才會將訊息傳送至上游。 邊緣的這種分析有助於減少傳送至雲端和儲存的數據量。
先決條件
開發機器:
- 使用您自己的電腦或虛擬機器。
- 請確定您的開發機器支援 巢狀虛擬化 來執行容器引擎。
- 您可以使用執行容器引擎的大部分作系統來開發適用於 Linux 裝置的 IoT Edge 模組。 本教程使用 Windows 計算機,但也指出了 macOS 或 Linux 上的已知差異。
- 安裝 Visual Studio Code
- 安裝 Azure CLI。
Azure IoT Edge 裝置:
- 在不同的裝置上執行IoT Edge。 將開發機器和IoT Edge裝置分開會模擬實際的部署案例,並協助讓概念保持清楚。 使用快速入門文章將 程式碼部署至 Linux 裝置 ,在 Azure 中建立 IoT Edge 裝置,或使用 Azure Resource Manager 範本來部署已啟用 IoT Edge 的 VM。
雲端資源:
- 使用免費版或標準版的 Azure IoT Hub。
如果您沒有 Azure 帳戶,請在開始之前建立 免費帳戶 。
秘訣
如需 Visual Studio Code 或 Visual Studio 2022 中互動式偵錯的指引:
- 使用 Visual Studio Code 對 Azure IoT Edge 模組進行偵錯 (英文)
- 使用 Visual Studio 2022 來開發適用於 Azure IoT Edge 的模組,並對其進行偵錯 (英文)
本教學課程涵蓋Visual StudioCode的開發步驟。
重要概念
本教學課程會逐步解說開發IoT Edge模組。 IoT Edge 模組是具有可執行程式碼的容器。 您可以在 IoT Edge 裝置中部署一或多個模組。 模組會執行特定工作,例如從感測器擷取數據、清除和分析數據,或將訊息傳送至IoT中樞。 如需詳細資訊,請參閱了解 Azure IoT Edge 模組。
當您開發 IoT Edge 模組時,您應該瞭解開發機器與模組部署的目標 IoT Edge 裝置之間的差異。 您建置以保存模組程式碼的容器必須符合目標裝置的作業系統 (OS)。 例如,最常見的案例是在 Windows 計算機上開發模組,以以執行 IoT Edge 的 Linux 裝置為目標。 在此情況下,容器作系統是Linux。 當您進行本教學課程時,請牢記「開發機器 OS」和「容器 OS」之間的差異。
秘訣
如果您使用 Windows 版 Linux 的 IoT Edge,案例中的目標裝置是 Linux 虛擬機器,而不是 Windows 主機。
本教學課程以使用 Linux 容器執行 IoT Edge 的裝置為適用對象。 只要開發機器執行 Linux 容器,就使用您慣用的作系統。 建議使用 Visual Studio Code 使用 Linux 容器進行開發,因此本教學課程會使用它。 您也可以使用 Visual Studio,但這兩種工具的支援有所差異。
下表列出 Visual Studio Code 和 Visual Studio 中 Linux 容器支援的開發案例。
| Visual Studio Code | Visual Studio 2019/2022 | |
|---|---|---|
| Linux 裝置架構 | Linux的AMD64 Linux ARM32v7 Linux的ARM64 |
Linux的AMD64 Linux ARM32 Linux的ARM64 |
| Azure 服務 | Azure 函數 Azure 串流分析 Azure Machine Learning |
|
| 語言 | C C# 爪哇島 Node.js Python |
C C# |
| 詳細資訊 | 適用於 Visual Studio Code 的 Azure IoT Edge |
適用於 Visual Studio 2019 的 Azure IoT Edge 工具 適用於 Visual Studio 2022 的 Azure IoT Edge 工具 |
安裝容器引擎
IoT Edge 模組會封裝為容器,因此開發機器上必須有相容於 Docker 的容器管理系統才能建置和管理容器。 Docker Desktop 是開發的熱門選擇,因為它具有強大的功能支援。 Windows 上的 Docker Desktop 可讓您在 Linux 容器與 Windows 容器之間切換,以便開發不同類型的 IoT Edge 裝置模組。
使用 Docker 文件在開發電腦上安裝 Docker:
安裝適用於 Windows 的 Docker Desktop。 當您安裝適用於 Windows 的 Docker Desktop 時,系統會詢問您是要使用 Linux 還是 Windows 容器。 您可以隨時變更此設定。 本教學課程使用 Linux 容器,因為模組是以 Linux 裝置為目標。 如需詳細資訊,請參閱在 Windows 與 Linux 容器之間切換。
閱讀關於 Docker CE 來獲得數個 Linux 平台的安裝資訊。 針對適用於 Linux 的 Windows 子系統 (WSL),請安裝適用於 Windows 的 Docker 桌面。
設定工具
安裝以 Python 為基礎的 Azure IoT Edge 開發人員工具,以建立 IoT Edge 解決方案。 您有兩個選擇:
- 使用慣用的預先建置 IoT Edge 開發容器。
- 使用 iotedgedev 開發安裝程式來安裝工具。
重要事項
適用於 Visual Studio Code 的 Azure IoT Edge 工具擴充功能目前是維護模式。 慣用的開發工具是命令列 (CLI) Azure IoT Edge 開發人員工具。
使用適用於 Visual Studio Code 的 IoT 擴充功能來開發 IoT Edge 模組。 這些延伸模組提供專案範本、自動化建立部署指令清單,並讓您監視和管理IoT Edge裝置。 在本節中,您會安裝 Visual Studio Code 和 IoT 擴充功能,然後設定 Azure 帳戶以便從 Visual Studio Code 內部管理 IoT 中樞資源。
- 安裝 Azure IoT Edge 延伸模組。
- 安裝 Azure IoT 中樞延伸模組。
- 安裝延伸模組之後,請選取 [檢視 > 命令面板] 來開啟命令面板。
- 在命令選擇區中,搜尋並選取 [Azure IoT 中樞:選取 IoT 中樞]。 遵循提示來選取 Azure 訂用帳戶和 IoT 中樞。
- 選取活動列中的圖示或選取 [檢視] > [總管],以開啟 Visual Studio Code 的 [總管] 區段。
- 在 [總管] 區段底部,將摺疊的 [Azure IoT 中樞/裝置] 功能表展開。 您會看到與透過命令選擇區選取的 IoT 中樞相關聯的裝置和 IoT Edge 裝置。
安裝語言特定工具
安裝您正在開發之語言的特定工具:
建立容器登錄庫
在本教學課程中,您會使用 Azure IoT Edge 和 Azure IoT 中樞 延伸模組來建置模組,並從檔案建立容器映像。 然後,您將此映像推送到儲存和管理映像的登錄。 最後,您會從登錄部署該映像,以在 IoT Edge 裝置上執行。
重要事項
Azure IoT Edge Visual Studio Code 延伸模組目前處於維護模式。
您可以使用任何與 Docker 相容的登錄來保存容器映像。 兩個熱門 Docker 登錄服務為 Azure Container Registry 和 Docker Hub。 本教學課程使用的是 Azure Container Registry。
如果您還沒有容器登錄,請依照下列步驟在 Azure 中建立新的容器登錄:
在 Azure 入口網站中,選取 [建立資源]>[容器]>[容器登錄]。
提供下列所需值,以建立您的容器登錄:
欄位 值 訂用帳戶 從下拉式清單中選取訂用帳戶。 資源群組 針對您在 IoT Edge 快速入門和教學課程期間建立的所有測試資源使用相同的資源群組;例如, IoTEdgeResources。 登錄名稱 提供唯一名稱。 地點 選擇接近您的位置。 SKU 選取 [基本]。 選取 [檢閱 + 建立],然後選取 [建立]。
從 Azure 入口網站首頁的 [資源] 區段選取新的容器登錄以加以開啟。
在容器登錄的左窗格中,從 [設定] 底下的功能表選取 [存取金鑰]。
使用切換按鈕啟用 [管理使用者],並檢視容器登錄的 使用者名稱和密碼。
複製 [登入伺服器]、[使用者名稱] 及 [密碼] 的值,並將這些值儲存在便於使用的地方。 在這整個教學課程中,您會使用這些值來提供容器登錄的存取權。
建立新的模組專案
Azure IoT Edge 延伸模組會針對 Visual Studio Code 中所有支援的 IoT Edge 模組語言,提供專案範本。 這些範本包含部署工作模組以測試 IoT Edge 所需的所有檔案和程式碼,或提供您以自己的商業規則自定義範本的起點。
建立專案範本
IoT Edge 開發工具可簡化 Azure IoT Edge 開發,並由環境變數驅動命令。 它可協助您使用 IoT Edge 開發容器和 IoT Edge 解決方案框架開始 IoT Edge 開發,其中包含預設模組和所有必要的組態檔。
在您想要的路徑上,為您的解決方案建立目錄。 變更至您的
iotedgesolution目錄。mkdir c:\dev\iotedgesolution cd c:\dev\iotedgesolution使用命令
iotedgedev solution init來建立解決方案,並以您選擇的開發語言設定 Azure IoT 中樞:iotedgedev solution init --template csharp
此 iotedgedev solution init 命令會提示您完成數個步驟,包括:
- 向 Azure 驗證
- 選擇 Azure 訂用帳戶
- 選擇或建立資源群組
- 選擇或建立 Azure IoT 中樞
- 選擇或建立 Azure IoT Edge 裝置
使用 Visual Studio Code 和 Azure IoT Edge 延伸模組。 從建立解決方案開始,然後在該解決方案中產生第一個模組。 每個解決方案都可以包含多個模組。
- 選取「檢視>命令面板」。
- 在命令選擇區中,輸入並執行命令 Azure IoT Edge: New IoT Edge Solution。
- 流覽至您要建立新解決方案的資料夾,然後選取 [ 選取資料夾]。
- 輸入解決方案的名稱。
- 選取適用於您慣用開發語言的模組範本,作為解決方案中的第一個模組。
- 輸入模組的名稱。 選擇容器登錄內唯一的名稱。
- 輸入模組映像存放庫的名稱。 Visual Studio Code 會自動以 localhost:5000/<您的模組名稱>填入模組名稱。 請使用您自己的登錄資訊加以取代。 如果您使用本機 Docker 登錄來進行測試,請使用 localhost。 如果您使用 Azure Container Registry,請使用登錄設定中的 登入伺服器 。 登入伺服器看起來會像 <登錄名稱>.azurecr.io。 只取代字串的 localhost:5000 部分,讓最終結果看起來像 <registry name.azurecr.io/><your module name>。
Visual Studio Code 會採用您提供的資訊、建立 IoT Edge 解決方案,然後將其載入至新的視窗。
建立方案之後,這些主要檔案會位於解決方案中:
.vscode 資料夾包含組態檔 launch.json。
modules 資料夾具有每個模組的子資料夾。 在每個子資料夾中,module.json 檔案會控制模組的建置和部署方式。
.env 檔案會列出您的環境變數。 容器登錄的環境變數預設為 localhost:5000。
兩個模組部署檔案 ,deployment.template.json 和 deployment.debug.template.json,列出要部署至裝置的模組。 根據預設,清單包含 IoT Edge 系統模組 (edgeAgent 和 edgeHub) 和範例模組,例如:
- filtermodule 是實作簡單篩選函式的範例模組。
- SimulatedTemperatureSensor 模組會模擬可用於測試的數據。 如需部署資訊清單運作方式的詳細資訊,請參閱了解如何使用部署資訊清單以部署模組和建立路由。 如需模擬溫度模組運作方式的詳細資訊,請參閱 SimulatedTemperatureSensor.csproj 原始程式碼。
附註
安裝的確切模組取決於您選擇的語言。
設定 IoT Edge 執行階段版本
最新的穩定 IoT Edge 系統模組版本為 1.5。 將您的系統模組設定為 1.5 版。
在 Visual Studio Code 中,開啟 deployment.template.json 部署資訊清單檔。 部署資訊清單是一份 JSON 文件,其中描述要在目標 IoT Edge 裝置上設定的模組。
變更系統執行階段模組映像
edgeAgent和edgeHub的執行階段版本。 例如,如果您想要使用 IoT Edge 執行階段 1.5 版,請在部署資訊清單檔中變更下列幾行:"systemModules": { "edgeAgent": { "image": "mcr.microsoft.com/azureiotedge-agent:1.5", "edgeHub": { "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
對 IoT Edge 代理程式提供登錄認證
環境檔案會儲存容器登錄的認證,並與 IoT Edge 執行階段共用這些認證。 運行時間需要這些認證,才能將容器映像提取到IoT Edge裝置。
IoT Edge 擴充功能會嘗試從 Azure 提取您的容器登錄認證,並將這些認證填入到環境檔案中。
附註
環境檔案只會在您為模組提供了映像存放庫時才會建立。 如果您接受 localhost 預設值,並且在本機進行測試和偵錯,則不需要宣告環境變數。
檢查您的認證是否存在。 如果沒有,請立即新增:
如果您的登錄是 Azure Container Registry,請設定 Azure Container Registry 使用者名稱和密碼。 從 Azure 入口網站內容器登錄的 [設定]>[存取金鑰] 選單取得這些值。
開啟模組解決方案中的 .env 檔案。
新增您從 Azure Container Registry 複製過來的 [使用者名稱] 和 [密碼] 值。 例如:
CONTAINER_REGISTRY_SERVER="myacr.azurecr.io" CONTAINER_REGISTRY_USERNAME="myacr" CONTAINER_REGISTRY_PASSWORD="<registry_password>"將變更儲存至 .env 檔案。
附註
本教學課程使用適用於開發和測試案例的 Azure Container Registry 系統管理員認證。 當您準備好進行生產案例時,建議您使用最低權限的驗證選項,例如服務主體或存放庫範圍的權杖。 如需詳細資訊,請參閱管理您容器登錄的存取權。
目標架構
選取您以每個解決方案為目標的架構,因為這會影響容器的建置和執行方式。 預設值為 Linux AMD64。 在本教學課程中,請使用Ubuntu虛擬機作為IoT Edge裝置,並保留預設 amd64。
如果您需要變更解決方案的目標架構,請遵循下列步驟。
- 開啟命令選項板並搜尋 Azure IoT Edge:設定 Edge 解決方案的預設目標平台,或選取視窗底部側邊欄中的快捷方式圖示。
- 在命令選擇區中,從選項清單中選取目標架構。
當您在稍後的步驟中建立容器映像時,會設定目標結構。
使用自訂程式碼來更新模組
每個範本都包含從 SimulatedTemperatureSensor 模組取得模擬感測器數據的範例程式代碼,並將它路由傳送至 IoT 中樞。 範例模組會接收訊息並傳遞訊息。 管線功能顯示IoT Edge中的重要概念:模組如何彼此通訊。
每個模組都可以在其程序代碼中宣告多個輸入和輸出佇列。 在裝置上執行的IoT Edge中樞會將訊息從一個模組的輸出路由傳送至一或多個模組的輸入。 宣告輸入和輸出的特定程式代碼會因語言而異,但所有模組的概念都相同。 如需模組之間路由方式的詳細資訊,請參閱宣告路由。
專案範本隨附的範例 C# 程式碼會使用適用於 .NET 的 IoT 中樞 SDK 中的 ModuleClient 類別 。
在 Visual Studio Code 資源管理器中,開啟 模組 > filtermodule > ModuleBackgroundService.cs。
在
filtermodule命名空間之前,針對稍後使用的類型新增三個using陳述式:using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvert將變數
temperatureThreshold新增至ModuleBackgroundService類別。 此變數會設定測量溫度必須超過的值,才能將數據傳送至IoT中樞。static int temperatureThreshold { get; set; } = 25;新增
MessageBody、Machine和Ambient類別。 這些類別會定義內送郵件本文的預期結構描述。class MessageBody { public Machine machine {get;set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} }尋找
ExecuteAsync函式。 此函式會建立並設定物件ModuleClient,讓模組連線到本機 Azure IoT Edge 執行階段,以傳送和接收訊息。 建立ModuleClient之後,程式碼會從模組雙胞胎的期望屬性中讀取temperatureThreshold值。 程式碼會註冊回呼,以透過名為input1的端點從 IoT Edge 中樞接收訊息。使用更新端點名稱的新方法和輸入到達時呼叫的方法,取代呼叫
ProcessMessageAsync方法。 此外,新增SetDesiredPropertyUpdateCallbackAsync更新所需屬性的方法。 若要進行此變更,請將方法的ExecuteAsync最後一行取代為下列程式碼:// Register a callback for messages that are received by the module. // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken); // Read the TemperatureThreshold value from the module twin's desired properties var moduleTwin = await _moduleClient.GetTwinAsync(); await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient); // Attach a callback for updates to the module twin's desired properties. await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null); // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method. await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);將方法
OnDesiredPropertiesUpdate新增至ModuleBackgroundService類別。 這個方法會從模組雙胞胎接收所需屬性值的更新,並更新temperatureThreshold變數使其一致。 所有模組都具有自己的模組對應項,這可讓您直接從雲端設定於模組內執行的程式碼。static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext) { try { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); if (desiredProperties["TemperatureThreshold"]!=null) temperatureThreshold = desiredProperties["TemperatureThreshold"]; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", exception); } } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", ex.Message); } return Task.CompletedTask; }新增
FilterMessages方法。 每當模組從 IoT Edge 中樞接收到訊息時,就會呼叫此方法。 它會篩選所報告溫度低於 (透過模組對應項所設定) 之溫度閾值的訊息。 此外,它還會將MessageType屬性新增到訊息中,並將其值設為Alert:async Task<MessageResponse> FilterMessages(Message message, object userContext) { var counterValue = Interlocked.Increment(ref _counter); try { ModuleClient moduleClient = (ModuleClient)userContext; var messageBytes = message.GetBytes(); var messageString = Encoding.UTF8.GetString(messageBytes); Console.WriteLine($"Received message {counterValue}: [{messageString}]"); // Get the message body. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " + $"exceeds threshold {temperatureThreshold}"); using (var filteredMessage = new Message(messageBytes)) { foreach (KeyValuePair<string, string> prop in message.Properties) { filteredMessage.Properties.Add(prop.Key, prop.Value); } filteredMessage.Properties.Add("MessageType", "Alert"); await moduleClient.SendEventAsync("output1", filteredMessage); } } // Indicate that the message treatment is completed. return MessageResponse.Completed; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", exception); } // Indicate that the message treatment is not completed. var moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); // Indicate that the message treatment is not completed. ModuleClient moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } }儲存 ModuleBackgroundService.cs 檔案。
在 Visual Studio Code 總管中,於 IoT Edge 解決方案工作區開啟 deployment.template.json 檔案。
由於我們已變更模組接聽的端點名稱,因此也需要在部署資訊清單中更新路由,讓 edgeHub 將訊息傳送至新的端點。
在$edgeHub模組雙胞胎中尋找
routes。 更新sensorTofiltermodule路由,將input1替換為inputFromSensor:"sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"將 filtermodule 模組對應項新增至部署資訊清單。 在
modulesContent區段底部,於 $edgeHub 模組對應項後面插入下列 JSON 內容:"filtermodule": { "properties.desired":{ "TemperatureThreshold":25 } }儲存 deployment.template.json 檔案。
建置並推送解決方案
您已更新模組程式碼和部署範本,以幫助了解一些重要的部署概念。 現在,您已準備好建置您的模組容器映像,並將其推送至容器登錄。
在 Visual Studio Code 中,開啟 deployment.template.json 部署資訊清單檔。
部署資訊清單描述要在目標 IoT Edge 裝置上設定的模組。 部署之前,您必須使用適當的 createOptions 值來更新 Azure Container Registry 認證和模組映像。 如需值 createOptions 的詳細資訊,請參閱如何設定 IoT Edge 模組的容器建立選項 (部分機器翻譯)。
如果您使用 Azure Container Registry 來儲存模組映像,請將您的認證 modulesContent > edgeAgent > settings > registryCredentials 新增至 deployment.template.json中的區段。 替換 myacr 為您自己的註冊表名稱並提供您的密碼和登入伺服器位址。 例如:
"registryCredentials": {
"myacr": {
"username": "myacr",
"password": "<your_acr_password>",
"address": "myacr.azurecr.io"
}
}
將下列字串化後的內容新增或替換至列出之每個系統(edgeHub 和 *edgeAgent)及自訂模組(filtermodule 和 tempSensor)的createOptions值。 如有必要,請變更值:
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
例如, filtermodule 配置應類似於:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
組建模組 Docker 映像
選取 [終端機 > ] [新增終端機] 來開啟 Visual Studio Code 整合式終端機。
使用 dotnet publish 命令來建置適用於 Linux 和 amd64 結構的容器映像。 將目錄變更為專案中的 filtermodule 目錄,然後執行命令 dotnet publish 。
dotnet publish --os linux --arch x64 /t:PublishContainer
目前, iotedgedev 工具範本會以 .NET 7.0 為目標。 如果您想要以不同版本的 .NET 為目標,您可以編輯 filtermodule.csproj 檔案,並變更 TargetFramework 和 PackageReference 值。 例如,若要以 .NET 8.0 為目標,您的 filtermodule.csproj 檔案看起來應該像這樣:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
</Project>
使用您的容器登錄資訊、版本和結構標記 Docker 映像。 替換 myacr 以您自己的登記冊名稱:
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64
發送模組 Docker 映像
對 Docker 提供容器登錄的認證,使其可以推送您的容器映像以儲存在登錄中。
使用 Azure Container Registry (ACR) 認證登入 Docker:
docker login -u <ACR username> -p <ACR password> <ACR login server>您可能會收到安全性警告,建議您使用
--password-stdin。 雖然這是適用於生產案例的建議最佳做法,但是這不在本教學課程的討論範圍內。 如需詳細資訊,請參閱 docker login 參考。登入 Azure Container Registry。 您必須 安裝 Azure CLI 才能使用命令
az。 此命令會請求您在 設定 > 存取金鑰 中的容器註冊表中找到的使用者名稱和密碼。az acr login -n <ACR registry name>秘訣
如果您在本教學課程中的任何時間點登出,請重複 Docker 和 Azure Container Registry 的登入步驟以繼續進行。
將模組映像推送至本機登錄或容器登錄:
docker push <ImageName>例如:
# Push the Docker image to the local registry docker push localhost:5000/filtermodule:0.0.1-amd64 # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name. az acr login --name myacr docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
更新部署範本
使用容器登錄映像位置更新部署範本 deployment.template.json。 例如,如果您使用 Azure 容器登錄 myacr.azurecr.io ,且映像是 filtermodule:0.0.1-amd64,請將設定更新 filtermodule 為:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
}
在 Visual Studio Code 總管中,以滑鼠右鍵按一下 deployment.template.json 檔案,然後選取 [建置並推送 IoT Edge 解決方案]。
建置和推送命令會啟動三項作業。 首先,它會在解決方案中建立名為 config 的新資料夾,以保存完整部署資訊清單 (根據部署範本中的資訊建立),以及其他解決方案檔案。 接著,它會執行 docker build,以根據目標架構的適當 dockerfile 建置容器映像。 然後,它會執行 docker push 以將映像存放庫推送至您的容器登錄。
第一次可能需要幾分鐘的時間,但下次執行命令時會更快。
選用: 更新模組和映像
如果您變更模組程式碼,則必須重建模組映像並將其推送至容器登錄。 使用本節中的步驟來更新組建和容器映像。 如果您未對模組程式碼進行任何變更,則可以略過本節。
在新建立的 config 資料夾中開啟 deployment.amd64.json 檔案。 檔案名稱會反映目標架構,因此如果您選擇不同的結構,就會有不同的檔案名稱。
請注意,有預留位置的兩個參數現在會包含適當的值。 該 registryCredentials 部分包含從 .env 檔案中提取的註冊表使用者名稱和密碼。
filtermodule 包含從 module.json 檔案中取得的名稱、版本和架構標籤的完整映像儲存庫。
開啟 filtermodule 資料夾中的 module.json 檔案。
變更模組映像的版本號碼。 例如,將修補檔號碼遞增
"version": "0.0.2",就如同我們在模組程式碼中進行了些許修正。秘訣
模組版本會啟用版本控制,並允許您在將更新部署至生產環境之前,在一小部分裝置上測試變更。 如果您沒有先遞增模組版本再進行建置和推送,則會覆寫容器登錄中的存放庫。
將變更儲存至 module.json 檔案。
使用 0.0.2 版本標籤建置並推送更新的映像。 例如,若要建置本機登錄或 Azure 容器登錄的映像並加以推送,請使用下列命令:
# Build the container image for Linux and amd64 architecture.
dotnet publish --os linux --arch x64
# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.
docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64
# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64
再次以滑鼠右鍵按一下 deployment.template.json 檔案,然後再次選取 [建置並推送 IoT Edge 解決方案 ]。
再次開啟 deployment.amd64.json 檔案。 請注意,當您再次執行建置和推送命令時,建置系統並未建立新的檔案。 相反地,系統會更新同一個檔案以反映變更。 filtermodule 映像現在會指向容器的 0.0.2 版本。
若要進一步確認建置和推送命令會做些什麼,請移至 Azure 入口網站並瀏覽至容器登錄。 在容器登錄中,依序選取 [存放庫] 和 [filtermodule]。 確認映像的這兩個版本皆會推送至登錄。
疑難排解
如果您在建置和推送模組映像時遇到錯誤,原因往往與開發機器上的 Docker 設定有關。 請使用下列檢查來檢閱您的設定:
- 您是否使用從容器登錄複製的認證來執行
docker login命令? 這些認證與您用來登入 Azure 的認證不同。 - 您的容器存放庫是否正確? 其是否有正確的容器登錄名稱和正確的模組名稱? 開啟 filtermodule 資料夾中的 module.json 檔案來進行檢查。 存放庫值應類似於<註冊表名稱>.azurecr.io/filtermodule。
- 如果您為模組使用不同於 filtermodule 的名稱,該名稱在整個解決方案中是否保持一致?
- 機器所執行的容器類型是否與所建置的容器類型相同? 本教學課程適用於 Linux 的 IoT Edge 裝置,因此 Visual Studio Code 應該要在提要欄位中顯示 amd64 或 arm32v7,且 Docker Desktop 應該執行 Linux 容器。
將模組部署到裝置
您已確認所建置的容器映像儲存在容器登錄中,因此可以開始將這些映像部署到裝置。 請確定您的 IoT Edge 裝置已啟動並執行。
使用 IoT Edge Azure CLI set-modules 命令將模組部署至 Azure IoT 中樞。 例如,若要將 deployment.template.json 檔案中定義的模組部署至 IoT Edge 裝置 my-device 的 IoT 中樞 my-iot-hub,請使用下列命令。 將 hub-name、 device-id 和 登入 IoT 中樞連接字串值取代為您自己的值。
az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"
秘訣
在 Azure 入口網站中尋找 IoT 中樞連接字串,包括共用存取密鑰。 移至您的 IoT 中樞,然後選取 [ 安全性設定 > ] [共用存取原則 > iothubowner]。
在 Visual Studio Code 總管中,展開 [Azure IoT 中樞] 區段下的 [裝置] 來查看您的 IoT 裝置清單。
以滑鼠右鍵按一下要作為部署目的地的 IoT Edge 裝置,然後選取 [建立單一裝置的部署]。
在檔案總管中,瀏覽至 config 資料夾,然後選取 deployment.amd64.json 檔案。
請勿使用 deployment.template.json 檔案,其並未內含容器登錄認證或模組映像值。 如果您以 Linux ARM32 裝置作為目標,則部署資訊清單的名稱為 deployment.arm32v7.json。
請展開裝置下的模組,以查看已部署且執行中的模組清單。 選取 [重新整理] 按鈕。 您應該會看到新的 tempSensor 和filtermodule 模組在您的裝置上執行。
模組可能需要幾分鐘的時間才能啟動。 IoT Edge 運行時間會收到新的部署指令清單、從容器運行時間提取模組映像,然後啟動每個新模組。
檢視裝置的訊息
範例模組程式代碼會透過其輸入佇列取得訊息,並透過其輸出佇列傳送訊息。 部署指令清單會設定從tempSensor將訊息傳送至 filtermodule 的路由,然後將訊息從 filtermodule 轉送至 IoT 中樞。 Azure IoT Edge 和 Azure IoT 中樞擴充功能可讓您在訊息從您的裝置抵達 IoT 中樞時看到訊息。
在 Visual Studio Code 總管中,選取您要監視的 IoT Edge 裝置,然後選取 [開始監視內建事件端點]。
觀看 Visual Studio Code 中的輸出視窗,以查看訊息抵達 IoT 中樞。
檢視裝置上的變更
若要查看裝置上發生的情況,請使用本節中的命令來檢查裝置上執行的 IoT Edge 運行時間和模組。
這些命令適用於IoT Edge裝置,而不是您的開發電腦。 如果您對 IoT Edge 裝置使用虛擬機器,請立即與其連線。 在 Azure 中,移至虛擬機器的 [概觀] 頁面,然後選取 [連線] 以存取安全殼層連線。
檢視所有部署到裝置的模組,並檢查其狀態:
iotedge list您會看到四個模組:兩個 IoT Edge 運行時間模組,以及 tempSensor 和 filtermodule。 這四個模組應該都會列示為執行中狀態。
檢查特定模組的記錄:
iotedge logs <module name>模組名稱會區分大小寫。
tempSensor 和 filtermodule 記錄會顯示正在處理的訊息。 edgeAgent 模組會啟動其他模組,因此其記錄包含部署資訊清單的相關資訊。 如果未列出或未執行模組,請檢查edgeAgent記錄中是否有錯誤。 edgeHub 模組會管理模組與 IoT 中樞之間的通訊。 如果模組正在執行,但訊息未到達您的 IoT 中樞,請檢查 edgeHub 記錄是否有錯誤。
清除資源
如果您想要繼續閱讀下一篇文章,請保留您所建立的資源和組態,並重複使用它們。 您可以也繼續使用相同的 IoT Edge 裝置作為測試裝置。 否則,若要避免收費,請刪除本機設定和您在本文中使用的 Azure 資源。
刪除 Azure 資源
刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有資源群組內建立IoT中樞,且該資源群組具有您想要保留的資源,請只刪除IoT中樞資源本身,而不是資源群組。
若要刪除資源:
- 登入 Azure 入口網站,然後選取 [資源群組]。
- 選取您的 IoT Edge 測試資源所屬的資源群組名稱。
- 檢閱資源群組所包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。
後續步驟
在本教學課程中,您會在開發計算機上設定Visual Studio Code,並使用程式代碼部署第一個IoT Edge模組,以篩選IoT Edge裝置所產生的原始數據。
繼續進行下一個教學課程,以瞭解 Azure IoT Edge 如何讓您部署 Azure 雲端服務來處理和分析邊緣的數據。