Zelfstudie: Azure Functions implementeren als IoT Edge-modules

Van toepassing op:IoT Edge 1.5-vinkje IoT Edge 1.5 Vinkje voor IoT Edge 1.4 IoT Edge 1.4

Belangrijk

IoT Edge 1.5 LTS en IoT Edge 1.4 LTS worden ondersteund releases. IoT Edge 1.4 LTS eindigt op 12 november 2024. Raadpleeg IoT Edge bijwerken als u een eerdere versie hebt.

U kunt Azure-functies gebruiken voor het implementeren van code die uw bedrijfslogica rechtstreeks op uw Azure IoT Edge-apparaten implementeert. In deze zelfstudie leert u hoe u een Azure-functie maakt en implementeert die sensorgegevens op het gesimuleerde IoT Edge-apparaat filtert. U gebruikt het gesimuleerde IoT Edge-apparaat dat u in de quickstarts hebt gemaakt. In deze zelfstudie leert u het volgende:

  • Visual Studio Code gebruiken om een Azure-functie te maken.
  • Gebruik Visual Studio Code en Docker om een Docker-installatiekopieën te maken en deze te publiceren naar een containerregister.
  • De module vanuit het containerregister implementeren op uw IoT Edge-apparaat.
  • Gefilterde gegevens weergeven.

Diagram van functiearchitectuur, waarin wordt getoond hoe u een functiemodule kunt fasen en implementeren.

De Azure-functie die u maakt in deze zelfstudie filtert de temperatuurgegevens die door uw apparaat worden gegenereerd. De functie verzendt gegevens alleen upstream naar Azure IoT Hub wanneer de temperatuur boven een opgegeven drempelwaarde komt.

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Vereisten

Voordat u aan deze zelfstudie begint, moet u de zelfstudie uitvoeren om uw ontwikkelomgeving in te stellen voor het ontwikkelen van Linux-containers: Azure IoT Edge-modules ontwikkelen met behulp van Visual Studio Code. Als u die zelfstudie hebt voltooid, hebt u de volgende vereisten klaarstaan:

Als u een IoT Edge-module met Azure Functions wilt ontwikkelen, installeert u aanvullende vereisten op uw ontwikkelcomputer:

Een functieproject maken

Azure IoT Edge voor Visual Studio Code die u hebt geïnstalleerd in de vereisten, biedt beheermogelijkheden, evenals enkele codesjablonen. In deze sectie gebruikt u Visual Studio Code om een IoT Edge-oplossing te maken waarin een Azure-functie wordt gebruikt.

Een nieuw project maken

Volg deze stappen om een C#-functieoplossingssjabloon te maken die kan worden aangepast.

  1. Open Visual Studio Code op uw ontwikkelcomputer.

  2. Open het opdrachtenpalet van Visual Studio Code door opdrachtpalet weergeven>te selecteren.

  3. Voeg in het opdrachtenpalet de opdracht Azure IoT Edge toe en voer deze uit: nieuwe IoT Edge-oplossing. Volg deze aanwijzingen in het opdrachtpalet om uw oplossing te maken:

    • Selecteer een map: kies de locatie op uw ontwikkelcomputer voor Visual Studio Code om de oplossingsbestanden te maken.
    • Geef een oplossingsnaam op: voeg een beschrijvende naam toe voor uw oplossing, zoals FunctionSolution, of accepteer de standaardnaam.|
    • Selecteer een modulesjabloon: kies Azure Functions - C#.
    • Geef een modulenaam op | Geef uw module de naam CSharpFunction.
    • Geef een Opslagplaats voor Docker-installatiekopieën op voor de module. Een opslagplaats voor afbeeldingen bevat de naam van het containerregister en de naam van uw containerafbeelding. De containerinstallatiekopieën worden vooraf ingevuld in de laatste stap. Vervang localhost:5000 door de waarde van de aanmeldingsserver uit uw Azure-containerregister. U kunt de aanmeldingsserver ophalen op de overzichtspagina van uw containerregister in Azure Portal. De uiteindelijke tekenreeks ziet er ongeveer als volgt uit: <registernaam>.azurecr.io/csharpfunction.

    Schermopname die laat zien waar u de naam van uw Docker-installatiekopieënopslagplaats kunt toevoegen in Visual Studio Code.

Uw registerreferenties toevoegen

Het omgevingsbestand van uw oplossing slaat de referenties voor uw containerregister op en deelt deze met de IoT Edge-runtime. De runtime heeft deze referenties nodig om uw persoonlijke installatiekopieën naar uw IoT Edge-apparaat te halen.

De IoT Edge-extensie in Visual Studio Code probeert uw containerregisterreferenties op te halen uit Azure en deze in te vullen in het omgevingsbestand. Controleer of uw referenties zich al in het bestand bevinden. Als dat niet het geval is, voegt u ze nu toe:

  1. Open het .env bestand in visual Studio Code Explorer.
  2. Werk de velden gebruikersnaam en wachtwoord bij met de waarden die u hebt gekopieerd uit het Azure-containerregister. U kunt deze opnieuw vinden door naar uw containerregister in Azure te gaan en te kijken naar de pagina Instellingen> Access-sleutels.
  3. Sla dit bestand op.

