Udostępnij za pośrednictwem


Samouczek: wdrażanie Azure Functions jako modułów IoT Edge

Applies to:IoT Edge 1.5 znacznik wyboru IoT Edge 1.5

Ważne

IoT Edge 1.5 LTS to wspierana wersja. IoT Edge 1.4 LTS osiągnął koniec życia 12 listopada 2024 r. Jeśli używasz wcześniejszej wersji, zobacz Update IoT Edge.

Użyj Azure Functions, aby wdrożyć kod, który uruchamia logikę biznesową bezpośrednio na urządzeniach Azure IoT Edge. W tym samouczku pokazano, jak utworzyć i wdrożyć Funkcję Azure, która filtruje dane z czujników na urządzeniu IoT Edge działającym w trybie symulacji. Użyj symulowanego urządzenia IoT Edge utworzonego w szybkich startach. Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Tworzenie funkcji Azure przy użyciu Visual Studio Code
  • Użyj Visual Studio Code i Docker, aby utworzyć obraz Docker i opublikować go w rejestrze kontenerów.
  • Wdrażanie modułu z rejestru kontenerów na urządzeniu IoT Edge
  • Wyświetlanie przefiltrowanych danych

Diagram przedstawiający architekturę funkcji, w tym sposób przygotowania i wdrożenia modułu funkcji.

Funkcja Azure utworzona w tym samouczku filtruje dane temperatury generowane przez urządzenie. Funkcja wysyła komunikaty nadrzędne tylko do Azure IoT Hub, gdy temperatura przekracza określony próg.

Jeśli nie masz konta Azure, przed rozpoczęciem utwórz konto free.

Wymagania wstępne

Przed rozpoczęciem tego samouczka wykonaj czynności opisane w samouczku, aby skonfigurować środowisko programistyczne na potrzeby tworzenia kontenerów systemu Linux: Tworzenie modułów Azure IoT Edge przy użyciu Visual Studio Code. Po zakończeniu obowiązują następujące wymagania wstępne:

Aby opracować moduł IoT Edge przy użyciu Azure Functions, zainstaluj następujące dodatkowe wymagania wstępne na maszynie deweloperów:

Utwórz projekt funkcji

Azure IoT Edge dla Visual Studio Code oferuje możliwości zarządzania oraz szablony kodu. W tej sekcji użyjesz Visual Studio Code do utworzenia rozwiązania IoT Edge z funkcją Azure.

Tworzenie nowego projektu

Wykonaj następujące kroki, aby utworzyć dostosowywalny szablon rozwiązania funkcji języka C#.

  1. Otwórz Visual Studio Code na komputerze deweloperskim.

  2. Otwórz paletę poleceń Visual Studio Code, wybierając pozycję View > Command Palette.

  3. W palecie poleceń dodaj i uruchom polecenie Azure IoT Edge: Nowe rozwiązanie IoT Edge. Postępuj zgodnie z następującymi monitami w palecie poleceń, aby utworzyć rozwiązanie:

    • Wybierz folder: wskaż lokalizację na komputerze deweloperskim, aby Visual Studio Code mógł utworzyć pliki rozwiązania.
    • Podaj nazwę rozwiązania: dodaj opisową nazwę rozwiązania, na przykład FunctionSolution, lub zaakceptuj wartość domyślną.
    • Wybierz szablon modułu: wybierz Azure Functions — C#.
    • Podaj nazwę modułu: nadaj modułowi nazwę CSharpFunction.
    • Podaj repozytorium obrazów platformy Docker dla modułu: repozytorium obrazów zawiera nazwę rejestru kontenerów i nazwę obrazu kontenera. Portal automatycznie wypełnia obraz kontenera na podstawie ostatniego kroku. Zastąp localhost:5000 wartością Login server z rejestru kontenerów Azure. Możesz pobrać serwer Login ze strony Overview rejestru kontenerów w portalu Azure. Ostatni ciąg wygląda następująco: <registry name>.azurecr.io/csharpfunction.

    Zrzut ekranu pokazujący, gdzie w Visual Studio Code wprowadzić nazwę repozytorium obrazu platformy Docker.

Dodaj swoje poświadczenia rejestru

Plik środowiska w rozwiązaniu przechowuje poświadczenia dla rejestru kontenerów i udostępnia je środowisku uruchomieniowemu IoT Edge. Środowisko uruchomieniowe wymaga tych poświadczeń, aby ściągnąć prywatne obrazy na urządzenie IoT Edge.

