練習 - 將 Azure 函數部署到 IoT Edge

已完成

篩選由裝置傳送的遙測。

回想一下,您想要將每個存放區所傳送的資料量降到最低。 為了減少傳送至 Azure IoT Central 應用程式的遙測量,您想要篩選 IoT Edge 裝置上的資料。

此處將使用 IoT Edge 裝置上執行的 Azure Functions 來實作篩選。 此篩選可確保當環境溫度高於 21°C 時,裝置只會傳送遙測。

注意

此練習為選擇性項目。 如果想要完成此練習,您必須先建立 Azure 訂用帳戶,再開始進行。 如果您沒有 Azure 帳戶,或者目前不想建立帳戶,您可以閱讀相關指示,以了解所呈現的資訊。

設定容器登錄

您的 IoT Edge 裝置需要下載並安裝可實作篩選的自訂 Azure Functions 模組。 IoT Edge 模組會封裝成可儲存在容器存放庫中的 Docker 相容映像。 您會使用 Azure Container Registry (ACR) 以儲存新的模組並從來源專案建置容器。

執行下列命令,以將容器登錄新增至 Azure 中的資源群組:

REGISTRY_NAME="edgecentral$RANDOM"
az acr create -n $REGISTRY_NAME -g <rgn>[sandbox resource group name]</rgn> --sku Standard --admin-enabled true
az acr credential show -n $REGISTRY_NAME
echo "Your registry name is: $REGISTRY_NAME"

請記下登錄名稱和 password 值,稍後會在本單元中使用。

建立 Azure Functions 專案

您正在使用 C# 實作函數。 執行下列命令以安裝專案範本,然後產生基本架構專案:

dotnet new -i Microsoft.Azure.IoT.Edge.Function
dotnet new aziotedgefunction -n FilterFunction -r $REGISTRY_NAME.azurecr.io/filterfunction
cd FilterFunction
ls

執行下列命令,以篩選機器溫度遙測的實作來取代現有的 FilterFunction

curl -O https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/iotedge/FilterFunction.cs

現在建立映像,並將其上傳至您的容器登錄。 此命令預期需要幾分鐘的時間來執行:

az acr build --registry $REGISTRY_NAME --image filterfunction:v1 -f Dockerfile.amd64 .

您可以使用下列命令列出登錄中的映像:

az acr repository list --name $REGISTRY_NAME

更新部署資訊清單

若要在 IoT Edge 裝置上使用新的篩選模組,請使用新版本更新部署清單。

以滑鼠右鍵按一下下列連結,然後選擇 [另存新檔],將新的部署資訊清單和介面定義下載到本機電腦:

在文字編輯器中開啟 EnvironmentalSensorManifestFilter-1-4.json,並更新為使用容器登錄中的篩選模組:

  1. 以您的容器登錄名稱取代 <YOUR CONTAINER REGISTRY NAME> 的三個執行個體。 名稱看起來就像 edgecentral27912
  2. 以您先前在本單元中記下的密碼取代 <YOUR CONTAINER REGISTRY PASSWORD>
  3. 儲存變更。

此版本的部署資訊清單:

  • 新增模組並添加您建立的 Azure 函式:

    "filterfunction": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "<YOUR CONTAINER REGISTRY NAME>.azurecr.io/filterfunction:v1",
        "createOptions": ""
      }
    
  • 在將已篩選的遙測資料傳送到您的 Azure IoT Central 應用程式之前,將 SimulatedTemperatureSensor 模組的輸出路由傳送至 filterfunction 模組:

    "routes": {
        "FilterFunctionToIoTCentral": "FROM /messages/modules/filterfunction/outputs/* INTO $upstream",
        "sensorToFilterFunction": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filterfunction/inputs/input1\")"
      },
    

上傳新的部署資訊清單:

  1. 在您的 Azure IoT Central 應用程式中,移至 [Edge 資訊清單],然後選取 [環境感應器] 資訊清單。

  2. [自訂] 頁面上,上傳新的 EnvironmentalSensorManifestFilter-1-4.json 檔案。 選取 [下一步] 。

  3. [檢閱和完成] 頁面會顯示新的 filterfunction 模組。 選取 [儲存]。

  4. 從 [裝置] 頁面移至 [環境感應器 Edge 裝置 - store-001] 裝置,然後選取 [模組]

  5. 在頁面頂端附近上,選取 [管理資訊清單 > 指派邊緣資訊清單]。 選取 [環境感應器] 資訊清單,然後選取 [指派資訊清單]

模組清單現在包含執行中的 filterfunction 模組:

螢幕擷取畫面顯示 IoT Edge 裝置上正在執行 FilterFunction 模組。

更新裝置範本以使用新的模組

IoT Edge 裝置現在會透過 [filterfunction] 介面傳送遙測,而不是 [遙測] 介面。 因此,您必須更新裝置範本和檢視。

  1. 在 [裝置範本] 上,選取 [環境感應器 Edge 裝置]

  2. 選取 [模組],然後 [從資訊清單匯入模組]

    螢幕擷取畫面顯示如何從資訊清單匯入模組。

  3. [匯入模組] 對話方塊中,選取 [環境感應器],然後選取 [匯入]

螢幕擷取畫面顯示 FilterFunction 模組已新增至裝置範本。

新的模組現在會將遙測資料傳送至 Azure IoT Central。 接下來,將介面新增至新的篩選模組,以指定遙測並更新圖表。

  1. 選取 [Module FilterFunction],然後選取 [+ 新增繼承介面]。 您可能必須選取省略符號 ( [...]),才會看到此選項。
  2. 選擇 [匯入介面] 磚。 選取您先前下載的 TelemetryInterfaceFilter.json 檔案。

您可以移除原始的 Telemetry 介面,因為 SimulatedTemperatureModule 不會再直接將遙測資料傳送至 Azure IoT Central。 IoT Edge 執行階段會將此模組的輸出路由傳送至 FilterFunction 模組。

  1. SimulatedTemperatureSensor 模組中選取 Telemetry 介面。
  2. 選取 [刪除],然後確認作業。

修改 [檢視 IoT Edge 裝置遙測] 檢視,以顯示 FilterFunction 模組所傳送的遙測資料。

  1. 在裝置範本中,選取 [檢視 IoT Edge 裝置遙測] 檢視,然後選取圖表磚上的 [編輯] 選項。
  2. 新增環境/溫度濕度機器/溫度壓力遙測值。
  3. 選取 [更新],然後選取 [儲存]
  4. 選取 [發佈],以發佈新版本的裝置範本。

檢查您的工作

若要從 IoT Edge 裝置檢視已篩選的遙測:

  1. 在 [裝置] 頁面上,選取 store-001 裝置。

  2. 選取 [檢視 IoT Edge 裝置遙測] 檢視。

    您可以在圖表上看到篩選過的遙測。 沒有出現平均環境溫度低於 21.0 度的值。

    螢幕擷取畫面顯示遙測圖,沒有任何平均環境溫度值小於 21 度。

如果裝置似乎停止傳送遙測資料,可能是因為 SimulatedTemperatureSensor 模組在傳送 500 個訊息之後停止。 如果您重新啟動虛擬機器,計數會重設,您會看到遙測資料再次傳送:

az vm restart --resource-group <rgn>[sandbox resource group name]</rgn> \
  --name $(az vm list --resource-group <rgn>[sandbox resource group name]</rgn> --query [0].name -o tsv)