Notitie

In deze zelfstudie worden aanmeldingsreferenties voor beheerders gebruikt voor Azure Container Registry, wat handig is voor ontwikkelings- en testscenario's. Wanneer u klaar bent voor productiescenario's, wordt u aangeraden een optie voor verificatie met minimale bevoegdheden, zoals service-principals. Zie Toegang tot uw containerregister beheren voor meer informatie.

Doelarchitectuur instellen op AMD64

Het uitvoeren van Azure Functions-modules op IoT Edge wordt alleen ondersteund in Op Linux AMD64 gebaseerde containers. De standaarddoelarchitectuur voor Visual Studio Code is Linux AMD64, maar we stellen deze hier expliciet in op Linux AMD64.

  1. Open het opdrachtenpalet en zoek naar Azure IoT Edge: Stel het standaarddoelplatform in voor de Edge-oplossing.

  2. Selecteer in het opdrachtpalet de AMD64-doelarchitectuur in de lijst met opties.

De module bijwerken met aangepaste code

We gaan extra code toevoegen, zodat de CSharpFunction-module de berichten aan de rand verwerkt voordat ze worden doorgestuurd naar IoT Hub.

  1. Open in Visual Studio Code Explorer modules>CSharpFunction>CSharpFunction.cs.

  2. Vervang de inhoud van het bestand CSharpFunction.cs door de volgende code. Deze code ontvangt telemetrie over omgevings- en machinetemperatuur en stuurt het bericht alleen door naar IoT Hub als de machinetemperatuur hoger is dan een opgegeven drempelwaarde.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.EdgeHub;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    
    namespace Functions.Samples
    {
        public static class CSharpFunction
        {
            [FunctionName("CSharpFunction")]
            public static async Task FilterMessageAndSendMessage(
                [EdgeHubTrigger("input1")] Message messageReceived,
                [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output,
                ILogger logger)
            {
                const int temperatureThreshold = 20;
                byte[] messageBytes = messageReceived.GetBytes();
                var messageString = System.Text.Encoding.UTF8.GetString(messageBytes);
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    logger.LogInformation("Info: Received one non-empty message");
                    // Get the body of the message and deserialize it.
                    var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
                    if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
                    {
                        // Send the message to the output as the temperature value is greater than the threshold.
                        using (var filteredMessage = new Message(messageBytes))
                        {
                             // Copy the properties of the original message into the new Message object.
                             foreach (KeyValuePair<string, string> prop in messageReceived.Properties)
                             {filteredMessage.Properties.Add(prop.Key, prop.Value);}
                             // Add a new property to the message to indicate it is an alert.
                             filteredMessage.Properties.Add("MessageType", "Alert");
                             // Send the message.
                             await output.AddAsync(filteredMessage);
                             logger.LogInformation("Info: Received and transferred a message with temperature above the threshold");
                        }
                    }
                }
            }
        }
        //Define the expected schema for the body of incoming messages.
        class MessageBody
        {
            public Machine machine {get; set;}
            public Ambient ambient {get; set;}
            public string timeCreated {get; set;}
        }
        class Machine
        {
            public double temperature {get; set;}
            public double pressure {get; set;}
        }
        class Ambient
        {
            public double temperature {get; set;}
            public int humidity {get; set;}
        }
    }
    
  3. Sla het bestand op.

Uw IoT Edge-oplossing bouwen en pushen

In de vorige sectie hebt u een IoT Edge-oplossing gemaakt en de CSharpFunction aangepast om berichten uit te filteren waarin de gemelde temperatuur van de machine onder de aanvaardbare drempelwaarde ligt. Nu moet u de oplossing bouwen als een containerinstallatiekopie en deze naar het containerregister pushen.

  1. Open de in Visual Studio Code geïntegreerde terminal door View>Terminal te selecteren.

  2. Meld u aan bij Docker door de volgende opdracht in de terminal in te voeren. Meld u aan met de gebruikersnaam, het wachtwoord en de aanmeldingsserver uit het Azure-containerregister. U kunt deze waarden ophalen in de sectie Toegangssleutels van het register in Azure Portal.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Mogelijk wordt een beveiligingswaarschuwing weergegeven waarin het gebruik van --password-stdin wordt aanbevolen. Hoewel dit wordt aanbevolen voor productiescenario's, valt het buiten het bereik van deze zelfstudie. Zie de documentatie voor aanmelding bij Docker voor meer informatie.

  3. Klik in de Visual Studio Code Explorer met de rechtermuisknop op het bestand deployment.template.json en selecteer Build and Push IoT Edge Solution.

    Met de opdracht voor bouwen en pushen worden drie bewerkingen gestart. Eerst wordt er een nieuwe map met de naam config in de oplossing gemaakt die het volledige implementatiemanifest bevat, die is gebouwd op basis van de informatie in de implementatiesjabloon en andere oplossingsbestanden. Daarna wordt docker build uitgevoerd om de containerinstallatiekopie te bouwen op basis van de juiste dockerfile voor uw doelarchitectuur. Vervolgens wordt docker push uitgevoerd om de opslagplaats van de installatiekopie naar het containerregister te pushen.

    Dit proces kan de eerste keer enkele minuten duren, maar de volgende keer dat u de opdrachten uitvoert, wordt het sneller uitgevoerd.