Rozszerzenie IoT Edge w programie Visual Studio Code próbuje ściągnąć poświadczenia rejestru kontenerów z Azure i wypełnić je w pliku środowiska. Sprawdź, czy poświadczenia znajdują się już w pliku. Jeśli nie, dodaj je teraz:

  1. W eksploratorze Visual Studio Code otwórz plik .env.
  2. Zaktualizuj pola przy użyciu username i password wartości skopiowanych z rejestru kontenerów Azure. Aby je znaleźć ponownie, przejdź do rejestru kontenerów w Azure i poszukaj strony Settings > Access keys.
  3. Zapisz ten plik.

Uwaga

W tym samouczku są używane poświadczenia logowania administratora dla Azure Container Registry, które są wygodne w scenariuszach programowania i testowania. W środowisku produkcyjnym należy użyć opcji uwierzytelniania o najniższych uprawnieniach, takich jak jednostki usługi. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do rejestru kontenerów.

Ustaw architekturę docelową na AMD64

moduły Azure Functions na IoT Edge są obsługiwane tylko w kontenerach opartych na systemie Linux AMD64. Domyślna architektura docelowa dla Visual Studio Code to Linux AMD64, ale w tym miejscu można ją jawnie ustawić na linux AMD64.

  1. Otwórz paletę poleceń i wyszukaj Azure IoT Edge: Ustaw domyślną platformę docelową rozwiązania edge.
  2. W palecie poleceń wybierz architekturę docelową AMD64 z listy opcji.

Aktualizowanie modułu przy użyciu kodu niestandardowego

Dodaj kod, aby moduł CSharpFunction przetwarzał komunikaty na krawędzi przed przekazaniem ich do IoT Hub.

  1. W eksploratorze Visual Studio Code otwórz modules > CSharpFunction > CSharpFunction.cs.

  2. Zastąp zawartość pliku CSharpFunction.cs następującym kodem. Ten kod odbiera dane telemetryczne dotyczące temperatury otoczenia i maszyny oraz przekazuje komunikat do IoT Hub tylko wtedy, gdy temperatura maszyny przekracza zdefiniowany próg.

    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. Zapisz plik.

Budowanie i wdrażanie rozwiązania IoT Edge

W poprzedniej sekcji utworzono rozwiązanie IoT Edge i zmieniono CSharpFunction, aby odfiltrować komunikaty z zgłoszonymi temperaturami maszyny poniżej akceptowalnego progu. Teraz skompiluj rozwiązanie jako obraz kontenera i wypchnij je do rejestru kontenerów.

  1. Otwórz zintegrowany terminal Visual Studio Code. Wybierz Wyświetl > Terminal.

  2. Zaloguj się do platformy Docker w terminalu. Użyj nazwy użytkownika, hasła i serwera uwierzytelniania z rejestru kontenerów Azure. Pobierz te wartości z sekcji Access keys rejestru w portalu Azure.

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

    Może zostać wyświetlone ostrzeżenie o zabezpieczeniach, które zaleca użycie polecenia --password-stdin. Chociaż najlepsze rozwiązanie jest zalecane w przypadku scenariuszy produkcyjnych, wykracza poza zakres tego samouczka. Aby uzyskać więcej informacji, zobacz odniesienie dotyczące docker login.

  3. W eksploratorze Visual Studio Code kliknij prawym przyciskiem myszy plik deployment.template.json, a następnie wybierz pozycję Build and Push IoT Edge Solution.

    Polecenie budowania i wypychania inicjuje trzy procesy. Najpierw tworzy nowy folder w rozwiązaniu o nazwie config , który ma pełny manifest wdrożenia, który jest tworzony na podstawie szablonu wdrożenia i innych plików rozwiązania. Po drugie, uruchamia docker build w celu zbudowania obrazu kontenera na podstawie odpowiedniego pliku Dockerfile dla architektury docelowej. Następnie zostanie uruchomione polecenie docker push, aby przesłać repozytorium obrazów do rejestru kontenerów.

    Ten proces może potrwać kilka minut po raz pierwszy, ale jest szybszy przy następnym uruchomieniu poleceń.

Wyświetlanie obrazu kontenera

Visual Studio Code wyświetla komunikat o powodzeniu podczas wypychania obrazu kontenera do rejestru kontenerów. Aby potwierdzić operację, wyświetl obraz w rejestrze.

  1. W portalu Azure przejdź do rejestru kontenerów Azure.
  2. Wybierz Repozytoria > usług.
  3. Na liście zostanie wyświetlone repozytorium csharpfunction . Wybierz to repozytorium, aby wyświetlić więcej szczegółów.
  4. W sekcji Tagi zostanie wyświetlony tag 0.0.1-amd64 . Ten tag przedstawia wersję i platformę utworzonego obrazu. Plik module.json w folderze CSharpFunction ustawia te wartości.

