Delen via


Zelfstudie: Azure Functions implementeren als IoT Edge-modules

Van toepassing op:IoT Edge 1.5-vinkje IoT Edge 1.5

Belangrijk

IoT Edge 1.5 LTS is de ondersteunde release. IoT Edge 1.4 LTS is het einde van de levensduur vanaf 12 november 2024. Raadpleeg IoT Edge bijwerken als u een eerdere versie hebt.

Gebruik Azure Functions om code te implementeren waarmee uw bedrijfslogica rechtstreeks op uw Azure IoT Edge-apparaten wordt uitgevoerd. In deze zelfstudie leert u hoe u een Azure-functie maakt en implementeert waarmee sensorgegevens worden gefilterd op een gesimuleerd IoT Edge-apparaat. Gebruik 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
  • Visual Studio Code en Docker gebruiken om een Docker-image te maken en deze te publiceren in een containerregister.
  • De module vanuit het containerregister implementeren op uw IoT Edge-apparaat
  • Gefilterde gegevens weergeven

Diagram met functiearchitectuur, inclusief het fasen en implementeren van een functiemodule.

De Azure-functie die u in deze zelfstudie maakt, filtert temperatuurgegevens die door uw apparaat worden gegenereerd. De functie verzendt alleen berichten upstream naar Azure IoT Hub wanneer de temperatuur hoger is dan een opgegeven drempelwaarde.

Als u geen Azure-account hebt, maak dan een gratis account aan voordat u begint.

Vereisten

Voordat u met deze zelfstudie begint, volgt u de zelfstudie om uw ontwikkelomgeving in te stellen voor het ontwikkelen van Linux-containers: Azure IoT Edge-modules ontwikkelen met behulp van Visual Studio Code. Wanneer u klaar bent, hebt u de volgende vereisten:

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

Een functieproject maken

Azure IoT Edge voor Visual Studio Code biedt u beheermogelijkheden en codesjablonen. In deze sectie gebruikt u Visual Studio Code om een IoT Edge-oplossing te maken met een Azure-functie.

Een nieuw project maken

Volg deze stappen om een aanpasbare C#-functieoplossingssjabloon te maken.

  1. Open Visual Studio Code op uw ontwikkelcomputer.

  2. Open het opdrachtenpalet van Visual Studio Code door opdrachtpaletselecteren.

  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 in 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 inloggegevens 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 bij met de gebruikersnaam - en wachtwoordwaarden die u hebt gekopieerd uit uw Azure-containerregister. Als u ze opnieuw wilt vinden, gaat u naar uw containerregister in Azure en kijkt u op de paginaToegangssleutels>.
  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. Gebruik voor productie een verificatieoptie met minimale bevoegdheden, zoals service-principals. Zie Toegang tot uw containerregister beheren voor meer informatie.

Doelarchitectuur instellen op AMD64

Azure Functions-modules in IoT Edge worden alleen ondersteund in op Linux AMD64 gebaseerde containers. De standaarddoelarchitectuur voor Visual Studio Code is Linux AMD64, maar u stelt 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

Voeg code toe zodat uw CSharpFunction-module berichten aan de rand verwerkt voordat u ze doorstuurt naar IoT Hub.

  1. Open in Visual Studio Code Explorer modules>>

  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 temperatuur van de machine hoger is dan een gedefinieerde 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 gewijzigd om berichten met gerapporteerde machinetemperaturen onder de aanvaardbare drempelwaarde te filteren. Bouw nu de oplossing als een containerimage en stuur deze naar uw containerregister.

  1. Open de geïntegreerde Visual Studio Code-terminal. Selecteer Terminal weergeven>.

  2. Meld u aan bij Docker in de terminal. Gebruik de gebruikersnaam, het wachtwoord en de aanmeldingsserver uit uw Azure-containerregister. Haal deze waarden op uit de sectie Toegangssleutels van uw register in Azure Portal.

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

    U kunt een beveiligingswaarschuwing ontvangen 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 Visual Studio Code Explorer met de rechtermuisknop op het deployment.template.json-bestand en selecteer Vervolgens Build and Push IoT Edge Solution.

    Met de opdracht voor bouwen en pushen worden drie bewerkingen gestart. Eerst wordt er een nieuwe map gemaakt in de oplossing met de naam config die het volledige implementatiemanifest heeft, dat is gebouwd op basis van de implementatiesjabloon en andere oplossingsbestanden. Ten tweede wordt docker build uitgevoerd om de containerafbeelding 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 enkele minuten duren, maar het is sneller wanneer u de opdrachten de volgende keer uitvoert.

De containerinstallatiekopie weergeven

Visual Studio Code toont een succesbericht wanneer uw containerafbeeldingen naar uw containerregister worden gepusht. Om de bewerking te bevestigen, bekijkt u de afbeelding in het register.

  1. Ga in Azure Portal naar uw Azure-containerregister.
  2. Selecteer Services-opslagplaatsen>.
  3. U ziet de csharpfunction-opslagplaats in de lijst. Selecteer deze opslagplaats om meer details weer te geven.
  4. In de sectie Tags ziet u de tag 0.0.1-amd64 . Deze tag toont de versie en het platform van de image die u hebt gemaakt. Deze waarden worden ingesteld in het module.json-bestand in de map CSharpFunction .

De oplossing implementeren en uitvoeren

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

  1. Vouw in visual Studio Code Explorer, onder de sectie Azure IoT Hub , 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. Ga naar de oplossingsmap met de CSharpFunction. 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. Selecteer de knop Vernieuwen. U ziet dat de nieuwe CSharpFunction wordt uitgevoerd, samen met de module SimulatedTemperatureSensor , $edgeAgent en $edgeHub.

    Het kan even duren voordat de nieuwe modules worden weergegeven. Het IoT Edge-apparaat haalt de nieuwe implementatiegegevens op uit IoT Hub, start de nieuwe containers en rapporteert vervolgens de status terug naar IoT Hub.

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

De gegenereerde gegevens weergeven

Bekijk alle berichten die vanaf uw Apparaten binnenkomen bij uw IoT-hub door Azure IoT Hub uit te voeren: Start Bewaking van ingebouwd gebeurteniseindpunt in het opdrachtenpalet. Als u het bewaken van berichten wilt stoppen, voert u Azure IoT Hub uit: Stop Monitoring Built-in Event Endpoint in het opdrachtenpalet.

Als u de weergave wilt filteren en berichten van een specifiek apparaat wilt bekijken, klikt u met de rechtermuisknop op het apparaat in de sectie Azure IoT> van Visual Studio Code Explorer en selecteert u Bewaking van ingebouwd gebeurteniseindpunt starten.

Resources opschonen

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

Verwijder anders de lokale configuraties en de Azure-resources die u in dit artikel hebt gemaakt 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 hebt gemaakt in een bestaande resourcegroep met resources die u wilt behouden, verwijdert u alleen de IoT Hub-resource zelf, 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 uw resourcegroep bevat. Als u alle mappen wilt verwijderen, kunt u Resourcegroep verwijderen selecteren. Als u slechts enkele resources wilt verwijderen, kunt u elke resource selecteren om ze afzonderlijk 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.