共用方式為


教學課程:將 Azure Functions 部署為 IoT Edge 模組

適用於:IoT Edge 1.5 核取記號 Azure IoT Edge 1.5

重要事項

IoT Edge 1.5 LTS 是 支援的版本。 自 2024 年 11 月 12 日起,IoT Edge 1.4 LTS 已結束生命週期。 如果您使用的是舊版,請參閱 更新 IoT Edge

使用 Azure Functions 部署直接在 Azure IoT Edge 裝置上執行商業規則的程式碼。 本教學課程說明如何建立及部署 Azure 函式,以篩選模擬 IoT Edge 裝置上的感測器數據。 使用您在快速入門中建立的模擬 IoT Edge 裝置。 在本教學課程中,您會了解如何:

  • 使用 Visual Studio Code 來建立 Azure Function
  • 使用 Visual Studio Code 和 Docker 建立 Docker 映像,並將其發佈至容器登錄
  • 將模組從容器登錄部署至IoT Edge裝置
  • 檢視篩選的數據

顯示函式架構的圖表,包括如何暫存和部署函式模組。

您在本教學課程中建立的 Azure 函式會篩選裝置所產生的溫度數據。 函式只會在溫度高於指定的閾值時,將訊息上游傳送至 Azure IoT 中樞。

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

先決條件

開始本教學課程之前,請遵循教學課程來設定 Linux 容器開發的開發環境: 使用 Visual Studio Code 開發 Azure IoT Edge 模組。 當您完成時,您已具備下列必要條件:

若要使用 Azure Functions 開發 IoT Edge 模組,請在開發電腦上安裝下列額外的必要條件:

建立函式專案

適用於 Visual Studio Code 的 Azure IoT Edge 提供管理功能和程式代碼範本。 在本節中,您會使用 Visual Studio Code 建立具有 Azure 函式的 IoT Edge 解決方案。

建立新專案