Wdrażanie i uruchamianie rozwiązania

Użyj portalu Azure, aby wdrożyć moduł Funkcji na urządzeniu IoT Edge, podobnie jak w szybkim starcie. Moduły można również wdrażać i monitorować z poziomu Visual Studio Code. W poniższych sekcjach użyto Azure IoT Edge i IoT Hub dla rozszerzeń Visual Studio Code wymienionych w wymaganiach wstępnych. Zainstaluj rozszerzenia teraz, jeśli jeszcze tego nie zrobiono.

  1. W eksploratorze Visual Studio Code, w sekcji Azure IoT Hub, rozwiń Urządzenia, aby wyświetlić listę urządzeń IoT.

  2. Kliknij prawym przyciskiem myszy nazwę urządzenia IoT Edge, a następnie wybierz pozycję Utwórz wdrożenie dla pojedynczego urządzenia.

  3. Przejdź do katalogu rozwiązania zawierającego CSharpFunction. Otwórz folder config, wybierz plik deployment.amd64.json, a następnie wybierz Manifest wdrożenia Edge.

  4. Pod swoim urządzeniem rozwiń węzeł Moduły, aby wyświetlić listę wdrożonych i uruchomionych modułów. Wybierz przycisk odświeżenia. Możesz zobaczyć, jak nowa CSharpFunction działa razem z modułem SimulatedTemperatureSensor, $edgeAgent i $edgeHub.

    Wyświetlenie nowych modułów może potrwać kilka minut. Urządzenie IoT Edge pobiera nowe informacje o wdrożeniu z IoT Hub, uruchamia nowe kontenery, a następnie zgłasza stan z powrotem do IoT Hub.

    Screenshot przedstawiający sposób wyświetlania wdrożonych modułów w Visual Studio Code.

Wyświetlanie wygenerowanych danych

Zobacz wszystkie komunikaty docierające do centrum IoT z urządzeń, uruchamiając Azure IoT Hub: Rozpocznij monitorowanie wbudowanego punktu końcowego zdarzeń w palecie poleceń. Aby zatrzymać monitorowanie komunikatów, uruchom polecenie Azure IoT Hub: Zatrzymaj monitorowanie wbudowanego punktu końcowego zdarzeń na palecie poleceń.

Aby filtrować widok i wyświetlać komunikaty z określonego urządzenia, kliknij prawym przyciskiem myszy urządzenie w Azure IoT Hub > Devices sekcji eksploratora Visual Studio Code i wybierz pozycję Start Monitoring Built-in Event Endpoint.

Czyszczenie zasobów

Jeśli planujesz przejść do następnego zalecanego artykułu, zachowaj utworzone zasoby i konfiguracje i użyj ich ponownie. Możesz również nadal używać tego samego urządzenia IoT Edge co urządzenie testowe.

W przeciwnym razie usuń konfigurację lokalną i zasoby Azure utworzone w tym artykule, aby uniknąć naliczania opłat.

Usuwanie zasobów Azure

Nie można cofnąć usuwania Azure zasobów i grup zasobów. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub niewłaściwej grupy zasobów. Jeśli utworzono IoT Hub wewnątrz istniejącej grupy zasobów zawierającej zasoby, które chcesz zachować, usuń tylko zasób IoT Hub, a nie grupę zasobów.

Aby usunąć zasoby:

  1. Zaloguj się do portalu Azure, a następnie wybierz pozycję Grupy zasobów.
  2. Wybierz nazwę grupy zasobów zawierającej zasoby testowe IoT Edge.
  3. Przejrzyj listę zasobów, które zawiera grupa zasobów. Jeśli chcesz usunąć je wszystkie, możesz wybrać pozycję Usuń grupę zasobów. Jeśli chcesz usunąć tylko niektóre z nich, wybierz każdy zasób, aby usunąć je indywidualnie.

Następne kroki

W tym samouczku utworzono moduł funkcji Azure z kodem umożliwiającym filtrowanie nieprzetworzonych danych generowanych przez urządzenie IoT Edge.

Przejdź do następnych samouczków, aby dowiedzieć się więcej o innych sposobach, które Azure IoT Edge mogą pomóc w przekształcaniu danych w szczegółowe informacje biznesowe na urządzeniach brzegowych.