De containerinstallatiekopie weergeven

In Visual Studio Code wordt een succesbericht weergegeven wanneer de containerinstallatiekopie naar het containerregister is doorgezet. Als u zelf wilt bevestigen dat de bewerking is geslaagd, kunt u de installatiekopie in het register bekijken.

  1. Blader in de Azure-portal naar het Azure-containerregister.
  2. Selecteer Services-opslagplaatsen>.
  3. U zou nu de opslagplaats csharpfunction in de lijst moeten zien. Selecteer deze opslagplaats om meer details te bekijken.
  4. In de sectie Tags zou u de tag 0.0.1-amd64 moeten zien. Deze tag bevat de versie en het platform van de installatiekopie die u hebt gemaakt. Deze waarden zijn ingesteld in het bestand module.json in de map CSharpFunction.

De oplossing implementeren en uitvoeren

U kunt Azure Portal gebruiken om uw functiemodule te implementeren op een IoT Edge-apparaat, zoals u in de quickstart hebt gedaan. U kunt modules ook vanuit Visual Studio Code implementeren en bewaken. In de volgende secties worden De Azure IoT Edge en IoT Hub voor Visual Studio Code gebruikt die in de vereisten zijn vermeld. Installeer de extensies nu als u dat nog niet hebt gedaan.

  1. Vouw in de Visual Studio Code Explorer, onder de sectie Azure IoT Hub, de optie Apparaten uit om de lijst met IoT-apparaten weer te geven.

  2. Klik met de rechtermuisknop op de naam van het IoT Edge-apparaat en selecteer Implementatie voor één apparaat maken.

  3. Blader naar de oplossingsmap die de CSharpFunction bevat. Open de map config, selecteer het bestand deployment.amd64.json en kies Edge-distributiemanifest selecteren.

  4. Vouw onder uw apparaat Modules uit voor een lijst met de geïmplementeerde en actieve modules. Klik op de knop Vernieuwen. U ziet nu dat de nieuwe CSharpFunction wordt uitgevoerd, samen met de module SimulatedTemperatureSensor en de $edgeAgent en $edgeHub.

    Het kan even duren voordat de nieuwe modules worden weergegeven. Het IoT Edge-apparaat moet de nieuwe implementatiegegevens ophalen van IoT Hub, de nieuwe containers starten en de status weer melden bij IoT Hub.

    Schermopname van het weergeven van geïmplementeerde modules in Visual Studio Code.

De gegenereerde gegevens weergeven

U kunt alle berichten zien die vanaf al uw apparaten binnenkomen bij uw IoT-hub door Azure IoT Hub uit te voeren : Bewaking van ingebouwd gebeurteniseindpunt starten in het opdrachtenpalet. Als u het bewaken van berichten wilt stoppen, voert u de opdracht Azure IoT Hub uit: Stop Monitoring Built-in Event Endpoint in het opdrachtenpalet.

U kunt de weergave ook filteren om alle berichten te zien die bij de IoT-hub binnenkomen vanuit een specifiek apparaat. Klik met de rechtermuisknop op het apparaat in de sectie Azure IoT Hub-apparaten> van Visual Studio Code Explorer en selecteer Bewaking van ingebouwd gebeurteniseindpunt starten.

Resources opschonen

Als u van plan bent door te gaan met het volgende aanbevolen artikel, kunt u de resources en configuraties die u hebt gemaakt behouden en opnieuw gebruiken. U kunt ook hetzelfde IoT Edge-apparaat blijven gebruiken als een testapparaat.

Anders kunt u de lokale configuraties en Azure-resources die u in dit artikel hebt gemaakt, verwijderen om kosten te voorkomen.

Azure-resources verwijderen

Het verwijderen van de Azure-resources en resourcegroepen kan niet ongedaan worden gemaakt. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of resources verwijdert. Als u de IoT-hub in een bestaande resourcegroep hebt gemaakt met de resources die u wilt behouden, moet u alleen de IoT-hub zelf verwijderen en niet de resourcegroep.

Om de resources te verwijderen:

  1. Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.

  2. Selecteer de naam van de resourcegroep die uw IoT Edge-testresources bevat.

  3. Bekijk de lijst met resources die zich in de resourcegroep bevinden. Als u alle mappen wilt verwijderen, kunt u Resourcegroep verwijderen selecteren. Als u slechts een deel ervan wilt verwijderen, kunt u in elke resource afzonderlijk klikken om ze te verwijderen.

Volgende stappen

In deze zelfstudie hebt u een Azure-functiemodule gemaakt met code voor het filteren van onbewerkte gegevens die worden gegenereerd door uw IoT Edge-apparaat.

Ga verder met de volgende zelfstudies om te leren hoe Azure IoT Edge u verder kan helpen bij het omzetten van uw gegevens in bedrijfsinzichten.