練習 - 將 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,並更新為使用容器登錄中的篩選模組:
- 以您的容器登錄名稱取代
<YOUR CONTAINER REGISTRY NAME>
的三個執行個體。 名稱看起來就像edgecentral27912
。 - 以您先前在本單元中記下的密碼取代
<YOUR CONTAINER REGISTRY PASSWORD>
。 - 儲存變更。
此版本的部署資訊清單:
新增模組並添加您建立的 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\")" },
上傳新的部署資訊清單:
在您的 Azure IoT Central 應用程式中,移至 [Edge 資訊清單],然後選取 [環境感應器] 資訊清單。
在 [自訂] 頁面上,上傳新的 EnvironmentalSensorManifestFilter-1-4.json 檔案。 選取 [下一步] 。
[檢閱和完成] 頁面會顯示新的 filterfunction 模組。 選取 [儲存]。
從 [裝置] 頁面移至 [環境感應器 Edge 裝置 - store-001] 裝置,然後選取 [模組]。
在頁面頂端附近上,選取 [管理資訊清單 > 指派邊緣資訊清單]。 選取 [環境感應器] 資訊清單,然後選取 [指派資訊清單]。
模組清單現在包含執行中的 filterfunction 模組:
更新裝置範本以使用新的模組
IoT Edge 裝置現在會透過 [filterfunction] 介面傳送遙測,而不是 [遙測] 介面。 因此,您必須更新裝置範本和檢視。
在 [裝置範本] 上,選取 [環境感應器 Edge 裝置]。
選取 [模組],然後 [從資訊清單匯入模組]。
在 [匯入模組] 對話方塊中,選取 [環境感應器],然後選取 [匯入]。
新的模組現在會將遙測資料傳送至 Azure IoT Central。 接下來,將介面新增至新的篩選模組,以指定遙測並更新圖表。
- 選取 [Module FilterFunction],然後選取 [+ 新增繼承介面]。 您可能必須選取省略符號 ( [...]),才會看到此選項。
- 選擇 [匯入介面] 磚。 選取您先前下載的 TelemetryInterfaceFilter.json 檔案。
您可以移除原始的 Telemetry 介面,因為 SimulatedTemperatureModule 不會再直接將遙測資料傳送至 Azure IoT Central。 IoT Edge 執行階段會將此模組的輸出路由傳送至 FilterFunction 模組。
- 在 SimulatedTemperatureSensor 模組中選取 Telemetry 介面。
- 選取 [刪除],然後確認作業。
修改 [檢視 IoT Edge 裝置遙測] 檢視,以顯示 FilterFunction 模組所傳送的遙測資料。
- 在裝置範本中,選取 [檢視 IoT Edge 裝置遙測] 檢視,然後選取圖表磚上的 [編輯] 選項。
- 新增環境/溫度、濕度、機器/溫度和壓力遙測值。
- 選取 [更新],然後選取 [儲存]。
- 選取 [發佈],以發佈新版本的裝置範本。
檢查您的工作
若要從 IoT Edge 裝置檢視已篩選的遙測:
在 [裝置] 頁面上,選取 store-001 裝置。
選取 [檢視 IoT Edge 裝置遙測] 檢視。
您可以在圖表上看到篩選過的遙測。 沒有出現平均環境溫度低於 21.0 度的值。
如果裝置似乎停止傳送遙測資料,可能是因為 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)