Esercizio: Distribuire una funzione di Azure in IoT Edge

Completato

Filtrare i dati di telemetria inviati dal dispositivo.

Tenere presente che si vuole ridurre al minimo la quantità di dati inviati da ogni punto vendita. Per ridurre la quantità di dati di telemetria inviati all'applicazione IoT Central, si vuole filtrare i dati nel dispositivo IoT Edge.

In questa unità si userà Funzioni di Azure in esecuzione nel dispositivo IoT Edge per implementare un filtro. Il filtro garantisce che il dispositivo invii i dati di telemetria solo quando la temperatura ambiente è superiore a 21 °C.

Nota

Questo esercizio è facoltativo. Per completare questo esercizio, sarà necessario creare una sottoscrizione di Azure prima di iniziare. Se non si dispone di un account Azure o non si vuole crearne uno in questo momento, è possibile leggere le istruzioni per avere un'idea delle informazioni contenute.

Configurare un registro contenitori

Il dispositivo IoT Edge dovrà scaricare e installare il modulo Funzioni di Azure personalizzato che implementa il filtro. I moduli IoT Edge vengono inseriti come immagini compatibili con Docker che è possibile archiviare in un repository di contenitori. Si decide di usare il Registro Azure Container (ACR) per archiviare il nuovo modulo. Il Registro Azure Container verrà usato anche per creare il contenitore da un progetto di origine.

Eseguire i comandi seguenti per aggiungere un registro contenitori al gruppo di risorse in 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"

Prendere nota del nome del registro e dei valori password che verranno usati più avanti in questa unità.

Creare un progetto di Funzioni di Azure

Per implementare la funzione viene usato C#. Eseguire i comandi seguenti per installare il modello di progetto e quindi generare uno progetto scheletro:

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

Eseguire il comando seguente per sostituire il file FilterFunction.cs esistente con un'implementazione che filtra i dati di telemetria relativi alla temperatura del computer:

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

Creare l'immagine e caricarla nel registro contenitori. L'esecuzione di questo comando può richiedere alcuni minuti:

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

È possibile visualizzare l'elenco delle immagini presenti nel registro con il comando seguente:

az acr repository list --name $REGISTRY_NAME

Aggiornare il manifesto della distribuzione

Per usare il nuovo modulo di filtro nel dispositivo IoT Edge, aggiornare il manifesto della distribuzione con la nuova versione.

Scaricare il nuovo manifesto della distribuzione e la definizione dell'interfaccia nel computer locale facendo clic con il pulsante destro del mouse sui collegamenti seguenti e scegliendo Salva con nome:

Aprire il file EnvironmentalSensorManifestFilter-1-4.json in un editor di testo e aggiornarlo affinché usi il modulo di filtro proveniente dal registro contenitori:

  1. Sostituire le tre istanze di <YOUR CONTAINER REGISTRY NAME> con il nome del registro contenitori. Il nome è simile a edgecentral27912.
  2. Sostituire <YOUR CONTAINER REGISTRY PASSWORD> con la password di cui si è preso nota in precedenza in questa unità.
  3. Salvare le modifiche.

Questa versione del manifesto della distribuzione:

  • Aggiunge il modulo con la funzione di Azure creata:

    "filterfunction": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "<YOUR CONTAINER REGISTRY NAME>.azurecr.io/filterfunction:v1",
        "createOptions": ""
      }
    
  • Instrada l'output dal modulo SimulatedTemperatureSensor al modulo filterfunction prima di inviare i dati di telemetria filtrati all'applicazione IoT Central:

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

Per caricare il nuovo manifesto della distribuzione:

  1. Nell'applicazione IoT Central passare a Manifesti Edge e selezionare il manifesto del Sensore ambientale.

  2. Nella pagina Personalizza caricare il nuovo file EnvironmentalSensorManifestFilter-1-4.json. Selezionare Avanti.

  3. La pagina Revisione e fine mostra il nuovo modulo filterfunction. Seleziona Salva.

  4. Passare al Dispositivo Perimetrale Sensore ambientale - store-001 dalla pagina Dispositivi e selezionare Moduli.

  5. Nella pagina Moduli selezionare Gestisci manifesto > Assegna manifesto perimetrale. Selezionare il manifesto Sensore ambientale.

  6. L'elenco dei moduli include ora il modulo filterfunction in esecuzione:

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

Aggiornare il modello di dispositivo per l'uso del nuovo modulo

Il dispositivo IoT Edge invia ora i dati di telemetria tramite l'interfaccia filterfunction anziché l'interfaccia Telemetria. È quindi necessario aggiornare il modello e le visualizzazioni del dispositivo:

  1. Passare al Dispositivo Perimetrale Sensore ambientale nella pagina Modelli di dispositivo.

  2. Selezionare Moduli e quindi Importa moduli dal manifesto.

  3. Nella finestra di dialogo Importa moduli selezionare Sensore ambientale e quindi Importa.

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

Il nuovo modulo ora invia i dati di telemetria a IoT Central. Aggiungere quindi un'interfaccia al nuovo modulo di filtro che specifica i dati di telemetria e aggiornare il grafico:

  1. Selezionare Modulo FilterFunction, quindi + Aggiungi interfaccia ereditata. Potrebbe essere necessario selezionare ... per visualizzare questa opzione.
  2. Scegliere il riquadro Importa interfaccia. Selezionare il file TelemetryInterface.json scaricato in precedenza.

È possibile rimuovere l'interfaccia Telemetry originale poiché SimulatedTemperatureModule non invia più i dati di telemetria direttamente a IoT Central. L'output di questo modulo viene indirizzato al modulo FilterFunction dal runtime IoT Edge:

  1. Selezionare l'interfaccia Telemetry nel modulo SimulatedTemperatureSensor.
  2. Selezionare Elimina e quindi confermare l'operazione.

Modificare la visualizzazione Visualizza dati di telemetria dispositivo IoT Edge per visualizzare i dati di telemetria inviati dal modulo FilterFunction:

  1. Nel modello di dispositivo selezionare la visualizzazione Visualizza dati di telemetria dispositivo IoT Edge e quindi selezionare l'opzione Modifica nel riquadro del grafico.
  2. Aggiungere i valori di telemetria ambient/temperature, humidity, machine/temperature e pressure.
  3. Selezionare Aggiorna e quindi Salva per salvare le modifiche.
  4. Selezionare Pubblica per pubblicare la nuova versione del modello di dispositivo.

Controlla il tuo lavoro

Per visualizzare i dati di telemetria filtrati dal dispositivo IoT Edge:

  1. Passare al dispositivo store-001 nella pagina Dispositivi.

  2. Selezionare la visualizzazione Visualizza dati di telemetria dispositivo IoT Edge.

  3. È possibile visualizzare i dati di telemetria filtrati nel grafico. Non sono presenti valori con una temperatura ambientale media inferiore a 21,0 gradi.

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

Se il dispositivo sembra interrompere l'invio dei dati di telemetria, è probabile che il modulo SimulatedTemperatureSensor si sia arrestato dopo l'invio di 500 messaggi. Se si riavvia la macchina virtuale, il conteggio viene azzerato e i l'invio dei dati di telemetria viene ripreso:

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)