請遵循下列步驟來建立可自定義的 C# 函式解決方案範本。

  1. 在您的開發電腦上開啟 Visual Studio Code。

  2. 選取 [檢視]> [命令選擇區],以開啟 Visual Studio Code 命令選擇區。

  3. 在命令選擇區中,新增並執行 命令 Azure IoT Edge:新的 IoT Edge 解決方案。 依照命令選擇區中的這些提示建立解決方案:

    • 選取資料夾:選擇開發機器上可供 Visual Studio Code 建立解決方案檔案的位置。
    • 提供解決方案名稱:為您的解決方案新增描述性名稱,例如 FunctionSolution 或接受預設值。|
    • 選取模組範本:選擇 [Azure Functions - C#]
    • 提供模組名稱 |將您的模組命名為 CSharpFunction
    • 提供模組的 Docker 映像存放庫。 映像存放庫包含容器登錄名稱和容器映像名稱。 系統會預先填入上一個步驟的容器映像。 將 localhost:5000 替換成 Azure 容器登錄中的 登入伺服器的值。 您可以從 Azure 入口網站的容器登錄 [概覽] 頁面中取得登入伺服器。 最終字串看起來會類似於:<登錄名稱>.azurecr.io/csharpfunction。

    顯示 Visual Studio Code 中新增 Docker 映像存放庫名稱位置的螢幕快照。

新增登錄認證

解決方案中的環境檔案會儲存容器註冊表的認證,並與 IoT Edge 執行環境共用這些認證。 執行階段需要有這些認證才能將您的私人映像提取到 IoT Edge 裝置。

Visual Studio Code 中的 IoT Edge 擴充功能會嘗試從 Azure 提取您的容器登錄認證,並將這些認證填入到環境檔案中。 檢查您的認證是否已經在檔案中。 如果沒有,請立即新增:

  1. 在 Visual Studio Code 總管中,開啟 .env 檔案。
  2. 使用您從 Azure 容器登錄複製的使用者名稱和密碼值來更新欄位。 若要再次尋找它們,請移至 Azure 中的容器登錄,並查看 [ 設定>存取金鑰 ] 頁面。
  3. 儲存這個檔案。

附註

本教學課程會針對 Azure Container Registry 使用系統管理員登入認證,可便於開發和測試案例使用。 針對生產環境,請使用最低權限驗證選項,例如服務主體。 如需詳細資訊,請參閱 管理容器登錄的存取權。

將目標架構設定為 AMD64

IoT Edge 上的 Azure Functions 模組僅支援 Linux AMD64 型容器。 Visual Studio Code 的預設目標架構是 Linux AMD64,但您在這裡明確將其設定為 Linux AMD64。

  1. 開啟命令選擇區並搜尋 Azure IoT Edge:設定 Edge 解決方案的預設目標平臺

  2. 在命令選擇區中,從選項清單中選取 AMD64 目標架構。

使用自訂程式碼來更新模組

新增一些程式代碼,讓您的 CSharpFunction 模組在將訊息轉送至 IoT 中樞之前,先處理邊緣的訊息。

  1. 在 Visual Studio Code 總管中,開啟 [模組]>[CSharpFunction]>[CSharpFunction.cs]

  2. 使用下列程式代碼取代 CSharpFunction.cs 檔案的內容。 此程式代碼會接收有關環境與計算機溫度的遙測數據,並且只有在機器溫度高於定義的閾值時,才會將訊息轉送至IoT中樞。

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.EdgeHub;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    
    namespace Functions.Samples
    {
        public static class CSharpFunction
        {
            [FunctionName("CSharpFunction")]
            public static async Task FilterMessageAndSendMessage(
                [EdgeHubTrigger("input1")] Message messageReceived,
                [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output,
                ILogger logger)
            {
                const int temperatureThreshold = 20;
                byte[] messageBytes = messageReceived.GetBytes();
                var messageString = System.Text.Encoding.UTF8.GetString(messageBytes);
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    logger.LogInformation("Info: Received one non-empty message");
                    // Get the body of the message and deserialize it.
                    var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
                    if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
                    {
                        // Send the message to the output as the temperature value is greater than the threshold.
                        using (var filteredMessage = new Message(messageBytes))
                        {
                             // Copy the properties of the original message into the new Message object.
                             foreach (KeyValuePair<string, string> prop in messageReceived.Properties)
                             {filteredMessage.Properties.Add(prop.Key, prop.Value);}
                             // Add a new property to the message to indicate it is an alert.
                             filteredMessage.Properties.Add("MessageType", "Alert");
                             // Send the message.
                             await output.AddAsync(filteredMessage);
                             logger.LogInformation("Info: Received and transferred a message with temperature above the threshold");
                        }
                    }
                }
            }
        }
        //Define the expected schema for the body of incoming messages.
        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;}
        }
    }
    
  3. 儲存檔案。

建置和推送 IoT Edge 解決方案

在上一節中,您已建立IoT Edge解決方案,並變更 CSharpFunction ,以篩選出報告機器溫度低於可接受閾值的訊息。 現在,將解決方案建置為容器映射,並將其推送至您的容器登錄。

  1. 開啟 Visual Studio Code 整合式終端機。 選取 [檢視]> [終端機]

  2. 在終端機中登入 Docker。 使用來自 Azure 容器登錄的使用者名稱、密碼和登入伺服器。 從 Azure 入口網站中登錄的 [存取金鑰 ] 區段取得這些值。

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    您可以收到建議使用 --password-stdin的安全性警告。 雖然建議生產案例使用該最佳做法,但是不在本教學課程的討論範圍內。 如需詳細資訊,請參閱 docker 登入 參考。

  3. 在 Visual Studio Code 總管中,以滑鼠右鍵按兩下 deployment.template.json 檔案,然後選取 [建置並推送 IoT Edge 解決方案]。

    建置和推送命令會啟動三項作業。 首先,它會在名為 config 的解決方案中建立新的資料夾,其中包含完整的部署指令清單,此指令清單是從部署範本和其他解決方案檔案建置的。 其次,它會執行 docker build ,根據目標架構的適當 Dockerfile 來建置容器映像。 然後,它會執行 docker push 以將映像存放庫推送至您的容器登錄。

    此程式第一次可能需要幾分鐘的時間,但下次執行命令時會更快。

