Ejercicio: Implementación de una función de Azure en IoT Edge

Completado

Filtre la telemetría enviada por el dispositivo.

Recuerde que quiere minimizar la cantidad de datos enviados desde cada tienda. Para reducir la cantidad de telemetría enviada a la aplicación de Azure IoT Central, quiere filtrar los datos en el dispositivo IoT Edge.

Aquí, usará Azure Functions que se ejecuta en el dispositivo IoT Edge para implementar un filtro. El filtro garantiza que el dispositivo solo envía telemetría cuando la temperatura ambiente es superior a 21 ºC.

Nota:

Este ejercicio es opcional. Si le interesa completar este ejercicio, deberá crear una suscripción de Azure antes de empezar. Si no tiene una cuenta de Azure o no quiere crear una en este momento, puede leer las instrucciones para comprender la información que se está presentando.

Configuración de un registro de contenedor

El dispositivo IoT Edge debe descargar e instalar el módulo personalizado de Azure Functions que implementa el filtro. Los módulos de IoT Edge se empaquetan como imágenes compatibles con Docker que puede almacenar en un repositorio de contenedores. Use Azure Container Registry (ACR) para almacenar el nuevo módulo y para compilar el contenedor a partir de un proyecto de origen.

Ejecute los siguientes comandos para agregar un registro de contenedor al grupo de recursos en 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"

Anote el nombre del Registro y los valores de password para usarlos más adelante en esta unidad.

Creación de un proyecto de Azure Functions

Está usando C# para implementar la función. Ejecute los comandos siguientes para instalar la plantilla de proyecto y, a continuación, genere esqueleto de proyecto:

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

Ejecute el siguiente comando para reemplazar el archivo FilterFunction.cs existente por una implementación que filtre la telemetría de temperatura de la máquina:

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

Ahora cree la imagen y cárguela en el registro de contenedor. Es posible que este comando tarde un par de minutos en ejecutarse:

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

Puede enumerar las imágenes del registro con el comando siguiente:

az acr repository list --name $REGISTRY_NAME

Actualización del manifiesto de implementación

Para usar el nuevo módulo de filtro en el dispositivo IoT Edge, actualice el manifiesto de implementación con la nueva versión.

Para descargar el nuevo manifiesto de implementación y la definición de interfaz en la máquina local, haga clic con el botón derecho en los vínculos siguientes y elija Guardar como:

Abra el archivo EnvironmentalSensorManifestFilter-1-4.json en un editor de texto y actualícelo para usar el módulo de filtro del registro de contenedor:

  1. Reemplace las tres instancias de <YOUR CONTAINER REGISTRY NAME> por el nombre del registro de contenedor. El nombre es similar a edgecentral27912.
  2. Reemplace <YOUR CONTAINER REGISTRY PASSWORD> por la contraseña que anotó anteriormente en esta unidad.
  3. Guarde los cambios.

Esta versión del manifiesto de implementación:

  • Agrega el módulo con la función de Azure que creó:

    "filterfunction": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "<YOUR CONTAINER REGISTRY NAME>.azurecr.io/filterfunction:v1",
        "createOptions": ""
      }
    
  • Enruta la salida del módulo SimulatedTemperatureSensor al módulo filterfunction antes de enviar la telemetría filtrada a la aplicación de Azure IoT Central:

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

Para cargar el nuevo manifiesto de implementación:

  1. En la aplicación de Azure IoT Central, vaya a Manifiestos de Edge y seleccione el manifiesto Sensor ambiental.

  2. En la página Personalizar, cargue el nuevo archivo EnvironmentalSensorManifestFilter-1-4.json. Seleccione Next (Siguiente).

  3. En la página Revisar y finalizar se muestra el nuevo módulo filterfunction. Seleccione Guardar.

  4. Vaya al dispositivo Environmental Sensor Edge Device - store-001 desde la página Dispositivos y seleccione Modules.

  5. Cerca de la parte superior de la página, seleccione Administrar manifiesto> Asignar manifiesto perimetral. Seleccione el manifiesto de Sensor ambiental y, a continuación, seleccione Asignar manifiesto.

Ahora en la lista de módulos se incluye el módulo filterfunction en ejecución:

Captura de pantalla que muestra el módulo FilterFunction que se ejecuta en el dispositivo de IoT Edge.

Actualización de la plantilla de dispositivo para usar el nuevo módulo

El dispositivo IoT Edge ahora envía la telemetría mediante la interfaz filterfunction en lugar de la interfaz Telemetría. Por lo tanto, debe actualizar la plantilla de dispositivo y las vistas.

  1. En la página Plantillas de dispositivo, seleccione Dispositivo Edge del sensor ambiental.

  2. Seleccione Módulos y, después Importar módulos desde el manifiesto.

    Captura de pantalla que muestra cómo importar módulos desde el manifiesto.

  3. En el cuadro de diálogo Importar módulos, seleccione Sensor ambiental y después Importar.

Captura de pantalla que muestra el módulo FilterFunction agregado a la plantilla de dispositivo.

El nuevo módulo ahora envía la telemetría a Azure IoT Central. A continuación, agregue una interfaz al nuevo módulo de filtro que especifique la telemetría y actualice el gráfico.

  1. Seleccione Módulo FilterFunction y, luego, + Agregar una interfaz heredada. Es posible que tenga que seleccionar los puntos suspensivos (...) para ver esta opción.
  2. Elija el mosaico Importar una interfaz. Seleccione el archivo TelemetryInterfaceFilter.json que descargó anteriormente.

Puede quitar la interfaz original de Telemetría porque la SimulatedTemperatureModule ya no envía telemetría directamente a Azure IoT Central. La salida de este módulo se enruta al módulo FilterFunction por el entorno de ejecución de IoT Edge.

  1. Seleccione la interfaz de Telemetría en el módulo SimulatedTemperatureSensor.
  2. Seleccione Eliminar y confirme la operación.

Modifique la vista de telemetría del dispositivo IoT Edge para mostrar la telemetría enviada por el módulo FilterFunction.

  1. En la plantilla de dispositivo, seleccione la vista View IoT Edge device telemetry (Ver telemetría del dispositivo IoT Edge) y, a continuación, seleccione la opción Editar en el icono de gráfico.
  2. Agregue los valores de telemetría ambient/temperature, humidity, machine/temperature y pressure.
  3. Seleccione Actualizar y, a continuación, Guardar.
  4. Seleccione Publicar para publicar la nueva versión de la plantilla de dispositivo.

Comprobar el trabajo

Para ver la telemetría filtrada desde el dispositivo IoT Edge:

  1. En la página Dispositivos, seleccione el dispositivo store-001.

  2. Seleccione la vista Ver telemetría del dispositivo de IoT Edge.

    Puede ver la telemetría filtrada en el gráfico. No se muestran valores con una temperatura ambiente media menor que 21,0 grados.

    Captura de pantalla que muestra el gráfico de telemetría sin valores de temperatura ambiente medios menores que 21.

Si el dispositivo parece dejar de enviar telemetría, es probable que se deba a que el módulo SimulatedTemperatureSensor se detiene después de enviar 500 mensajes. Si reinicia la máquina virtual, el recuento se restablece y verá que la telemetría empieza a fluir de nuevo:

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)