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 que se envía a la aplicación de IoT Central, quiere filtrar los datos del dispositivo de IoT Edge.

Aquí, usará la ejecución de Azure Functions 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 de IoT Edge tendrá que descargar e instalar el módulo de Azure Functions personalizado 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. Decide usar Azure Container Registry (ACR) para almacenar el nuevo módulo. También usará ACR 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; los usará 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 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 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 Dispositivo perimetral del sensor ambiental - store-001 desde la página Dispositivos y seleccione Módulos.

  5. En la página Módulos, seleccione Administrar manifiesto > Asignar manifiesto de Edge. Seleccione el manifiesto Sensor ambiental.

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

Screenshot that shows the FilterFunction module running on the IoT Edge device.

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 tanto, debe actualizar la plantilla de dispositivo y las vistas:

  1. Vaya a Dispositivo perimetral del sensor ambiental en la página Plantillas de dispositivo.

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

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

Screenshot that shows the FilterFunction module added to the device template.

El nuevo módulo envía ahora la telemetría a IoT Central. A continuación, agregue al nuevo módulo de filtro una interfaz 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 … para ver esta opción.
  2. Elija el mosaico Importar una interfaz. Seleccione el archivo TelemetryInterfaceFilter.json que descargó anteriormente.

Puede quitar la interfaz de Telemetría original, ya que SimulatedTemperatureModule ya no envía telemetría directamente a IoT Central. La salida de este módulo se enruta al módulo FilterFunction mediante 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 Ver telemetría del dispositivo de IoT Edge para mostrar la telemetría que envía 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, luego, Guardar para guardar los cambios.
  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. Vaya al dispositivo store-001 en la página Dispositivos.

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

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

    Screenshot that shows telemetry plot with no average ambient temperature values less than 21.

Si el dispositivo parece dejar de enviar telemetría, es probable que sea porque el módulo SimulatedTemperatureSensor se ha detenido tras enviar 500 mensajes. Si reinicia la VM, 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)