檢視容器映像

當容器映像推送至容器登錄時,Visual Studio Code 會顯示成功訊息。 若要確認操作,請在登錄檔中檢視影像。

  1. 在 Azure 入口網站中,前往您的 Azure 容器登錄中心。
  2. 選取 [服務]>[存放庫]
  3. 您會在清單中看到 csharpfunction 存放庫。 選取此存放庫以檢視更多詳細數據。
  4. 在 [ 標記] 區段中,您會看到 0.0.1-amd64 卷標。 此標籤會顯示您所建置映像的版本和平臺。 這些值是在 CSharpFunction 資料夾中的module.json 檔案中設定。

部署並執行解決方案

使用 Azure 入口網站,像在快速入門中一樣,將您的函式模組部署到 IoT Edge 裝置。 您也可以從 Visual Studio Code 部署和監視模組。 下列幾節會使用必要條件中所列的適用於 Visual Studio Code 的 Azure IoT Edge 和 IoT 中樞延伸模組。 如果您尚未安裝擴充功能,請立即安裝延伸模組。

  1. 在 Visual Studio Code 檢視器的 [Azure IoT Hub] 區段底下,展開 [裝置] 以查看 IoT 裝置清單。

  2. 以滑鼠右鍵按一下 IoT Edge 裝置的名稱,然後選取 [建立單一裝置的部署]

  3. 移至具有 CSharpFunction 的解決方案資料夾。 開啟組態資料夾,選取 deployment.amd64.json 檔案,然後選擇 [ 選取Edge部署指令清單]。

  4. 在您的裝置下,展開 [模組 ] 以查看已部署和執行的模組清單。 選取 [重新整理] 按鈕。 您可以看到新的 CSharpFunctionSimulatedTemperatureSensor 模組、 $edgeAgent$edgeHub一起執行。

    新模組可能需要一些時間才會顯示。 IoT Edge 裝置會從IoT中樞擷取其新的部署資訊、啟動新的容器,然後將狀態回報回IoT中樞。

    顯示如何在 Visual Studio Code 中檢視已部署模組的螢幕快照。

檢視所產生的資料

執行 Azure IoT 中樞:在命令選擇區中啟動監視內建事件端點 ,以查看從裝置抵達 IoT 中樞的所有訊息。 若要停止監視訊息,請在命令選擇區中執行 Azure IoT 中樞:停止監視內建事件端點

若要篩選檢視並查看來自特定裝置的訊息,請在 Visual Studio Code 總管的 [Azure IoT 中樞>裝置 ] 區段中,以滑鼠右鍵單擊裝置,然後選取 [ 開始監視內建事件端點]。

清除資源

如果您打算繼續閱讀下一篇文章,請保留您所建立的資源和組態,並重複使用它們。 您可以也繼續使用相同的 IoT Edge 裝置作為測試裝置。

否則,請刪除您在本文中建立的本機設定和 Azure 資源,以避免產生費用。

刪除 Azure 資源

刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有資源群組內建立IoT中樞,且該資源群組具有您想要保留的資源,請只刪除IoT中樞資源本身,而不是資源群組。

若要刪除資源:

  1. 登入 Azure 入口網站,然後選取 [資源群組]。
  2. 選取您的 IoT Edge 測試資源所屬的資源群組名稱。
  3. 檢閱資源群組所包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。

後續步驟

在本教學課程中,您已建立包含程式碼的 Azure 函式模組,可篩選您 IoT Edge 裝置所產生的原始資料。

請繼續進行後續教學課程,以了解 Azure IoT Edge 有什麼其他方法,可協助您將此資料轉換成具有優勢的商業見解。